问题背景:我们的游戏工程要移植到某渠道,该渠道有自己的计费和登录方式,提供给我们了一个android sdk工程,该工程中只有res,src是一个jar包。
思路由来:使用eclipse工程打包,解压apk,查看里面的class.dex,resource.arsc文件,看看都有什么内容,再自己写脚本实现相同的处理。
普通的android工程ant打包网上的资源已经很泛滥了,我在这里不再赘述。拣重点来说,
1. 合并第三方library和自己工程的res文件,一般的渠道商的library中的文件都会以自己渠道名作为开头,这是非常好的习惯,因为我们不能使两个工程中含有相同的文件,而对于strings、style这些相同文件名的合并,需要把里面对应的内容进行合并。这个合并后的res文件才是我们最终要用的
2. 使用aapt工具生成两个R文件。一个R文件在自己工程的package路径下,另一个R文件是第三方工程的package路径下。方法:使用两次aapt工具,两次package的路径分别从两个工程的AndroidManifest.xml中获得。
3. 使用aapt工具生成resource资源的时候,一定记得-s 的是合并之后的res,否则程序运行过程中会报找不到对应的文件的错误
这样第三方工程的资源就被打到apk文件中了。对于代码资源jar的添加,包括两处处理。
1. 在编译时,添加第三方jar包,否则编译不过去
2. 在生成dex时,使用工具dx时,把jar的路径添加进去,这样jar就被打进了dex中。至此就完成了第三方jar包的添加。
说明:
${sdk.dir} :android sdk 的路径,自己指定自己的位置
${lib-dir} :自己工程下面放第三方jar的libs路径
${outdir-gen} :工程src路径
${resource-all-res-dir} :合并后的res路径
${library-dir} :第三方工程路径
${projecthomedir} :自己工程的路径
<?xml version="1.0" encoding="GB18030"?>
<span style="BACKGROUND-COLOR: rgb(204,204,204)">2.生成两个R文件,R文件的包的路径不同:</span>
<span style="BACKGROUND-COLOR: rgb(204,0,0)"></span><pre class="html" name="code"><target name="GenRJAVA">
<echo>Generating R.java / Manifest.java from the resources...</echo>
<mkdir dir="${outdir-gen}" />
<echo><span style="font-size:18px;color:#990000;FONT-WEIGHT: bold">从自己工程的AndroidManifest.xml得到R的路径 生成R文件</span></echo>
<exec executable="${TOOLS_AAPT}" failonerror="true">
<arg value="package" />
<arg value="-m" />
<arg value="-J" />
<arg value="${outdir-gen}" />
<arg value="-M" />
<arg value="${projecthomedir}/AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-all-res-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="${lib-dir}" />
<echo><span style="font-size:18px;color:#990000;FONT-WEIGHT: bold">从第三方工程的AndroidManifest.xml得到R的路径 生成R文件</span></echo>
</exec><exec executable="${TOOLS_AAPT}" failonerror="true"><
arg value="package" />
<arg value="-m" />
<arg value="-J" />
<arg value="${outdir-gen}" />
<arg value="-M" />
<arg value="<span style="BACKGROUND-COLOR: rgb(0,153,0)">${library-dir}/AndroidManifest.xml</span>" />
<arg value="-S" />
<arg value="<span style="font-size:18px;color:#006600;FONT-WEIGHT: bold">${resource-all-res-dir}</span>" />
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="${lib-dir}" />
</exec>
</target></pre><br>
<br>
<pre style="font-size:18px; font-weight:bold"></pre>
<p style="font-size:18px; font-weight:bold"></p>
<pre style="font-size:18px; font-weight:bold"></pre>
3.<span style="font-size:18px"><span style="background-color:rgb(204,204,204)"><strong>将.aidl文件生成.java类文件</strong></span></span>
<p style="font-size:18px; font-weight:bold"></p>
<p style="font-size:18px; font-weight:bold"><span style="background-color:rgb(204,0,0)"></span></p>
<pre style="FONT-SIZE: 18px; FONT-WEIGHT: bold" class="html" name="code"><target name="aidl">
<echo>Compiling aidl files into Java classes...</echo>
<apply executable="${TOOLS_AIDL}" failonerror="true">
<arg value="-p${sdk.dir}" />
<arg value="-I${srcdir}" />
<fileset dir="${srcdir}">
<include name="**/*.aidl" />
</fileset>
</apply>
</target></pre><br>
<span style="font-size:18px"><span style="background-color:rgb(204,204,204)"><strong>4.编译java文件</strong></span></span>
<p style="font-size:18px; font-weight:bold"></p>
<p style="font-size:18px; font-weight:bold"></p>
<pre style="FONT-SIZE: 18px; FONT-WEIGHT: bold" class="html" name="code"><!-- Compile this project's .java files into .class files. -->
<target name="compile" depends="GenRJAVA, aidl">
<mkdir dir="${outdir-classes}" />
<javac executable="${Javacpath}" fork="true"debug="false" extdirs="" srcdir="${outdir-gen}" destdir="${outdir-classes}">
<classpath refid="lib_classpath"/>
</javac>
</target></pre>
<p><span style="background-color:rgb(204,204,204)">5.混淆</span></p>
<pre style="FONT-SIZE: 18px; FONT-WEIGHT: bold" class="html" name="code"><span style="BACKGROUND-COLOR: rgb(204,0,0)"></span><pre class="html" name="code"></pre><pre class="html" name="code"></pre><pre class="html" name="code"><!--Execute proguard class flies-->
<target name="proguard" depends="compile">
<jar basedir="${outdir-classes}" destfile="temp.jar"/>
<java jar="${proguard-home}/proguard.jar" fork="true" failonerror="true">
<jvmarg value="-Dmaximum.inlined.code.length=32"/>
<arg value="-injars temp.jar"/>
<arg value="-outjars optimized.jar"/>
<arg value="-libraryjars ${android-jar}"/>
<arg value="-libraryjars ${lib-dir}/第三方jar"/>
<arg value="-dontpreverify"/>
<arg value="-dontoptimize"/>
<arg value="-dontusemixedcaseclassnames"/>
<arg value="-repackageclasses ''"/>
<arg value="-allowaccessmodification"/>
<arg value="-keep public class * extends android.app.Activity"/>
<arg value="-keep public class * extends android.content.ContentProvider"/>
<arg value="-keep public class * extends android.view.View"/>
<arg value="-keep public class * extends javax.microedition.midlet.MIDlet"/>
<arg value="-keep public class * extends android.preference.Preference"/>
<arg value="-optimizationpasses 7"/>
<arg value="-verbose"/>
<arg value="-dontskipnonpubliclibraryclasses"/>
<arg value="-dontskipnonpubliclibraryclassmembers"/>
</java>
<delete file="temp.jar"/>
<delete dir="${outdir-classes}"/>
<mkdir dir="${outdir-classes}"/>
<unzip src="optimized.jar" dest="${outdir-classes}"/>
<delete file="optimized.jar"/>
</target>
<!--end proguard class files--></pre><br>
<span style="background-color:rgb(204,204,204)">6.生成dex,把jar文件包含进去</span>
<pre></pre>
<pre style="FONT-SIZE: 18px; FONT-WEIGHT: bold" class="html" name="code"><pre style="FONT-SIZE: 18px; FONT-WEIGHT: bold" class="html" name="code"><pre class="html" name="code"><!-- Convert this project's .class files into .dex files. -->
<target name="dex" depends="compile">
<echo>Converting compiled files and external libraries into ${outdir-dx}\test.dex...</echo>
<mkdir dir="${outdir-dx}" />
<apply executable="${TOOLS_DX}" failonerror="true" parallel="true">
<arg value="--dex" />
<arg value="--output=${basedir}/dx/test.dex" />
<arg path="${outdir-classes}" />
<fileset dir="${projecthomedir}" includes="*.jar" />
<arg path="${lib-dir}" />
</apply>
</target></pre><br>
<br>
<pre></pre>
7.<span style="background-color:rgb(204,204,204)">打包res</span><pre class="html" name="code"><!-- Put the project's resources into the output package file. -->
<target name="package-res">
<echo>Packaging resources and assets...</echo>
<mkdir dir="${apkdir}" />
<exec executable="${TOOLS_AAPT}" failonerror="true">
<arg value="package" />
<arg value="-f" />
<arg value="-M" />
<arg value="${projecthomedir}/AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-all-res-dir}" />
<arg value="-A" />
<arg value="${asset-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="-F" />
<arg value="${resources-package}" />
</exec>
</target></pre><br>
8.<span style="background-color:rgb(204,204,204)">打包apk</span><br>
<pre class="html" name="code"><target name="packageAPK" depends="dex, package-res">
<echo>Packaging apk for release...</echo>
<exec executable="${TOOLS_APKBUILDER}" failonerror="true">
<arg value="${basedir}/apk/${unsignedapkname}" />
<arg value="-u" />
<arg value="-z" />
<arg value="${basedir}/respak" />
<arg value="-f" />
<arg value="${basedir}/dx/test.dex" />
<arg value="-rf" />
<arg value="${basedir}/src" />
<arg value="-rj" />
<arg value="${basedir}/src" />
</exec>
<echo>It will need to be signed with jarsigner before being published.</echo>
</target></pre><br>
9.<span style="background-color:rgb(204,204,204)">签名apk</span><br>
<pre class="html" name="code"><target name="signAPK" depends="packageAPK">
<echo>Packaging ${out-unsigned-package} for release...</echo>
<signjar
jar="${basedir}/apk/${unsignedapkname}"
signedjar="${basedir}/apk/${apkname}"
keystore="******"
storepass="******"
alias="alias"
keypass="******"
verbose="-verbose" />
</target>
</project></pre><br>
<br>
</pre>