• 使用ant自动编译、打包生成apk文件




        上次使用命令行生成apk文件《Android 命令行编译、打包生成apk文件》,学习命令行生成的目的是为了编写ant打下基础。


    一、 ant环境

    下载ant包,配置环境变量


    二、ant编译Android项目

    1. 生成R文件
    2. Java代码生成class文件
    3. class文件生成dex文件
    4. 打包资源
    5. 生成apk
    6 . 签名apk



    1. aapt命令, 生成R文件
    [plain]  view plain copy print ?
     
    1. > aapt package -f -m -J ./gen -S res -M AndroidManifest.xml -I D:android.jar  

    -f 如果编译生成的文件已经存在,强制覆盖。
    -m 使生成的包的目录存放在-J参数指定的目录
    -J 指定生成的R.java 的输出目录路径
    -S 指定res文件夹的路径
    -I 指定某个版本平台的android.jar文件的路径
    -A 指定assert文件夹的路径

    转换为ant为:
              <exec executable="aapt">
                  <arg value="package" />
                  <arg value="-m" />
                  <arg value="-J" />
                  <arg value="gen" />
                  <arg value="-S" />
                  <arg value="res" />
                  <arg value="-M" />
                  <arg value="AndroidManifest.xml" />
                  <arg value="-I" />
                  <arg value="${android-jar}" />
                  <arg value="--auto-add-overlay" /> <!-- 覆盖资源 -->
              </exec>




    2. javac命令,生成class文件
    [plain]  view plain copy print ?
     
    1. > javac -target 1.5 -bootclasspath D:android-sdk-windowsplatformsandroid-8android.jar -d bin srcdemoproject*.java gendemoprojectR.java  

      -target <版本>               生成特定 VM 版本的类文件
      -bootclasspath <路径>        覆盖引导类文件的位置
      -d <目录>                    指定存放生成的类文件的位置
      -sourcepath <路径>           指定查找输入源文件的位置


    转换为ant为:

              <javac  target="1.5" destdir="bin/classes" bootclasspath="${android-jar}">
                  <src path="src" />
                  <src path="gen" />
              </javac>


    3. dx 命令,把class文件转换为.dex文件

    [plain]  view plain copy print ?
     
    1. > dx --dex --output=D:ProjectDemoinclasses.dex D:ProjectDemoin  

    --output=<要生成的classes.dex路径> <要处理的class文件的路径>


    转换为ant为:

              <exec executable="dx.bat" failonerror="true"> 
                   <arg value="--dex" /> 
                   <arg value="--output=${project-dir}inclasses.dex" /> 
                <arg path="${project-dir}inclasses" />
              </exec> 


    4. aapt命令,打包资源
    [plain]  view plain copy print ?
     
    1. > aapt package -f -M AndroidManifest.xml -S res -I D:android-sdk-windowsplatformsandroid-8android.jar -F bin esources.ap_  

    -f 如果编译生成的文件已经存在,强制覆盖
    -M 指定AndroidManifest.xml的路径
    -S 指定res文件夹路径
    -I 指定某个版本平台的android.jar的路径
    -F 指定输出文件完整路径

    转换为ant为:

              <exec executable="aapt">
                   <arg value="package" />
                   <arg value="-f" />
                   <arg value="-M" />
                   <arg value="AndroidManifest.xml" />
                   <arg value="-S" />
                   <arg value="res" />
                   <arg value="-A" />
                   <arg value="assets" />
                   <arg value="-I" />
                   <arg value="${android-jar}" />
                   <arg value="-F" />
                   <arg value="bin
    esources.ap_" />
                   <arg value="--auto-add-overlay" />
              </exec>


    5. apkbuilder命令,生成apk
    [plain]  view plain copy print ?
     
    1. apkbuilder D:ProjectDemoinprojectdemo.apk -v -u -z D:ProjectDemoin esources.ap_ -f D:ProjectDemoinclasses.dex -rf D:ProjectDemosrc  

    -v Verbose 显示过程信息
    -u 创建一个无签名的包
    -z 指定apk资源路径
    -f 指定dex文件路径
    -rf 指定源码路径

    转换为ant为:

              <exec executable="apkbuilder.bat">
                   <arg value="${project-dir}inunsigned.apk" />
                   <arg value="-u" />
                   <arg value="-z" />
                   <arg value="${project-dir}in
    esources.ap_" />
                   <arg value="-f" />
                   <arg value="${project-dir}inclasses.dex" />
              </exec>


    6. 签名

    [plain]  view plain copy print ?
     
    1. jarsigner  -verbose -keystore C:UsersUserNameDesktopuild elease.keystore -storepass antPassword -keypass antPassword -signedjar D:ProjectDemoinprojectdemo-signed.apk D:ProjectDemoinprojectdemo.apk release  


    -verbose  签名/验证时输出详细信息
    -keystore 密钥库位置
    -storepass          用于密钥库完整性的口令
    -keypass            专用密钥的口令(如果不同)
    -signedjar          已签名的 JAR 文件的名称 (第一个apk是签名之后的文件, 第二个apk是需要签名的文件)


    转换为ant为:

              <exec executable="jarsigner">
                   <arg value="-keystore" />
                   <arg value="${project-dir}
    elease.keystore" />
                   <arg value="-storepass" />
                   <arg value="antPassword" />
                   <arg value="-keypass" />
                   <arg value="antPassword" />
                   <arg value="-signedjar" />
                   <arg value="${project-dir}insigned.apk" />
                   <arg value="${project-dir}inunsigned.apk" />
                   <arg value="release" />
              </exec>


    三、完整build.xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <project default="main">
    
         <property name="android-jar" value="D:android-sdk-windowsplatformsandroid-8android.jar" />
         <property name="project-dir" value="D:ProjectDemo" />
    
         <target name="init">
            <echo>start initing ... </echo>
    
            <mkdir dir="gen" />
            <delete>
                <fileset dir="gen"></fileset>
            </delete>
            
            <mkdir dir="bin/classes" />
            <delete>
                <fileset dir="bin/classes"></fileset>
            </delete>
    
            <echo>finish initing. </echo>
        </target>
        
        <target name="main" depends="init">
            <echo>generating R.java for project to dir gen (using aapt) ... </echo>
              <exec executable="aapt">
                  <arg value="package" />
                  <arg value="-m" />
                  <arg value="-J" />
                  <arg value="gen" />
                  <arg value="-S" />
                  <arg value="res" />
                  <arg value="-M" />
                  <arg value="AndroidManifest.xml" />
                  <arg value="-I" />
                  <arg value="${android-jar}" />
                  <arg value="--auto-add-overlay" /> <!-- 覆盖资源 -->
              </exec>
    
              <javac  target="1.5" destdir="bin/classes" bootclasspath="${android-jar}">
                  <src path="src" />
                  <src path="gen" />
              </javac>
             
           
             
              <echo>packaging class files (include the third-party jars) to calsses.dex ... </echo>
              <exec executable="dx.bat" failonerror="true"> 
                   <arg value="--dex" /> 
                   <arg value="--output=${project-dir}inclasses.dex" /> 
                <arg path="${project-dir}inclasses" />
              </exec> 
             
             
              <echo>packaging resource (include res, assets, AndroidManifest.xml, etc.) to res.zip ... </echo>
              <exec executable="aapt">
                   <arg value="package" />
                   <arg value="-f" />
                   <arg value="-M" />
                   <arg value="AndroidManifest.xml" />
                   <arg value="-S" />
                   <arg value="res" />
                   <arg value="-A" />
                   <arg value="assets" />
                   <arg value="-I" />
                   <arg value="${android-jar}" />
                   <arg value="-F" />
                   <arg value="bin
    esources.ap_" />
                   <arg value="--auto-add-overlay" />
              </exec>
             
              <echo>building unsigned.apk ... </echo>
              <exec executable="apkbuilder.bat">
                   <arg value="${project-dir}inunsigned.apk" />
                   <arg value="-u" />
                   <arg value="-z" />
                   <arg value="${project-dir}in
    esources.ap_" />
                   <arg value="-f" />
                   <arg value="${project-dir}inclasses.dex" />
              </exec>
             
              <echo>signing the unsigned apk to final product apk ... </echo>
              <exec executable="jarsigner">
                   <arg value="-keystore" />
                   <arg value="${project-dir}
    elease.keystore" />
                   <arg value="-storepass" />
                   <arg value="antPassword" />
                   <arg value="-keypass" />
                   <arg value="antPassword" />
                   <arg value="-signedjar" />
                   <arg value="${project-dir}insigned.apk" />
                   <arg value="${project-dir}inunsigned.apk" />
                   <arg value="release" />
              </exec>
             
        </target>
       
    
       
        <target name="clean">
        </target>
    </project>




    原文地址:http://blog.csdn.net/androiddevelop/article/details/11100109




  • 相关阅读:
    SQL Azure (17) SQL Azure V12
    Microsoft Azure News(5) Azure新DV2系列虚拟机上线
    Azure Redis Cache (3) 在Windows 环境下使用Redis Benchmark
    Azure PowerShell (11) 使用自定义虚拟机镜像模板,创建Azure虚拟机并绑定公网IP(VIP)和内网IP(DIP)
    Windows Azure Virtual Machine (31) 迁移Azure虚拟机
    Windows Azure Web Site (16) Azure Web Site HTTPS
    Azure China (12) 域名备案问题
    一分钟快速入门openstack
    管理员必备的Linux系统监控工具
    Keepalived+Nginx实现高可用和双主节点负载均衡
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3304095.html
Copyright © 2020-2023  润新知