通过ant脚本,编译打包android工程

转:http://blog.csdn.net/chenzhiqin20/article/details/8191889

通过ant脚本,编译打包android工程


1.Android程序编译、打包、签名、发布的三种方式: 
方式一:命令行手动编译打包 
方式二:使用ant自动编译打包 
方式三:使用eclipse+ADT编译打包 

2.Android编译、打包的步骤: 
2.1第一步 生成R.java类文件: 
Eclipse中会自动生成R.java,ant和命令行使用android SDK提供的aapt.ext程序生成R.java。 

2.2第二步 将.aidl文件生成.java类文件: 
Eclipse中自动生成,ant和命令行使用android SDK提供的aidl.exe生成.java文件。 

2.3第三步 编译.java类文件生成class文件: 
Eclipse中自动生成,ant和命令行使用jdk的javac编译java类文件生成class文件。 

2.4第四步 将class文件打包生成classes.dex文件: 
Eclipse中自动生成,ant和命令行使用android SDK提供的dx.bat命令行脚本生成classes.dex文件。 

2.5第五步 打包资源文件(包括res、assets、androidmanifest.xml等): 
Eclipse中自动生成,ant和命令行使用Android SDK提供的aapt.exe生成资源包文件。 

2.6第六步 生成未签名的apk安装文件: 
Eclipse中自动生成debug签名文件存放在bin目录中,ant和命令行使用android SDK提供的apkbuilder.bat命令脚本生成未签名的apk安装文件。 

2.7第七步 对未签名的apk进行签名生成签名后的android文件: 

Eclipse中使用Android Tools进行签名,ant和命令行使用jdk的jarsigner对未签名的包进行apk签名。 



通过命令打包的脚本:见附件bulid0.xml,这个ant脚本只能编译打包一个单独的android工程或依赖一个library 的android工程


[html]  view plain copy
  1. xml version="1.0" encoding="UTF-8"?>  
  2. <project name="ant" default="release">  
  3.       
  4.     <property environment="env" />  
  5.       
  6.   
  7.     <property name="appName" value="TestPack" />  
  8.     <property name="basedir" value="" />  
  9.     <property name="library-dir" value="">  
  10.     property>  
  11.       
  12.       
  13.     <property name="sdk-folder" value="" />  
  14.       
  15.     <property name="sdk-platform-folder" value="${sdk-folder}/platforms/android-4" />  
  16.       
  17.     <property name="sdk-tools" value="${sdk-folder}/tools" />  
  18.       
  19.     <property name="sdk-platform-tools" value="${sdk-folder}/platform-tools" />  
  20.   
  21.       
  22.     <property name="aapt" value="${sdk-platform-tools}/aapt.exe" />  
  23.     <property name="aidl" value="${sdk-platform-tools}/aidl.exe" />  
  24.     <property name="dx" value="${sdk-platform-tools}/dx.bat" />  
  25.     <property name="apkbuilder" value="${sdk-tools}/apkbuilder.bat" />  
  26.     <property name="jarsigner" value="${env.JAVA_HOME}/bin/jarsigner" />  
  27.   
  28.       
  29.     <property name="android-jar" value="${sdk-platform-folder}/android.jar" />  
  30.   
  31.       
  32.     <property name="framework-aidl" value="${sdk-platform-folder}/framework.aidl" />  
  33.   
  34.       
  35.     <property name="outdir-gen" value="gen" />  
  36.       
  37.     <property name="outdir-bin" value="out" />  
  38.   
  39.       
  40.     <property name="manifest-xml" value="AndroidManifest.xml" />  
  41.       
  42.     <property name="resource-dir" value="res" />  
  43.     <property name="asset-dir" value="assets" />  
  44.       
  45.     <property name="srcdir" value="src" />  
  46.     <property name="srcdir-ospath" value="${basedir}/${srcdir}" />  
  47.       
  48.     <property name="external-lib" value="lib" />  
  49.     <property name="external-lib-ospath" value="${basedir}/${external-lib}" />  
  50.   
  51.       
  52.     <property name="outdir-classes" value="${outdir-bin}" />  
  53.     <property name="outdir-classes-ospath" value="${basedir}/${outdir-classes}" />  
  54.   
  55.       
  56.     <property name="dex-file" value="classes.dex" />  
  57.     <property name="dex-path" value="${outdir-bin}/${dex-file}" />  
  58.     <property name="dex-ospath" value="${basedir}/${dex-path}" />  
  59.   
  60.       
  61.     <property name="resources-package" value="${outdir-bin}/resources.ap_" />  
  62.     <property name="resources-package-ospath" value="${basedir}/${resources-package}" />  
  63.   
  64.       
  65.     <property name="out-unsigned-package" value="${outdir-bin}/${appName}-unsigned.apk" />  
  66.     <property name="out-unsigned-package-ospath" value="${basedir}/${out-unsigned-package}" />  
  67.   
  68.       
  69.     <property name="keystore-file" value="${basedir}/release.keystore" />  
  70.   
  71.       
  72.     <property name="out-signed-package" value="${outdir-bin}/${appName}.apk" />  
  73.     <property name="out-signed-package-ospath" value="${basedir}/${out-signed-package}" />  
  74.   
  75.   
  76.       
  77.     <target name="init">  
  78.         <echo>Initializing all output directories...echo>  
  79.         <delete dir="${outdir-bin}" />  
  80.         <mkdir dir="${outdir-bin}" />  
  81.         <mkdir dir="${outdir-classes}" />  
  82.     target>  
  83.   
  84.       
  85.     <target name="gen-R" depends="init">  
  86.         <echo>Generating R.java from the resources...echo>  
  87.           
  88.     <target name="aidl" depends="gen-R">  
  89.         <echo>Compiling .aidl into java files...echo>  
  90.         <apply executable="${aidl}" failonerror="true">  
  91.               
  92.             <arg value="-p${framework-aidl}" />  
  93.               
  94.             <arg value="-I${srcdir}" />  
  95.               
  96.             <arg value="-o${outdir-gen}" />  
  97.               
  98.             <fileset dir="${srcdir}">  
  99.                 <include name="**/*.aidl" />  
  100.             fileset>  
  101.         apply>  
  102.     target>  
  103.   
  104.       
  105.     <target name="compile" depends="aidl">  
  106.         <echo>Compiling java source code...echo>  
  107.         <javac encoding="utf-8" target="1.6" destdir="${outdir-classes}" bootclasspath="${android-jar}">  
  108.             <src path="src" />  
  109.             <src path="gen" />  
  110.             <src path="${library-dir}/src" />  
  111.             <classpath>  
  112.                 <fileset dir="${external-lib}" includes="*.jar" />  
  113.                 <fileset dir="${library-dir}/libs" includes="*.jar" />  
  114.                 <filelist>  
  115.                     <file name="${android-maps-jar}" />  
  116.                 filelist>  
  117.             classpath>  
  118.         javac>  
  119.     target>  
  120.   
  121.       
  122.     <target name="dex" depends="compile">  
  123.         <echo>Converting compiled files and external libraries into a .dex  
  124.             file...  
  125.         echo>  
  126.         <exec executable="${dx}" failonerror="true">  
  127.             <arg value="--dex" />  
  128.               
  129.             <arg value="--output=${dex-ospath}" />  
  130.               
  131.             <arg value="${outdir-classes-ospath}" />  
  132.             <arg value="${external-lib-ospath}" />  
  133.             <arg value="${library-dir}/libs" />  
  134.         exec>  
  135.     target>  
  136.   
  137.   
  138.       
  139.       
  140.     <target name="package-res-and-assets" depends="dex">  
  141.         <echo>Packaging resources and assets...echo>  
  142.         <exec executable="${aapt}" failonerror="true">  
  143.             <arg value="package" />  
  144.             <arg value="-f" />  
  145.             <arg value="-M" />  
  146.             <arg value="${manifest-xml}" />  
  147.             <arg value="-S" />  
  148.             <arg value="${resource-dir}" />  
  149.   
  150.             <arg value="-A" />  
  151.             <arg value="${asset-dir}" />  
  152.   
  153.             <arg value="-S" />  
  154.             <arg value="${library-dir}/${resource-dir}" />  
  155.   
  156.             <arg value="-A" />  
  157.             <arg value="${library-dir}/${asset-dir}" />  
  158.   
  159.             <arg value="-I" />  
  160.             <arg value="${android-jar}" />  
  161.             <arg value="-F" />  
  162.             <arg value="${resources-package}" />  
  163.   
  164.             <arg value="--auto-add-overlay" />  
  165.         exec>  
  166.     target>  
  167.   
  168.   
  169.       
  170.     <target name="package" depends="dex, package-res-and-assets">  
  171.         <echo>Packaging unsigned apk for release...echo>  
  172.         <exec executable="${apkbuilder}" failonerror="true">  
  173.             <arg value="${out-unsigned-package-ospath}" />  
  174.             <arg value="-u" />  
  175.               
  176.             <arg value="-z" />  
  177.             <arg value="${resources-package-ospath}" />  
  178.             <arg value="-f" />  
  179.             <arg value="${dex-ospath}" />  
  180.             <arg value="-rf" />  
  181.             <arg value="${srcdir-ospath}" />  
  182.             <arg value="-nf"/>  
  183.             <arg value="${library-dir}/libs"/>  
  184.         exec>  
  185.         <echo>It will need to be signed with jarsigner before being published.  
  186.         echo>  
  187.     target>  
  188.   
  189.   
  190.       
  191.     <target name="jarsigner" depends="package">  
  192.         <echo>Packaging signed apk for release...echo>  
  193.         <exec executable="${jarsigner}" failonerror="true">  
  194.             <arg value="-keystore" />  
  195.             <arg value="${keystore-file}" />  
  196.             <arg value="-storepass" />  
  197.             <arg value="" />  
  198.             <arg value="-keypass" />  
  199.             <arg value="" />  
  200.             <arg value="-signedjar" />  
  201.             <arg value="${out-signed-package-ospath}" />  
  202.             <arg value="${out-unsigned-package-ospath}" />  
  203.               
  204.             <arg value="" />  
  205.         exec>  
  206.     target>  
  207.   
  208.       
  209.     <target name="release" depends="jarsigner">  
  210.           
  211.         <delete file="${out-unsigned-package-ospath}" />  
  212.         <echo>APK is released. path:${out-signed-package-ospath}echo>  
  213.     target>  
  214.   
  215.   
  216. project>  

Android官方提供的打包脚本: 1400多行,我加了中文注释,希望能看懂。

详见build.xml

[html]  view plain copy
  1. xml version="1.0" encoding="UTF-8"?>  
  2. <project name="pet_dog_base_forum" default="release">  
  3.       
  4.     <property name="sdk.dir" value="C:/Program Files/android-sdk_r15-windows/android-sdk-windows" />  
  5.       
  6.     <property file="project.properties" />  
  7.       
  8.     <property file="ant.properties" />  
  9.       
  10.       
  11.   
  12.       
  13.   
  14.       
  15.     <property name="android.package.excludes" value="" />  
  16.   
  17.       
  18.     <property name="version.code" value="11" />  
  19.     <property name="version.name" value="111" />  
  20.     <property name="aapt.resource.filter" value="" />  
  21.   
  22.       
  23.     <property name="java.encoding" value="UTF-8" />  
  24.     <property name="java.target" value="1.6" />  
  25.     <property name="java.source" value="1.6" />  
  26.   
  27.       
  28.     <property name="verbose" value="false" />  
  29.   
  30.       
  31.       
  32.       
  33.       
  34.     <path id="android.antlibs">  
  35.         <pathelement path="${sdk.dir}/tools/lib/anttasks.jar" />  
  36.     path>  
  37.   
  38.       
  39.     <taskdef name="setup" classname="com.android.ant.NewSetupTask" classpathref="android.antlibs" />  
  40.   
  41.     <taskdef name="aapt" classname="com.android.ant.AaptExecTask" classpathref="android.antlibs" />  
  42.   
  43.     <taskdef name="aidl" classname="com.android.ant.AidlExecTask" classpathref="android.antlibs" />  
  44.   
  45.     <taskdef name="renderscript" classname="com.android.ant.RenderScriptTask" classpathref="android.antlibs" />  
  46.   
  47.     <taskdef name="dex" classname="com.android.ant.DexExecTask" classpathref="android.antlibs" />  
  48.   
  49.     <taskdef name="apkbuilder" classname="com.android.ant.ApkBuilderTask" classpathref="android.antlibs" />  
  50.   
  51.     <taskdef name="zipalign" classname="com.android.ant.ZipAlignTask" classpathref="android.antlibs" />  
  52.   
  53.     <taskdef name="xpath" classname="com.android.ant.XPathTask" classpathref="android.antlibs" />  
  54.   
  55.     <taskdef name="if" classname="com.android.ant.IfElseTask" classpathref="android.antlibs" />  
  56.   
  57.       
  58.   
  59.   
  60.       
  61.       
  62.     <property name="source.dir" value="src" />  
  63.     <property name="source.absolute.dir" location="${source.dir}" />  
  64.     <property name="gen.absolute.dir" location="gen" />  
  65.     <property name="resource.absolute.dir" location="res" />  
  66.     <property name="asset.absolute.dir" location="assets" />  
  67.     <property name="jar.libs.dir" value="libs" />  
  68.     <property name="jar.libs.absolute.dir" location="${jar.libs.dir}" />  
  69.     <property name="native.libs.absolute.dir" location="libs" />  
  70.   
  71.       
  72.     <property name="out.dir" value="bin" />  
  73.     <property name="out.absolute.dir" location="${out.dir}" />  
  74.     <property name="out.classes.absolute.dir" location="${out.dir}/classes" />  
  75.     <property name="out.res.absolute.dir" location="${out.dir}/res" />  
  76.   
  77.       
  78.     <property name="android.tools.dir" location="${sdk.dir}/tools" />  
  79.     <property name="android.platform.tools.dir" location="${sdk.dir}/platform-tools" />  
  80.     <condition property="exe" value=".exe" else="">  
  81.         <os family="windows" />  
  82.     condition>  
  83.     <condition property="bat" value=".bat" else="">  
  84.         <os family="windows" />  
  85.     condition>  
  86.     <property name="adb" location="${android.platform.tools.dir}/adb${exe}" />  
  87.     <property name="zipalign" location="${android.tools.dir}/zipalign${exe}" />  
  88.     <property name="aidl" location="${android.platform.tools.dir}/aidl${exe}" />  
  89.     <property name="aapt" location="${android.platform.tools.dir}/aapt${exe}" />  
  90.     <property name="dx" location="${android.platform.tools.dir}/dx${bat}" />  
  91.       
  92.     <property name="dex.file.name" value="classes.dex" />  
  93.     <property name="intermediate.dex.file" location="${out.absolute.dir}/${dex.file.name}" />  
  94.     <property name="resource.package.file.name" value="${ant.project.name}.ap_" />  
  95.   
  96.       
  97.     <property name="out.build.prop.file" location="${out.absolute.dir}/build.prop" />  
  98.   
  99.   
  100.       
  101.       
  102.     <condition property="has.keystore">  
  103.         <and>  
  104.             <isset property="key.store" />  
  105.             <length string="${key.store}" when="greater" length="0" />  
  106.             <isset property="key.alias" />  
  107.         and>  
  108.     condition>  
  109.     <condition property="has.password">  
  110.         <and>  
  111.             <isset property="has.keystore" />  
  112.             <isset property="key.store.password" />  
  113.             <isset property="key.alias.password" />  
  114.         and>  
  115.     condition>  
  116.   
  117.       
  118.     <property name="build.packaging.nocrunch" value="true" />  
  119.   
  120.       
  121.       
  122.   
  123.       
  124.     <macrodef name="do-only-if-not-library">  
  125.         <attribute name="elseText" />  
  126.         <element name="task-to-do" implicit="yes" />  
  127.         <sequential>  
  128.             <if condition="${project.is.library}">  
  129.                 <else>  
  130.                     <task-to-do />  
  131.                 else>  
  132.                 <then>  
  133.                     <echo>@{elseText}echo>  
  134.                 then>  
  135.             if>  
  136.         sequential>  
  137.     macrodef>  
  138.   
  139.       
  140.   
  141.       
  142.     <target name="clean" description="Removes output files created by other targets.">  
  143.         <delete dir="${out.absolute.dir}" verbose="${verbose}" />  
  144.         <delete dir="${gen.absolute.dir}" verbose="${verbose}" />  
  145.   
  146.           
  147.                 <subant buildpathref="project.libraries" antfile="build.xml" failonerror="true">  
  148.                     <target name="all" />  
  149.                     <target name="clean" />  
  150.                 subant>  
  151.             then>  
  152.         if>  
  153.     target>  
  154.   
  155.       
  156.     <target name="-setup">  
  157.         <if>  
  158.             <condition>  
  159.                 <not>  
  160.                     <isset property="setup.done" />  
  161.                 not>  
  162.             condition>  
  163.             <then>  
  164.                 <property name="setup.done" value="true" />  
  165.                 <echo>Gathering info for ${ant.project.name}...echo>  
  166.                   
  167.                 <if condition="${project.is.test}">  
  168.                     <then>  
  169.                         <property name="tested.project.absolute.dir" location="${tested.project.dir}" />  
  170.                     then>  
  171.                 if>  
  172.             then>  
  173.         if>  
  174.     target>  
  175.   
  176.       
  177.         <property file="${out.build.prop.file}" />  
  178.           
  179.         <property name="build.last.is.instrumented" value="${build.is.instrumented}" />  
  180.         <property name="build.last.is.packaging.debug" value="${build.is.packaging.debug}" />  
  181.         <property name="build.last.is.signing.debug" value="${build.is.signing.debug}" />  
  182.   
  183.           
  184.         <xpath input="AndroidManifest.xml" expression="/manifest/application/@android:hasCode" output="manifest.hasCode" default="true" />  
  185.   
  186.           
  187.             <echo>----------echo>  
  188.             <echo>Handling RenderScript files...echo>  
  189.             <renderscript executable="${renderscript}" framework="${android.rs}" genFolder="${gen.absolute.dir}" resFolder="${resource.absolute.dir}/raw" targetApi="${target.api}">  
  190.                 <source path="${source.absolute.dir}" />  
  191.             renderscript>  
  192.   
  193.             <echo>----------echo>  
  194.             <echo>Handling Resources...echo>  
  195.             <aapt executable="${aapt}" command="package" verbose="${verbose}" manifest="AndroidManifest.xml" androidjar="${android.jar}" rfolder="${gen.absolute.dir}" nonConstantId="${android.library}" projectLibrariesResName="project.libraries.res" projectLibrariesPackageName="project.libraries.package">  
  196.                 <res path="${resource.absolute.dir}" />  
  197.             aapt>  
  198.         do-only-if-manifest-hasCode>  
  199.     target>  
  200.   
  201.       
  202.                     <emma enabled="true">  
  203.                         <instr verbosity="${verbosity}" mode="overwrite" instrpath="${out.absolute.dir}/classes" outdir="${out.absolute.dir}/classes">  
  204.                         instr>  
  205.                         

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