android ant 打包

问题背景:我们的游戏工程要移植到某渠道,该渠道有自己的计费和登录方式,提供给我们了一个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"?>
<project name="AntTask" basedir="." default="signAPK">
        <path id="android.antlibs">
        <pathelement path="${sdk.dir}/tools/lib/anttasks.jar" />
        <pathelement path="${sdk.dir}/tools/lib/sdklib.jar" />
        <pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" />
    </path>

    <path id="project.classpath">
        <pathelement location="${android-jar}" />
    </path>
    <path id="lib_classpath">
        <pathelement location="bin"/>
        <pathelement location="${android-jar}" />
        <fileset dir="${lib-dir}">
            <span style="color:#009900;"><include name="第三方jar.jar"/></span>
        </fileset>  
    </path>
    <taskdef name="setup" classname="com.android.ant.SetupTask" classpathref="android.antlibs"/>
    <setup/>


<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>


你可能感兴趣的:(android ant 打包)