zoukankan      html  css  js  c++  java
  • Android打包之Ant打入第三方jar包及zipalign对齐优化

    Android打包之将bat脚本转换成ant脚本》实现了ant打包,只是需要打入第三方jar包时,需要对其中的compie和dex部分进行修改,下面是实现的ant脚本。

    build.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project
        name="AntDemo"
        default="release" >
    
        <property
            name="sdk-folder"
            value="D:android-sdk-windows" />
    
        <property
            name="platform-folder"
            value="${sdk-folder}platformsandroid-8" />
    
        <property
            name="platform-tools-folder"
            value="${sdk-folder}platform-tools" />
    
        <property
            name="jdk-folder"
            value="D:Program Files (x86)Javajdk1.6.0_45" />
    
        <!-- tools -->
    
        <property
            name="android-jar"
            value="${platform-folder}android.jar" />
    
        <property
            name="tools.aapt"
            value="${platform-tools-folder}aapt.exe" />
    
        <property
            name="tools.javac"
            value="${jdk-folder}injavac.exe" />
    
        <property
            name="tools.dx"
            value="${platform-tools-folder}dx.bat" />
    
        <property
            name="tools.apkbuilder"
            value="${sdk-folder}	oolsapkbuilder.bat" />
    
        <property
            name="tools.zipalign"
            value="${sdk-folder}	oolszipalign.exe" />
    
        <property
            name="tools.jarsigner"
            value="${jdk-folder}injarsigner.exe" />
    
        <!-- dir -->
    
        <property
            name="project-dir"
            value="G:CodeAndroidWorkspaceAntDemo" />
    
        <property
            name="res"
            value="${project-dir}
    es" />
    
        <property
            name="gen"
            value="${project-dir}gen" />
    
        <property
            name="src"
            value="${project-dir}src" />
    
        <property
            name="bin"
            value="${project-dir}in" />
    
        <property
            name="assets"
            value="${project-dir}assets" />
    
        <property
            name="libs"
            value="${project-dir}libs" />
    
        <!-- files -->
    
        <property
            name="manifest"
            value="${project-dir}AndroidManifest.xml" />
    
        <property
            name="java-file-gen"
            value="${gen}comexampleantdemo*.java" />
    
        <property
            name="java-file-src"
            value="${src}comexampleantdemo*.java" />
    
        <property
            name="dex-name"
            value="${bin}classes.dex" />
    
        <property
            name="pakcage-temp-name"
            value="${bin}${ant.project.name}" />
    
        <property
            name="unsigned-apk-name"
            value="${ant.project.name}_unsigned.apk" />
    
        <property
            name="unsigned-apk-path"
            value="${bin}${unsigned-apk-name}" />
    
        <property
            name="signed-apk-name"
            value="${ant.project.name}_signed.apk" />
    
        <property
            name="signed-apk-path"
            value="${bin}${signed-apk-name}" />
    
        <property
            name="zipalign-apk-name"
            value="${ant.project.name}.apk" />
    
        <property
            name="zipalign-apk-path"
            value="${bin}${zipalign-apk-name}" />
    
        <property
            name="keystore-name"
            value="${project-dir}my.keystore" />
    
        <property
            name="keystore-alias"
            value="ant_test" />
    
        <!-- task -->
    
        <target name="init" >
    
            <echo>
    Initialize...
    
    
    
    
    
    
    
    
    
    
    
            </echo>
    
            <delete dir="${bin}" />
    
            <mkdir dir="${bin}" />
        </target>
    
        <target
            name="gen-R"
            depends="init" >
    
            <echo>
    Generating R.java from the resources... 
    
    
            </echo>
    
            <exec
                executable="${tools.aapt}"
                failonerror="true" >
    
                <arg value="package" />
    
                <arg value="-f" />
    
                <arg value="-m" />
    
                <arg value="-J" />
    
                <arg value="${gen}" />
    
                <arg value="-S" />
    
                <arg value="${res}" />
    
                <arg value="-M" />
    
                <arg value="${manifest}" />
    
                <arg value="-I" />
    
                <arg value="${android-jar}" />
            </exec>
        </target>
    
        <target
            name="compile"
            depends="gen-R" >
    
            <echo>
    Compile...
    
    
    
            </echo>
    
            <javac
                bootclasspath="${android-jar}"
                compiler="javac1.6"
                destdir="${bin}"
                encoding="utf-8"
                includeAntRuntime="true"
                listfiles="true"
                target="1.6" >
    
                <src path="${project-dir}" />
    
                <classpath>
    
                    <fileset
                        dir="${libs}"
                        includes="*.jar" />
                    <!-- 引用第三方jar包需要引用,用于辅助编译,并没有将jar打包进去。jar的打包在dex命令中。 -->
                </classpath>
            </javac>
        </target>
    
        <target
            name="dex"
            depends="compile" >
    
            <echo>
    Generate dex...
    
    
    
            </echo>
    
            <exec
                executable="${tools.dx}"
                failonerror="true" >
    
                <arg value="--dex" />
    
                <arg value="--output=${dex-name}" />
    
                <arg value="${bin}" />
                <!-- classes文件位置 -->
    
                <arg value="${libs}" />
                <!-- 把libs下所有jar打包 -->
            </exec>
        </target>
    
        <target
            name="package"
            depends="dex" >
    
            <echo>
       Package resource and assets...
    
    
    
    
    
    
    
    
    
            </echo>
    
            <exec
                executable="${tools.aapt}"
                failonerror="true" >
    
                <arg value="package" />
    
                <arg value="-f" />
    
                <arg value="-A" />
    
                <arg value="${assets}" />
    
                <arg value="-S" />
    
                <arg value="${res}" />
    
                <arg value="-I" />
    
                <arg value="${android-jar}" />
    
                <arg value="-M" />
    
                <arg value="${manifest}" />
    
                <arg value="-F" />
    
                <arg value="${pakcage-temp-name}" />
            </exec>
        </target>
    
        <target
            name="build-unsigned-apk"
            depends="package" >
    
            <echo>
      Build unsigned apk
    
    
    
    
    
    
    
    
    
            </echo>
    
            <exec
                executable="${tools.apkbuilder}"
                failonerror="true" >
    
                <arg value="${unsigned-apk-path}" />
    
                <arg value="-v" />
    
                <arg value="-u" />
    
                <arg value="-z" />
    
                <arg value="${pakcage-temp-name}" />
    
                <arg value="-f" />
    
                <arg value="${dex-name}" />
    
                <arg value="-rf" />
    
                <arg value="${src}" />
            </exec>
        </target>
    
        <target
            name="sign-apk"
            depends="build-unsigned-apk" >
    
            <echo>
      Sign apk
    
    
            </echo>
    
            <exec
                executable="${tools.jarsigner}"
                failonerror="true" >
    
                <arg value="-keystore" />
    
                <arg value="${keystore-name}" />
    
                <arg value="-storepass" />
    
                <arg value="123456" />
    
                <arg value="-keypass" />
    
                <arg value="123456" />
    
                <arg value="-signedjar" />
    
                <arg value="${signed-apk-path}" />
    
                <arg value="${unsigned-apk-path}" />
    
                <arg value="${keystore-alias}" />
            </exec>
        </target>
    
        <target
            name="zipalign"
            depends="sign-apk" >
    
            <echo>
    Zipalign...
    
            </echo>
    
            <exec
                executable="${tools.zipalign}"
                failonerror="true" >
    
                <arg value="-v" />
    
                <arg value="4" />
    
                <arg value="${signed-apk-path}" />
    
                <arg value="${zipalign-apk-path}" />
            </exec>
        </target>
    
        <target
            name="release"
            depends="zipalign" >
    
            <delete file="${pakcage-temp-name}" />
    
            <delete file="${unsigned-apk-path}" />
    
            <delete file="${signed-apk-path}" />
    
            <echo>
    APK is released. path:${zipalign-apk-path}
    
    
            </echo>
        </target>
    
    </project>


    注:

    1、compile部分的classpath所引用的jar包是为了辅助编译的,并没有将jar打包进去。dex部分最后的一个参数${libs}才是真正将第三方jar包打包进去的部分,即将其打包到classes.dex中。

    2、compile中的compiler是特别指定所用的javac,listfiles为true是显示编译过程中编译的文件。

    3、includeAntRuntime:其作用是指定编译任务是否包含ant的classpath,在Ant1.8版以后如果没有设置该选项会弹出警告“warning: ‘includeantruntime’ was not set”。在Ant 总会把它自己的 runtime包含进对 javac 任务可见的 classpath中。因此,任何与Ant有关的库都会自动进入你的构建类路径,不管你是否需要它们。这对大部分人来说可能是没必要的,因此,新的Ant版本提供了这个选项。新版本不提供默认值是为了保证早期构建文件的可移植性,即在不同Ant版本下,构建文件都能保持一致的行为

    4、src相当于javac中的srcdir。src可以是多个。

    5、zipalign进行4字节对齐的优化。具体的可以参看此文《简单优化:Zipalign

    源码下载

  • 相关阅读:
    golang API开发过程的中的自动重启(基于gin框架)
    单位时间的调度问题 —— 贪心
    Qt获取文件夹下文件
    C++ using
    QGridLayout动态添加控件
    数据库查询优化-20条必备sql优化技巧
    Django:类视图的装饰器
    使用同一个模态框进行新增和修改
    Django:使用celery处理异步任务
    jenkins:调用jenkinsAPI
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7605019.html
Copyright © 2011-2022 走看看