通過ant腳本,編譯打包android工程

通過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. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <projectname="ant"default="release">
  3. <!--ANT環境變量-->
  4. <propertyenvironment="env"/>
  5. <!--應用名稱-->
  6. <propertyname="appName"value="TestPack"/>
  7. <propertyname="basedir"value=""/>
  8. <propertyname="library-dir"value="">
  9. </property>
  10. <!--SDK目錄(獲取操作系統環境變量ANDROID_SDK_HOME的值)-->
  11. <!--<propertyname="sdk-folder"value="${env.ANDROID_SDK_HOME}"/>-->
  12. <propertyname="sdk-folder"value=""/>
  13. <!--SDK指定平臺目錄-->
  14. <propertyname="sdk-platform-folder"value="${sdk-folder}/platforms/android-4"/>
  15. <!--SDK中tools目錄-->
  16. <propertyname="sdk-tools"value="${sdk-folder}/tools"/>
  17. <!--SDK指定平臺中tools目錄-->
  18. <propertyname="sdk-platform-tools"value="${sdk-folder}/platform-tools"/>
  19. <!--使用到的命令(當前系統爲windows,如果系統爲linux,可將.bat文件替換成相對應的命令)-->
  20. <propertyname="aapt"value="${sdk-platform-tools}/aapt.exe"/>
  21. <propertyname="aidl"value="${sdk-platform-tools}/aidl.exe"/>
  22. <propertyname="dx"value="${sdk-platform-tools}/dx.bat"/>
  23. <propertyname="apkbuilder"value="${sdk-tools}/apkbuilder.bat"/>
  24. <propertyname="jarsigner"value="${env.JAVA_HOME}/bin/jarsigner"/>
  25. <!--編譯需要的jar;如果項目使用到地圖服務則需要maps.jar-->
  26. <propertyname="android-jar"value="${sdk-platform-folder}/android.jar"/>
  27. <!--編譯aidl文件所需的預處理框架文件framework.aidl-->
  28. <propertyname="framework-aidl"value="${sdk-platform-folder}/framework.aidl"/>
  29. <!--生成R文件的相對目錄-->
  30. <propertyname="outdir-gen"value="gen"/>
  31. <!--編譯後的文件放置目錄-->
  32. <propertyname="outdir-bin"value="out"/>
  33. <!--清單文件-->
  34. <propertyname="manifest-xml"value="AndroidManifest.xml"/>
  35. <!--源文件目錄-->
  36. <propertyname="resource-dir"value="res"/>
  37. <propertyname="asset-dir"value="assets"/>
  38. <!--java源文件目錄-->
  39. <propertyname="srcdir"value="src"/>
  40. <propertyname="srcdir-ospath"value="${basedir}/${srcdir}"/>
  41. <!--外部類庫所在目錄-->
  42. <propertyname="external-lib"value="lib"/>
  43. <propertyname="external-lib-ospath"value="${basedir}/${external-lib}"/>
  44. <!--生成class目錄-->
  45. <propertyname="outdir-classes"value="${outdir-bin}"/>
  46. <propertyname="outdir-classes-ospath"value="${basedir}/${outdir-classes}"/>
  47. <!--classes.dex相關變量-->
  48. <propertyname="dex-file"value="classes.dex"/>
  49. <propertyname="dex-path"value="${outdir-bin}/${dex-file}"/>
  50. <propertyname="dex-ospath"value="${basedir}/${dex-path}"/>
  51. <!--經過aapt生成的資源包文件-->
  52. <propertyname="resources-package"value="${outdir-bin}/resources.ap_"/>
  53. <propertyname="resources-package-ospath"value="${basedir}/${resources-package}"/>
  54. <!--未認證apk包-->
  55. <propertyname="out-unsigned-package"value="${outdir-bin}/${appName}-unsigned.apk"/>
  56. <propertyname="out-unsigned-package-ospath"value="${basedir}/${out-unsigned-package}"/>
  57. <!--證書文件-->
  58. <propertyname="keystore-file"value="${basedir}/release.keystore"/>
  59. <!--已認證apk包-->
  60. <propertyname="out-signed-package"value="${outdir-bin}/${appName}.apk"/>
  61. <propertyname="out-signed-package-ospath"value="${basedir}/${out-signed-package}"/>
  62. <!--初始化工作-->
  63. <targetname="init">
  64. <echo>Initializingalloutputdirectories...</echo>
  65. <deletedir="${outdir-bin}"/>
  66. <mkdirdir="${outdir-bin}"/>
  67. <mkdirdir="${outdir-classes}"/>
  68. </target>
  69. <!--根據工程中的資源文件生成R.java文件-->
  70. <targetname="gen-R"depends="init">
  71. <echo>GeneratingR.javafromtheresources...</echo>
  72. <!--<execexecutable="${aapt}"failonerror="true">
  73. <argvalue="package"/>
  74. <argvalue="-f"/>
  75. <argvalue="-m"/>
  76. <argvalue="-J"/>
  77. <argvalue="${outdir-gen}"/>
  78. <argvalue="-S"/>
  79. <argvalue="${resource-dir}"/>
  80. <argvalue="-M"/>
  81. <argvalue="${manifest-xml}"/>
  82. <argvalue="-I"/>
  83. <argvalue="${android-jar}"/>
  84. </exec>-->
  85. <execexecutable="${aapt}"failonerror="true">
  86. <argvalue="package"/>
  87. <argvalue="-m"/>
  88. <argvalue="--auto-add-overlay"/>
  89. <argvalue="-J"/>
  90. <argvalue="${outdir-gen}"/>
  91. <argvalue="-M"/>
  92. <argvalue="${manifest-xml}"/>
  93. <argvalue="-S"/>
  94. <argvalue="${resource-dir}"/>
  95. <argvalue="-S"/>
  96. <argvalue="${library-dir}/${resource-dir}"/>
  97. <argvalue="--extra-packages"/>
  98. <argvalue="com.mobcent.share.android"/>
  99. <argvalue="-A"/>
  100. <argvalue="${asset-dir}"/>
  101. <argvalue="-I"/>
  102. <argvalue="${android-jar}"/>
  103. </exec>
  104. </target>
  105. <!--編譯aidl文件-->
  106. <targetname="aidl"depends="gen-R">
  107. <echo>Compiling.aidlintojavafiles...</echo>
  108. <applyexecutable="${aidl}"failonerror="true">
  109. <!--指定預處理文件-->
  110. <argvalue="-p${framework-aidl}"/>
  111. <!--aidl聲明的目錄-->
  112. <argvalue="-I${srcdir}"/>
  113. <!--目標文件目錄-->
  114. <argvalue="-o${outdir-gen}"/>
  115. <!--指定哪些文件需要編譯-->
  116. <filesetdir="${srcdir}">
  117. <includename="**/*.aidl"/>
  118. </fileset>
  119. </apply>
  120. </target>
  121. <!--將工程中的java源文件編譯成class文件-->
  122. <targetname="compile"depends="aidl">
  123. <echo>Compilingjavasourcecode...</echo>
  124. <javacencoding="utf-8"target="1.6"destdir="${outdir-classes}"bootclasspath="${android-jar}">
  125. <srcpath="src"/>
  126. <srcpath="gen"/>
  127. <srcpath="${library-dir}/src"/>
  128. <classpath>
  129. <filesetdir="${external-lib}"includes="*.jar"/>
  130. <filesetdir="${library-dir}/libs"includes="*.jar"/>
  131. <filelist>
  132. <filename="${android-maps-jar}"/>
  133. </filelist>
  134. </classpath>
  135. </javac>
  136. </target>
  137. <!--將.class文件轉化成.dex文件-->
  138. <targetname="dex"depends="compile">
  139. <echo>Convertingcompiledfilesandexternallibrariesintoa.dex
  140. file...
  141. </echo>
  142. <execexecutable="${dx}"failonerror="true">
  143. <argvalue="--dex"/>
  144. <!--輸出文件-->
  145. <argvalue="--output=${dex-ospath}"/>
  146. <!--要生成.dex文件的源classes和libraries-->
  147. <argvalue="${outdir-classes-ospath}"/>
  148. <argvalue="${external-lib-ospath}"/>
  149. <argvalue="${library-dir}/libs"/>
  150. </exec>
  151. </target>
  152. <!--將資源文件放進輸出目錄-->
  153. <!--在這截斷-->
  154. <targetname="package-res-and-assets"depends="dex">
  155. <echo>Packagingresourcesandassets...</echo>
  156. <execexecutable="${aapt}"failonerror="true">
  157. <argvalue="package"/>
  158. <argvalue="-f"/>
  159. <argvalue="-M"/>
  160. <argvalue="${manifest-xml}"/>
  161. <argvalue="-S"/>
  162. <argvalue="${resource-dir}"/>
  163. <argvalue="-A"/>
  164. <argvalue="${asset-dir}"/>
  165. <argvalue="-S"/>
  166. <argvalue="${library-dir}/${resource-dir}"/>
  167. <argvalue="-A"/>
  168. <argvalue="${library-dir}/${asset-dir}"/>
  169. <argvalue="-I"/>
  170. <argvalue="${android-jar}"/>
  171. <argvalue="-F"/>
  172. <argvalue="${resources-package}"/>
  173. <argvalue="--auto-add-overlay"/>
  174. </exec>
  175. </target>
  176. <!--打包成未簽證的apk-->
  177. <targetname="package"depends="dex,package-res-and-assets">
  178. <echo>Packagingunsignedapkforrelease...</echo>
  179. <execexecutable="${apkbuilder}"failonerror="true">
  180. <argvalue="${out-unsigned-package-ospath}"/>
  181. <argvalue="-u"/>
  182. <argvalue="-z"/>
  183. <argvalue="${resources-package-ospath}"/>
  184. <argvalue="-f"/>
  185. <argvalue="${dex-ospath}"/>
  186. <argvalue="-rf"/>
  187. <argvalue="${srcdir-ospath}"/>
  188. <argvalue="-nf"/>
  189. <argvalue="${library-dir}/libs"/>
  190. </exec>
  191. <echo>Itwillneedtobesignedwithjarsignerbeforebeingpublished.
  192. </echo>
  193. </target>
  194. <!--對apk進行簽證-->
  195. <targetname="jarsigner"depends="package">
  196. <echo>Packagingsignedapkforrelease...</echo>
  197. <execexecutable="${jarsigner}"failonerror="true">
  198. <argvalue="-keystore"/>
  199. <argvalue="${keystore-file}"/>
  200. <argvalue="-storepass"/>
  201. <argvalue=""/>
  202. <argvalue="-keypass"/>
  203. <argvalue=""/>
  204. <argvalue="-signedjar"/>
  205. <argvalue="${out-signed-package-ospath}"/>
  206. <argvalue="${out-unsigned-package-ospath}"/>
  207. <!--不要忘了證書的別名-->
  208. <argvalue=""/>
  209. </exec>
  210. </target>
  211. <!--發佈-->
  212. <targetname="release"depends="jarsigner">
  213. <!--刪除未簽證apk-->
  214. <deletefile="${out-unsigned-package-ospath}"/>
  215. <echo>APKisreleased.path:${out-signed-package-ospath}</echo>
  216. </target>
  217. </project>

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

詳見build.xml

[html] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <projectname="pet_dog_base_forum"default="release">
  3. <!--自己需要添加的屬性-->
  4. <propertyname="sdk.dir"value="C:/ProgramFiles/android-sdk_r15-windows/android-sdk-windows"/>
  5. <!--導入project.properties文件,設置了編譯的target和相關的library工程-->
  6. <propertyfile="project.properties"/>
  7. <!--導入build.properties文件,設置了android的目錄和key-->
  8. <propertyfile="ant.properties"/>
  9. <!--
  10. Thisbuildfileisimportedbytheprojectbuildfile.Itcontains
  11. allthetargetsandtasksnecessarytobuildAndroidprojects,bethey
  12. regularprojects,libraryprojects,ortestprojects.
  13. Atthebeginningofthefileisalistofpropertiesthatcanbeoverridden
  14. byaddingthemtoyourbuild.properties(propertiesareimmutable,sotheir
  15. firstdefinitionsticksandisneverchanged).
  16. Follows:
  17. -customtaskdefinitions,
  18. -moreproperties(donotoverridethoseunlessthewholebuildsystemismodified).
  19. -macrosusedthroughoutthebuild,
  20. -basebuildtargets,
  21. -debug-specificbuildtargets,
  22. -release-specificbuildtargets,
  23. -instrument-specificbuildtargets,
  24. -testproject-specificbuildtargets,
  25. -installtargets,
  26. -helptarget
  27. 步驟如下:
  28. ——自定義task
  29. ——設置相關屬性
  30. ——全局的使用整個構建
  31. ——基本bulid的targets
  32. ——debug使用的targets
  33. ——release使用的targets
  34. ——特定儀器使用的targets
  35. ——測試使用的targets
  36. ——安裝的targets
  37. ——幫助的targets
  38. -->
  39. <!--**********OverrideableProperties**********-->
  40. <!--**********可重寫的屬性**********-->
  41. <!--Youcanoverridethesevaluesinyourbuild.xmlorbuild.properties.
  42. Overridinganyotherpropertiesmayresultinbrokenbuild.-->
  43. <!--你可以覆蓋build.xml或者build.properties文件中的任何屬性,覆蓋任何一個屬性,都可能導致build出錯,慎用-->
  44. <!--Tellsadbwhichdevicetotarget.Youcanchangethisfromthecommandline
  45. byinvoking"ant-Dadb.device.arg=-d"fordevice"ant-Dadb.device.arg=-e"for
  46. theemulator.-->
  47. <!--設置鏈接的機器,
  48. ant-Dadb.device.arg=-d使用鏈接當前的設備
  49. ant-Dadb.device.arg=-e使用模擬器
  50. -->
  51. <propertyname="adb.device.arg"value=""/>
  52. <!--filesetexcludepatterns(spaceseparated)toprevent
  53. filesinsidesrc/frombeingpackaged.-->
  54. <!--設置改屬性可以排除編譯一部分代碼
  55. -->
  56. <propertyname="android.package.excludes"value=""/>
  57. <!--setsomepropertiesusedforfiltering/override.Ifthoseweren'tdefined
  58. before,thenthiswillcreatethemwithemptyvalues,whicharethenignored
  59. bythecustomtasksreceivingthem.-->
  60. <!--
  61. version.code,version.name可以替換AndroidManifest.xml中的android:versionCode和android:versionName
  62. -->
  63. <propertyname="version.code"value="11"/>
  64. <propertyname="version.name"value="111"/>
  65. <propertyname="aapt.resource.filter"value=""/>
  66. <!--compilationoptions-->
  67. <propertyname="java.encoding"value="UTF-8"/>
  68. <propertyname="java.target"value="1.6"/>
  69. <propertyname="java.source"value="1.6"/>
  70. <!--Verbosity-->
  71. <propertyname="verbose"value="false"/>
  72. <!--**********CustomTasks**********-->
  73. <!--**********自定義Tasks**********-->
  74. <!--導入自定義Task是需要的文件-->
  75. <pathid="android.antlibs">
  76. <pathelementpath="${sdk.dir}/tools/lib/anttasks.jar"/>
  77. </path>
  78. <!--Customtasks-->
  79. <taskdefname="setup"classname="com.android.ant.NewSetupTask"classpathref="android.antlibs"/>
  80. <taskdefname="aapt"classname="com.android.ant.AaptExecTask"classpathref="android.antlibs"/>
  81. <taskdefname="aidl"classname="com.android.ant.AidlExecTask"classpathref="android.antlibs"/>
  82. <taskdefname="renderscript"classname="com.android.ant.RenderScriptTask"classpathref="android.antlibs"/>
  83. <taskdefname="dex"classname="com.android.ant.DexExecTask"classpathref="android.antlibs"/>
  84. <taskdefname="apkbuilder"classname="com.android.ant.ApkBuilderTask"classpathref="android.antlibs"/>
  85. <taskdefname="zipalign"classname="com.android.ant.ZipAlignTask"classpathref="android.antlibs"/>
  86. <taskdefname="xpath"classname="com.android.ant.XPathTask"classpathref="android.antlibs"/>
  87. <taskdefname="if"classname="com.android.ant.IfElseTask"classpathref="android.antlibs"/>
  88. <!--Emmaconfiguration
  89. EMMA是一種快速的,基於字節碼指令的Java代碼覆蓋工具。
  90. -->
  91. <propertyname="emma.dir"value="${sdk.dir}/tools/lib"/>
  92. <pathid="emma.lib">
  93. <pathelementlocation="${emma.dir}/emma.jar"/>
  94. <pathelementlocation="${emma.dir}/emma_ant.jar"/>
  95. </path>
  96. <taskdefresource="emma_ant.properties"classpathref="emma.lib"/>
  97. <!--Endofemmaconfiguration-->
  98. <!--**********OtherProperties**********-->
  99. <!--overridingthesepropertiesmaybreakthebuild
  100. unlessthewholefileisupdated-->
  101. <!--輸入文件-->
  102. <propertyname="source.dir"value="src"/>
  103. <propertyname="source.absolute.dir"location="${source.dir}"/>
  104. <propertyname="gen.absolute.dir"location="gen"/>
  105. <propertyname="resource.absolute.dir"location="res"/>
  106. <propertyname="asset.absolute.dir"location="assets"/>
  107. <propertyname="jar.libs.dir"value="libs"/>
  108. <propertyname="jar.libs.absolute.dir"location="${jar.libs.dir}"/>
  109. <propertyname="native.libs.absolute.dir"location="libs"/>
  110. <!--輸出文件-->
  111. <propertyname="out.dir"value="bin"/>
  112. <propertyname="out.absolute.dir"location="${out.dir}"/>
  113. <propertyname="out.classes.absolute.dir"location="${out.dir}/classes"/>
  114. <propertyname="out.res.absolute.dir"location="${out.dir}/res"/>
  115. <!--toolslocation編譯所需要用到的工具-->
  116. <propertyname="android.tools.dir"location="${sdk.dir}/tools"/>
  117. <propertyname="android.platform.tools.dir"location="${sdk.dir}/platform-tools"/>
  118. <conditionproperty="exe"value=".exe"else="">
  119. <osfamily="windows"/>
  120. </condition>
  121. <conditionproperty="bat"value=".bat"else="">
  122. <osfamily="windows"/>
  123. </condition>
  124. <propertyname="adb"location="${android.platform.tools.dir}/adb${exe}"/>
  125. <propertyname="zipalign"location="${android.tools.dir}/zipalign${exe}"/>
  126. <propertyname="aidl"location="${android.platform.tools.dir}/aidl${exe}"/>
  127. <propertyname="aapt"location="${android.platform.tools.dir}/aapt${exe}"/>
  128. <propertyname="dx"location="${android.platform.tools.dir}/dx${bat}"/>
  129. <!--renderscriptlocationissetbyNewSetupTasksincewehaveachoiceof
  130. severalexecutablesbasedonminSdkVersion-->
  131. <!--Intermediatefiles中間文件-->
  132. <propertyname="dex.file.name"value="classes.dex"/>
  133. <propertyname="intermediate.dex.file"location="${out.absolute.dir}/${dex.file.name}"/>
  134. <propertyname="resource.package.file.name"value="${ant.project.name}.ap_"/>
  135. <!--Buildpropertyfilebuild的屬性文件-->
  136. <propertyname="out.build.prop.file"location="${out.absolute.dir}/build.prop"/>
  137. <!--Thisisneededbyemmaasitusesmultilevelverbosityinsteadofsimple'true'or'false'
  138. Theproperty'verbosity'isnotuserconfigurableanddependsexclusivelyon'verbose'
  139. value.
  140. 這是需要通過艾瑪,因爲它使用多級verbosity不是簡單的「true」或「false」。屬性「冗長」不是用戶可配置的,只取決於verbose」值。
  141. -->
  142. <conditionproperty="verbosity"value="verbose"else="quiet">
  143. <istruevalue="${verbose}"/>
  144. </condition>
  145. <!--propertiesforsigninginreleasemode-->
  146. <!--簽名所需要的文件-->
  147. <conditionproperty="has.keystore">
  148. <and>
  149. <issetproperty="key.store"/>
  150. <lengthstring="${key.store}"when="greater"length="0"/>
  151. <issetproperty="key.alias"/>
  152. </and>
  153. </condition>
  154. <conditionproperty="has.password">
  155. <and>
  156. <issetproperty="has.keystore"/>
  157. <issetproperty="key.store.password"/>
  158. <issetproperty="key.alias.password"/>
  159. </and>
  160. </condition>
  161. <!--propertiesforpackaging-->
  162. <propertyname="build.packaging.nocrunch"value="true"/>
  163. <!--**********Macros**********-->
  164. <!--**********宏定義**********-->
  165. <!--macrotodoataskonifproject.is.libraryisfalse.
  166. elseTextattributeisdisplayedotherwise-->
  167. <!--定義了沒有關聯library工程時,將會打印elseText-->
  168. <macrodefname="do-only-if-not-library">
  169. <attributename="elseText"/>
  170. <elementname="task-to-do"implicit="yes"/>
  171. <sequential>
  172. <ifcondition="${project.is.library}">
  173. <else>
  174. <task-to-do/>
  175. </else>
  176. <then>
  177. <echo>@{elseText}</echo>
  178. </then>
  179. </if>
  180. </sequential>
  181. </macrodef>
  182. <!--macrotodoataskonifmanifest.hasCodeistrue.
  183. elseTextattributeisdisplayedotherwise-->
  184. <macrodefname="do-only-if-manifest-hasCode">
  185. <attributename="elseText"default=""/>
  186. <elementname="task-to-do"implicit="yes"/>
  187. <sequential>
  188. <ifcondition="${manifest.hasCode}">
  189. <then>
  190. <task-to-do/>
  191. </then>
  192. <else>
  193. <if>
  194. <condition>
  195. <lengthstring="@{elseText}"trim="true"when="greater"length="0"/>
  196. </condition>
  197. <then>
  198. <echo>@{elseText}</echo>
  199. </then>
  200. </if>
  201. </else>
  202. </if>
  203. </sequential>
  204. </macrodef>
  205. <!--Configurablemacro,whichallowstopassasparametersoutputdirectory,
  206. outputdexfilenameandexternallibrariestodex(optional)
  207. 配置宏,允許通過參數設置輸出的目錄,dex文件和dex額外的libraries
  208. -->
  209. <macrodefname="dex-helper">
  210. <elementname="external-libs"optional="yes"/>
  211. <attributename="nolocals"default="false"/>
  212. <sequential>
  213. <!--setstheprimaryinputfordex.Ifapre-dextasksetsitto
  214. somethingelsethishasnoeffect-->
  215. <propertyname="out.dex.input.absolute.dir"value="${out.classes.absolute.dir}"/>
  216. <!--setthesecondarydxinput:theproject(andlibrary)jarfiles
  217. Ifapre-dextasksetsittosomethingelsethishasnoeffect-->
  218. <if>
  219. <condition>
  220. <isreferencerefid="out.dex.jar.input.ref"/>
  221. </condition>
  222. <else>
  223. <pathid="out.dex.jar.input.ref">
  224. <pathrefid="jar.libs.ref"/>
  225. </path>
  226. </else>
  227. </if>
  228. <dexexecutable="${dx}"output="${intermediate.dex.file}"nolocals="@{nolocals}"verbose="${verbose}"previousBuildType="${build.last.target}"buildType="${build.target}">
  229. <pathpath="${out.dex.input.absolute.dir}"/>
  230. <pathrefid="out.dex.jar.input.ref"/>
  231. <external-libs/>
  232. </dex>
  233. </sequential>
  234. </macrodef>
  235. <!--ThisismacrothatenablepassingvariablelistofexternaljarfilestoApkBuilder
  236. 設置ApkBuilder是額外的jar文件
  237. 默認把工程下libs中的jar文件打到APK裏
  238. Exampleofuse:
  239. <package-helper>
  240. <extra-jars>
  241. <jarfolderpath="my_jars"/>
  242. <jarfilepath="foo/bar.jar"/>
  243. <jarfolderpath="your_jars"/>
  244. </extra-jars>
  245. </package-helper>-->
  246. <macrodefname="package-helper">
  247. <elementname="extra-jars"optional="yes"/>
  248. <sequential>
  249. <apkbuilderoutfolder="${out.absolute.dir}"resourcefile="${resource.package.file.name}"apkfilepath="${out.packaged.file}"debugpackaging="${build.is.packaging.debug}"debugsigning="${build.is.signing.debug}"verbose="${verbose}"hascode="${manifest.hasCode}"previousBuildType="${build.last.is.packaging.debug}/${build.last.is.signing.debug}"buildType="${build.is.packaging.debug}/${build.is.signing.debug}">
  250. <dexpath="${intermediate.dex.file}"/>
  251. <sourcefolderpath="${source.absolute.dir}"/>
  252. <jarfilerefid="jar.libs.ref"/>
  253. <nativefolderpath="${native.libs.absolute.dir}"/>
  254. <nativefolderrefid="project.libraries.libs"/>
  255. <extra-jars/>
  256. </apkbuilder>
  257. </sequential>
  258. </macrodef>
  259. <!--Thisismacrowhichzipalignsin.packageandoutputsittoout.package.Usedbytargets
  260. debug,-debug-with-emmaandrelease.
  261. 通過zipaligns對APK進行優化
  262. -->
  263. <macrodefname="zipalign-helper">
  264. <attributename="in.package"/>
  265. <attributename="out.package"/>
  266. <sequential>
  267. <zipalignexecutable="${zipalign}"input="@{in.package}"output="@{out.package}"verbose="${verbose}"/>
  268. </sequential>
  269. </macrodef>
  270. <macrodefname="run-tests-helper">
  271. <attributename="emma.enabled"default="false"/>
  272. <elementname="extra-instrument-args"optional="yes"/>
  273. <sequential>
  274. <echo>Runningtests...</echo>
  275. <execexecutable="${adb}"failonerror="true">
  276. <argline="${adb.device.arg}"/>
  277. <argvalue="shell"/>
  278. <argvalue="am"/>
  279. <argvalue="instrument"/>
  280. <argvalue="-w"/>
  281. <argvalue="-e"/>
  282. <argvalue="coverage"/>
  283. <argvalue="@{emma.enabled}"/>
  284. <extra-instrument-args/>
  285. <argvalue="${manifest.package}/${test.runner}"/>
  286. </exec>
  287. </sequential>
  288. </macrodef>
  289. <macrodefname="record-build-key">
  290. <attributename="key"default="false"/>
  291. <attributename="value"default="false"/>
  292. <sequential>
  293. <propertyfilefile="${out.build.prop.file}"comment="Lastbuildtype">
  294. <entrykey="@{key}"value="@{value}"/>
  295. </propertyfile>
  296. </sequential>
  297. </macrodef>
  298. <macrodefname="record-build-info">
  299. <sequential>
  300. <record-build-keykey="build.last.target"value="${build.target}"/>
  301. <record-build-keykey="build.last.is.instrumented"value="${build.is.instrumented}"/>
  302. <record-build-keykey="build.last.is.packaging.debug"value="${build.is.packaging.debug}"/>
  303. <record-build-keykey="build.last.is.signing.debug"value="${build.is.signing.debug}"/>
  304. </sequential>
  305. </macrodef>
  306. <macrodefname="uninstall-helper">
  307. <attributename="app.package"default="false"/>
  308. <sequential>
  309. <echo>[email protected]{app.package}fromthedefaultemulatorordevice...</echo>
  310. <execexecutable="${adb}"failonerror="true">
  311. <argline="${adb.device.arg}"/>
  312. <argvalue="uninstall"/>
  313. <argvalue="@{app.package}"/>
  314. </exec>
  315. </sequential>
  316. </macrodef>
  317. <!--**********BuildTargets**********-->
  318. <!--thistargetsimplyforcerunning-setupmaking
  319. theprojectinfoberead.Tobeusedas
  320. antallclean
  321. tocleanthemainprojectaswellasthelibrariesandtestedproject
  322. 運行-setup,在此之前必須運行clean,
  323. -->
  324. <targetname="all"depends="-setup"/>
  325. <!--cleantarget-->
  326. <targetname="clean"description="Removesoutputfilescreatedbyothertargets.">
  327. <deletedir="${out.absolute.dir}"verbose="${verbose}"/>
  328. <deletedir="${gen.absolute.dir}"verbose="${verbose}"/>
  329. <!--ifweknowaboutatestedprojectorlibraries,wecleanthemtoo.This
  330. willonlyworkifthetarget'all'wascalledfirst-->
  331. <ifcondition="${project.is.test}">
  332. <then>
  333. <propertyname="tested.project.absolute.dir"location="${tested.project.dir}"/>
  334. <subantfailonerror="true">
  335. <filesetdir="${tested.project.absolute.dir}"includes="build.xml"/>
  336. <targetname="all"/>
  337. <targetname="clean"/>
  338. </subant>
  339. </then>
  340. </if>
  341. <if>
  342. <condition>
  343. <isreferencerefid="project.libraries"/>
  344. </condition>
  345. <then>
  346. <!--有libraries關聯工程的時候,調用libraries工程中build.xml-->
  347. <subantbuildpathref="project.libraries"antfile="build.xml"failonerror="true">
  348. <targetname="all"/>
  349. <targetname="clean"/>
  350. </subant>
  351. </then>
  352. </if>
  353. </target>
  354. <!--genericsetup初始化-->
  355. <targetname="-setup">
  356. <if>
  357. <condition>
  358. <not>
  359. <issetproperty="setup.done"/>
  360. </not>
  361. </condition>
  362. <then>
  363. <propertyname="setup.done"value="true"/>
  364. <echo>Gatheringinfofor${ant.project.name}...</echo>
  365. <!--loadprojectproperties,resolveAndroidtarget,librarydependencies
  366. andsetsomepropertieswiththeresults.
  367. Allpropertynamesarepassedasparametersendingin-Out
  368. 加載projectproperties,設置Androidtarget,依賴的library工程和一些其他的屬性
  369. -->
  370. <setupprojectTypeOut="android.project.type"androidJarFileOut="android.jar"androidAidlFileOut="android.aidl"renderScriptExeOut="renderscript"renderScriptIncludeDirOut="android.rs"bootclasspathrefOut="android.target.classpath"projectLibrariesRootOut="project.libraries"projectLibrariesJarsOut="project.libraries.jars"projectLibrariesResOut="project.libraries.res"projectLibrariesPackageOut="project.libraries.package"projectLibrariesLibsOut="project.libraries.libs"targetApiOut="target.api"/>
  371. <!--setsafewbooleanbasedonandroid.project.type
  372. tomaketheiftaskeasier-->
  373. <conditionproperty="project.is.library"else="false">
  374. <equalsarg1="${android.project.type}"arg2="library"/>
  375. </condition>
  376. <conditionproperty="project.is.test"else="false">
  377. <equalsarg1="${android.project.type}"arg2="test"/>
  378. </condition>
  379. <!--Ifatestproject,resolveabsolutepathtotestedproject.-->
  380. <ifcondition="${project.is.test}">
  381. <then>
  382. <propertyname="tested.project.absolute.dir"location="${tested.project.dir}"/>
  383. </then>
  384. </if>
  385. </then>
  386. </if>
  387. </target>
  388. <!--Prebuildsetup
  389. 預編譯
  390. -->
  391. <targetname="-build-setup"depends="-setup">
  392. <!--readthepreviousbuildmode-->
  393. <propertyfile="${out.build.prop.file}"/>
  394. <!--ifemptythepropwon'tbeset,sosetittothecurrenttarget
  395. toprovideadefaultvalueequaltothecurrentbuild-->
  396. <propertyname="build.last.target"value="${build.target}"/>
  397. <!--alsosetthedefaultvalueforwhetherthebuildisinstrumented-->
  398. <propertyname="build.last.is.instrumented"value="${build.is.instrumented}"/>
  399. <propertyname="build.last.is.packaging.debug"value="${build.is.packaging.debug}"/>
  400. <propertyname="build.last.is.signing.debug"value="${build.is.signing.debug}"/>
  401. <!--compilethelibrariesifany
  402. 編譯libraries
  403. -->
  404. <if>
  405. <condition>
  406. <isreferencerefid="project.libraries"/>
  407. </condition>
  408. <then>
  409. <echo>BuildingLibraries</echo>
  410. <subantbuildpathref="project.libraries"antfile="build.xml"target="${build.target}"failonerror="true"/>
  411. <echo>
  412. </echo>
  413. <echo>############################################</echo>
  414. <echo>****Backtoproject${ant.project.name}****</echo>
  415. <echo>############################################</echo>
  416. </then>
  417. </if>
  418. <!--compilethemainprojectifthisisatestproject
  419. 編譯主工程,如果這是測試工程
  420. -->
  421. <ifcondition="${project.is.test}">
  422. <then>
  423. <!--figureoutwhichtargetmustbeusedtobuildthetestedproject.
  424. Ifemmaisenabled,thenuse'instrument'otherwise,use'debug'-->
  425. <conditionproperty="tested.project.target"value="instrument"else="debug">
  426. <issetproperty="emma.enabled"/>
  427. </condition>
  428. <echo>Buildingtestedprojectat${tested.project.absolute.dir}</echo>
  429. <subanttarget="${tested.project.target}"failonerror="true">
  430. <filesetdir="${tested.project.absolute.dir}"includes="build.xml"/>
  431. </subant>
  432. <echo>
  433. </echo>
  434. <echo>############################################</echo>
  435. <echo>****Backtoproject${ant.project.name}****</echo>
  436. <echo>############################################</echo>
  437. </then>
  438. </if>
  439. <!--ValueofthehasCodeattribute(Applicationnode)extractedfrommanifestfile-->
  440. <xpathinput="AndroidManifest.xml"expression="/manifest/application/@android:hasCode"output="manifest.hasCode"default="true"/>
  441. <!--createapathwithallthejarfiles,fromthemainprojectandthe
  442. libraries
  443. 創建一個path,關聯所有的jar文件。每個工程下的libs下的jar文件
  444. -->
  445. <pathid="jar.libs.ref">
  446. <filesetdir="${jar.libs.absolute.dir}"includes="*.jar"/>
  447. <pathrefid="project.libraries.jars"/>
  448. </path>
  449. <!--specialcaseforinstrumented:ifthepreviousbuildwas
  450. instrumentedbutnotthisone,clearoutthecompiledcode
  451. 特殊情況被打斷,清除已編譯的代碼
  452. -->
  453. <if>
  454. <condition>
  455. <and>
  456. <istruevalue="${build.last.is.instrumented}"/>
  457. <isfalsevalue="${build.is.instrumented}"/>
  458. </and>
  459. </condition>
  460. <then>
  461. <echo>Switchingfrominstrumentedtonon-instrumentedbuild.</echo>
  462. <echo>Deletingpreviouscompilationoutput:</echo>
  463. <deletedir="${out.classes.absolute.dir}"verbose="${verbose}"/>
  464. </then>
  465. </if>
  466. <echo>Creatingoutputdirectoriesifneeded...</echo>
  467. <mkdirdir="${resource.absolute.dir}"/>
  468. <mkdirdir="${jar.libs.absolute.dir}"/>
  469. <mkdirdir="${out.absolute.dir}"/>
  470. <mkdirdir="${out.res.absolute.dir}"/>
  471. <do-only-if-manifest-hasCode>
  472. <mkdirdir="${gen.absolute.dir}"/>
  473. <mkdirdir="${out.classes.absolute.dir}"/>
  474. </do-only-if-manifest-hasCode>
  475. </target>
  476. <!--emptydefaultpre-buildtarget.Createasimilartargetin
  477. yourbuild.xmlandit'llbecalledinsteadofthisone.-->
  478. <targetname="-pre-build"/>
  479. <!--CodeGeneration:compileresources(aapt->R.java),aidl,renderscript
  480. 通過appt生成R.jar文件
  481. -->
  482. <targetname="-code-gen">
  483. <do-only-if-manifest-hasCodeelseText="hasCode=false.Skippingaidl/renderscript/R.java">
  484. <echo>----------</echo>
  485. <echo>Handlingaidlfiles...</echo>
  486. <aidlexecutable="${aidl}"framework="${android.aidl}"genFolder="${gen.absolute.dir}">
  487. <sourcepath="${source.absolute.dir}"/>
  488. </aidl>
  489. <!--renderscriptgeneratesresourcessoitmustbecalledbeforeaapt-->
  490. <echo>----------</echo>
  491. <echo>HandlingRenderScriptfiles...</echo>
  492. <renderscriptexecutable="${renderscript}"framework="${android.rs}"genFolder="${gen.absolute.dir}"resFolder="${resource.absolute.dir}/raw"targetApi="${target.api}">
  493. <sourcepath="${source.absolute.dir}"/>
  494. </renderscript>
  495. <echo>----------</echo>
  496. <echo>HandlingResources...</echo>
  497. <aaptexecutable="${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">
  498. <respath="${resource.absolute.dir}"/>
  499. </aapt>
  500. </do-only-if-manifest-hasCode>
  501. </target>
  502. <!--emptydefaultpre-compiletarget.Createasimilartargetin
  503. yourbuild.xmlandit'llbecalledinsteadofthisone.-->
  504. <targetname="-pre-compile"/>
  505. <!--Compilesthisproject's.javafilesinto.classfiles.
  506. 編譯
  507. -->
  508. <targetname="-compile"depends="-build-setup,-pre-build,-code-gen,-pre-compile">
  509. <do-only-if-manifest-hasCodeelseText="hasCode=false.Skipping...">
  510. <!--Ifandroidrulesareusedforatestproject,itsclasspathshouldinclude
  511. testedproject'slocation
  512. 如果是測試工程,classpath應該包括test的位置
  513. -->
  514. <conditionproperty="extensible.classpath"value="${tested.project.absolute.dir}/bin/classes"else=".">
  515. <issetproperty="tested.project.absolute.dir"/>
  516. </condition>
  517. <conditionproperty="extensible.libs.classpath"value="${tested.project.absolute.dir}/${jar.libs.dir}"else="${jar.libs.dir}">
  518. <issetproperty="tested.project.absolute.dir"/>
  519. </condition>
  520. <javacencoding="${java.encoding}"source="${java.source}"target="${java.target}"debug="true"extdirs=""destdir="${out.classes.absolute.dir}"bootclasspathref="android.target.classpath"verbose="${verbose}"classpath="${extensible.classpath}"classpathref="jar.libs.ref">
  521. <srcpath="${source.absolute.dir}"/>
  522. <srcpath="${gen.absolute.dir}"/>
  523. <classpath>
  524. <filesetdir="${extensible.libs.classpath}"includes="*.jar"/>
  525. </classpath>
  526. </javac>
  527. <!--iftheprojectisalibrarythenwegenerateajarfile
  528. 如果工程是library工程,則生成jar文件
  529. -->
  530. <ifcondition="${project.is.library}">
  531. <then>
  532. <echo>Creatinglibraryoutputjarfile...</echo>
  533. <propertyname="out.library.jar.file"location="${out.absolute.dir}/classes.jar"/>
  534. <if>
  535. <condition>
  536. <lengthstring="${android.package.excludes}"trim="true"when="greater"length="0"/>
  537. </condition>
  538. <then>
  539. <echo>Customjarpackagingexclusion:${android.package.excludes}</echo>
  540. </then>
  541. </if>
  542. <jardestfile="${out.library.jar.file}">
  543. <filesetdir="${out.classes.absolute.dir}"excludes="**/R.class**/R$*.class"/>
  544. <filesetdir="${source.absolute.dir}"excludes="**/*.java${android.package.excludes}"/>
  545. </jar>
  546. </then>
  547. </if>
  548. <!--iftheprojectisinstrumented,intrumenttheclasses
  549. 如果工程被打斷,插入相關的class
  550. -->
  551. <ifcondition="${build.is.instrumented}">
  552. <then>
  553. <echo>Instrumentingclassesfrom${out.absolute.dir}/classes...</echo>
  554. <!--Itonlyinstrumentsclassfiles,notanyexternallibs-->
  555. <emmaenabled="true">
  556. <instrverbosity="${verbosity}"mode="overwrite"instrpath="${out.absolute.dir}/classes"outdir="${out.absolute.dir}/classes">
  557. </instr>
  558. <!--TODO:exclusionfiltersonR*.classandallowingcustomexclusionfrom
  559. userdefinedfile-->
  560. </emma>
  561. </then>
  562. </if>
  563. </do-only-if-manifest-hasCode>
  564. </target>
  565. <!--emptydefaultpost-compiletarget.Createasimilartargetin
  566. yourbuild.xmlandit'llbecalledinsteadofthisone.-->
  567. <targetname="-post-compile"/>
  568. <!--Obfuscatetarget
  569. Thisisonlyactiveinreleasebuildswhenproguard.configisdefined
  570. indefault.properties.
  571. ToreplaceProguardwithadifferentobfuscationengine:
  572. Overridethefollowingtargetsinyourbuild.xml,beforethecallto<setup>
  573. -release-obfuscation-check
  574. Checkwhetherobfuscationshouldhappen,andputtheresultinaproperty.
  575. -debug-obfuscation-check
  576. Obfuscationshouldnothappen.Setthesamepropertytofalse.
  577. -obfuscate
  578. checkifthepropertysetin-debug/release-obfuscation-checkissettotrue.
  579. Iftrue:
  580. Performobfuscation
  581. Setpropertyout.dex.input.absolute.dirtobetheoutputoftheobfuscation
  582. 混淆代碼
  583. -->
  584. <targetname="-obfuscate">
  585. <ifcondition="${proguard.enabled}">
  586. <then>
  587. <propertyname="obfuscate.absolute.dir"location="${out.absolute.dir}/proguard"/>
  588. <propertyname="preobfuscate.jar.file"value="${obfuscate.absolute.dir}/original.jar"/>
  589. <propertyname="obfuscated.jar.file"value="${obfuscate.absolute.dir}/obfuscated.jar"/>
  590. <!--inputfordexwillbeproguard'soutput-->
  591. <propertyname="out.dex.input.absolute.dir"value="${obfuscated.jar.file}"/>
  592. <!--AddProguardTasks-->
  593. <propertyname="proguard.jar"location="${android.tools.dir}/proguard/lib/proguard.jar"/>
  594. <taskdefname="proguard"classname="proguard.ant.ProGuardTask"classpath="${proguard.jar}"/>
  595. <!--SettheandroidclasspathPathobjectintoasingleproperty.It'llbe
  596. allthejarfilesseparatedbyaplatformpath-separator.
  597. Eachpathmustbequotedifitcontainsspaces.
  598. -->
  599. <pathconvertproperty="android.libraryjars"refid="android.target.classpath">
  600. <firstmatchmapper>
  601. <regexpmapperfrom='^([^]*)(.*)$$'to='"\1\2"'/>
  602. <identitymapper/>
  603. </firstmatchmapper>
  604. </pathconvert>
  605. <!--Buildapathobjectwithallthejarfilesthatmustbeobfuscated.
  606. Thisincludetheprojectcompiledsourcecodeandany3rdpartyjar
  607. files.-->
  608. <pathid="project.jars.ref">
  609. <pathelementlocation="${preobfuscate.jar.file}"/>
  610. <pathrefid="jar.libs.ref"/>
  611. </path>
  612. <!--SettheprojectjarfilesPathobjectintoasingleproperty.It'llbe
  613. allthejarfilesseparatedbyaplatformpath-separator.
  614. Eachpathmustbequotedifitcontainsspaces.
  615. -->
  616. <pathconvertproperty="project.jars"refid="project.jars.ref">
  617. <firstmatchmapper>
  618. <regexpmapperfrom='^([^]*)(.*)$$'to='"\1\2"'/>
  619. <identitymapper/>
  620. </firstmatchmapper>
  621. </pathconvert>
  622. <mkdirdir="${obfuscate.absolute.dir}"/>
  623. <deletefile="${preobfuscate.jar.file}"/>
  624. <deletefile="${obfuscated.jar.file}"/>
  625. <jarbasedir="${out.classes.absolute.dir}"destfile="${preobfuscate.jar.file}"/>
  626. <proguard>
  627. @${proguard.config}
  628. -injars${project.jars}
  629. -outjars"${obfuscated.jar.file}"
  630. -libraryjars${android.libraryjars}
  631. -dump"${obfuscate.absolute.dir}/dump.txt"
  632. -printseeds"${obfuscate.absolute.dir}/seeds.txt"
  633. -printusage"${obfuscate.absolute.dir}/usage.txt"
  634. -printmapping"${obfuscate.absolute.dir}/mapping.txt"
  635. </proguard>
  636. </then>
  637. </if>
  638. </target>
  639. <!--Convertsthisproject's.classfilesinto.dexfiles
  640. 將.class打包成.dex文件
  641. -->
  642. <targetname="-dex"depends="-compile,-post-compile,-obfuscate">
  643. <do-only-if-manifest-hasCodeelseText="hasCode=false.Skipping...">
  644. <!--onlyconverttodalvikbytecodeis*not*alibrary-->
  645. <do-only-if-not-libraryelseText="Libraryproject:donotconvertbytecode...">
  646. <!--specialcaseforinstrumentedbuilds:needtouseno-localsandneed
  647. topassintheemmajar.
  648. 特殊情況下,檢測build,需要通過emma
  649. -->
  650. <ifcondition="${build.is.instrumented}">
  651. <then>
  652. <dex-helpernolocals="true">
  653. <external-libs>
  654. <filesetfile="${emma.dir}/emma_device.jar"/>
  655. </external-libs>
  656. </dex-helper>
  657. </then>
  658. <else>
  659. <dex-helper/>
  660. </else>
  661. </if>
  662. </do-only-if-not-library>
  663. </do-only-if-manifest-hasCode>
  664. </target>
  665. <!--Updatesthepre-processedPNGcache處理png圖片-->
  666. <targetname="-crunch">
  667. <execexecutable="${aapt}"taskName="crunch">
  668. <argvalue="crunch"/>
  669. <argvalue="-v"/>
  670. <argvalue="-S"/>
  671. <argpath="${resource.absolute.dir}"/>
  672. <argvalue="-C"/>
  673. <argpath="${out.res.absolute.dir}"/>
  674. </exec>
  675. </target>
  676. <!--Putstheproject'sresourcesintotheoutputpackagefile
  677. Thisactuallycancreatemultipleresourcepackageincase
  678. Somecustomapkwithspecificconfigurationhavebeen
  679. declaredindefault.properties.
  680. 打包資源文件
  681. -->
  682. <targetname="-package-resources"depends="-crunch">
  683. <!--onlypackageresourcesif*not*alibraryproject-->
  684. <do-only-if-not-libraryelseText="Libraryproject:donotpackageresources...">
  685. <aaptexecutable="${aapt}"command="package"versioncode="${version.code}"versionname="${version.name}"debug="${build.is.packaging.debug}"manifest="AndroidManifest.xml"assets="${asset.absolute.dir}"androidjar="${android.jar}"apkfolder="${out.absolute.dir}"nocrunch="${build.packaging.nocrunch}"resourcefilename="${resource.package.file.name}"resourcefilter="${aapt.resource.filter}"projectLibrariesResName="project.libraries.res"projectLibrariesPackageName="project.libraries.package"previousBuildType="${build.last.target}"buildType="${build.target}">
  686. <respath="${out.res.absolute.dir}"/>
  687. <respath="${resource.absolute.dir}"/>
  688. <!--<nocompress/>forcesnocompressiononanyfilesinassetsorres/raw-->
  689. <!--<nocompressextension="xml"/>forcesnocompressiononspecificfileextensionsinassetsandres/raw-->
  690. </aapt>
  691. </do-only-if-not-library>
  692. </target>
  693. <!--Packagestheapplication.打包-->
  694. <targetname="-package"depends="-dex,-package-resources">
  695. <!--onlypackageapkif*not*alibraryproject-->
  696. <do-only-if-not-libraryelseText="Libraryproject:donotpackageapk...">
  697. <ifcondition="${build.is.instrumented}">
  698. <then>
  699. <package-helper>
  700. <extra-jars>
  701. <!--Injectedfromexternalfile-->
  702. <jarfilepath="${emma.dir}/emma_device.jar"/>
  703. </extra-jars>
  704. </package-helper>
  705. </then>
  706. <else>
  707. <package-helper/>
  708. </else>
  709. </if>
  710. </do-only-if-not-library>
  711. </target>
  712. <targetname="-set-mode-check">
  713. <failif="out.final.file"message="Cannotruntwodifferentmodesatthesametime.Ifyouarerunningmorethanonedebug/release/instrumenttypetargets,callthemfromdifferentAntcalls."/>
  714. </target>
  715. <!--**********Debugspecifictargets**********-->
  716. <!--設置debug-->
  717. <targetname="-set-debug-files"depends="-set-mode-check">
  718. <propertyname="out.packaged.file"location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk"/>
  719. <propertyname="out.final.file"location="${out.absolute.dir}/${ant.project.name}-debug.apk"/>
  720. </target>
  721. <targetname="-set-debug-mode">
  722. <!--recordthecurrentbuildtarget-->
  723. <propertyname="build.target"value="debug"/>
  724. <propertyname="build.is.instrumented"value="false"/>
  725. <!--whetherthebuildisadebugbuild.alwaysset.-->
  726. <propertyname="build.is.packaging.debug"value="true"/>
  727. <!--signingmode:debug-->
  728. <propertyname="build.is.signing.debug"value="true"/>
  729. </target>
  730. <!--debug模式下,不使用混淆-->
  731. <targetname="-debug-obfuscation-check">
  732. <!--proguardisneverenabledindebugmode-->
  733. <propertyname="proguard.enabled"value="false"/>
  734. </target>
  735. <!--Buildsdebugoutputpackage-->
  736. <targetname="-do-debug"depends="-set-debug-mode,-debug-obfuscation-check,-package">
  737. <!--onlycreateapkif*not*alibraryproject-->
  738. <do-only-if-not-libraryelseText="Libraryproject:donotcreateapk...">
  739. <sequential>
  740. <zipalign-helperin.package="${out.packaged.file}"out.package="${out.final.file}"/>
  741. <echo>DebugPackage:${out.final.file}</echo>
  742. </sequential>
  743. </do-only-if-not-library>
  744. </target>
  745. <!--Buildsdebugoutputpackage-->
  746. <targetname="debug"depends="-set-debug-files,-do-debug"description="Buildstheapplicationandsignsitwithadebugkey.">
  747. <record-build-info/>
  748. </target>
  749. <!--**********Releasespecifictargets**********-->
  750. <!--發佈的targets-->
  751. <!--calledthroughtarget'release'.Onlyexecutedifthekeystoreand
  752. keyaliasareknownbutnottheirpassword.
  753. 需要輸入key.alias.password,key.store.password
  754. -->
  755. <targetname="-release-prompt-for-password"if="has.keystore"unless="has.password">
  756. <!--Getspasswords-->
  757. <inputmessage="Pleaseenterkeystorepassword(store:${key.store}):"addproperty="key.store.password"/>
  758. <inputmessage="Pleaseenterpasswordforalias'${key.alias}':"addproperty="key.alias.password"/>
  759. </target>
  760. <!--calledthroughtarget'release'.Onlyexecutedifthere'sno
  761. keystore/keyaliasset-->
  762. <targetname="-release-nosign"unless="has.keystore">
  763. <!--noreleasebuildsforlibraryproject-->
  764. <do-only-if-not-libraryelseText="">
  765. <sequential>
  766. <echo>Nokey.storeandkey.aliaspropertiesfoundinbuild.properties.</echo>
  767. <echo>Pleasesign${out.packaged.file}manually</echo>
  768. <echo>andrunzipalignfromtheAndroidSDKtools.</echo>
  769. </sequential>
  770. </do-only-if-not-library>
  771. <record-build-info/>
  772. </target>
  773. <!--檢查是否混淆代碼-->
  774. <targetname="-release-obfuscation-check">
  775. <conditionproperty="proguard.enabled"value="true"else="false">
  776. <and>
  777. <issetproperty="build.is.mode.release"/>
  778. <issetproperty="proguard.config"/>
  779. </and>
  780. </condition>
  781. <ifcondition="${proguard.enabled}">
  782. <then>
  783. <!--Secondarydxinput(jarfiles)isemptysinceallthe
  784. jarfileswillbeintheobfuscatedjar-->
  785. <pathid="out.dex.jar.input.ref"/>
  786. </then>
  787. </if>
  788. </target>
  789. <targetname="-set-release-mode"depends="-set-mode-check">
  790. <propertyname="out.packaged.file"location="${out.absolute.dir}/${ant.project.name}-release-unsigned.apk"/>
  791. <propertyname="out.final.file"location="${out.absolute.dir}/${ant.project.name}-release.apk"/>
  792. <!--recordthecurrentbuildtarget-->
  793. <propertyname="build.target"value="release"/>
  794. <propertyname="build.is.instrumented"value="false"/>
  795. <!--releasemodeisonlyvalidifthemanifestdoesnotexplicitly
  796. setdebuggabletotrue.defaultisfalse.-->
  797. <xpathinput="AndroidManifest.xml"expression="/manifest/application/@android:debuggable"output="build.is.packaging.debug"default="false"/>
  798. <!--signingmode:release-->
  799. <propertyname="build.is.signing.debug"value="false"/>
  800. <ifcondition="${build.is.packaging.debug}">
  801. <then>
  802. <echo>*************************************************</echo>
  803. <echo>****AndroidManifesthasdebuggable=true****</echo>
  804. <echo>****DoingDEBUGpackagingwithRELEASEkeys****</echo>
  805. <echo>*************************************************</echo>
  806. </then>
  807. <else>
  808. <!--propertyonlysetinreleasemode.
  809. Usefulforif/unlessattributesintargetnode
  810. whenusingAntbefore1.8-->
  811. <propertyname="build.is.mode.release"value="true"/>
  812. </else>
  813. </if>
  814. </target>
  815. <!--Thisruns-package-releaseand-release-nosignfirstandthenruns
  816. onlyifrelease-signistrue(setin-release-check,
  817. calledby-release-no-sign)-->
  818. <targetname="release"depends="-set-release-mode,-release-obfuscation-check,-package,-release-prompt-for-password,-release-nosign"if="has.keystore"description="Buildstheapplication.Thegeneratedapkfilemustbesignedbefore
  819. itispublished.">
  820. <!--onlycreateapkif*not*alibraryproject-->
  821. <do-only-if-not-libraryelseText="Libraryproject:donotcreateapk...">
  822. <sequential>
  823. <propertyname="out.unaligned.file"location="${out.absolute.dir}/${ant.project.name}-release-unaligned.apk"/>
  824. <!--SignstheAPK-->
  825. <echo>Signingfinalapk...</echo>
  826. <signjarjar="${out.packaged.file}"signedjar="${out.unaligned.file}"keystore="${key.store}"storepass="${key.store.password}"alias="${key.alias}"keypass="${key.alias.password}"verbose="${verbose}"/>
  827. <!--ZipalignstheAPK-->
  828. <zipalign-helperin.package="${out.unaligned.file}"out.package="${out.final.file}"/>
  829. <echo>ReleasePackage:${out.final.file}</echo>
  830. </sequential>
  831. </do-only-if-not-library>
  832. <record-build-info/>
  833. </target>
  834. <!--**********Instrumentedspecifictargets**********-->
  835. <!--需要插入的特殊targets-->
  836. <!--Thesetargetsarespecificfortheprojectundertestwhenit
  837. getscompiledbythetestprojectsinawaythatwillmakeit
  838. supportemmacodecoverage-->
  839. <targetname="-set-instrumented-mode"depends="-set-mode-check">
  840. <propertyname="out.packaged.file"location="${out.absolute.dir}/${ant.project.name}-instrumented-unaligned.apk"/>
  841. <propertyname="out.final.file"location="${out.absolute.dir}/${ant.project.name}-instrumented.apk"/>
  842. <!--whetherthebuildisaninstrumentedbuild.-->
  843. <propertyname="build.is.instrumented"value="true"/>
  844. </target>
  845. <!--Buildsinstrumentedoutputpackage-->
  846. <targetname="instrument"depends="-set-instrumented-mode,-do-debug"description="Buildsaninstrumentedpackaged.">
  847. <!--onlycreateapkif*not*alibraryproject-->
  848. <do-only-if-not-libraryelseText="Libraryproject:donotcreateapk...">
  849. <sequential>
  850. <zipalign-helperin.package="${out.packaged.file}"out.package="${out.final.file}"/>
  851. <echo>InstrumentedPackage:${out.final.file}</echo>
  852. </sequential>
  853. </do-only-if-not-library>
  854. <record-build-info/>
  855. </target>
  856. <!--**********Testprojectspecifictargets**********-->
  857. <!--測試工程特殊的targets-->
  858. <!--enablecodecoverage-->
  859. <targetname="emma">
  860. <propertyname="emma.enabled"value="true"/>
  861. </target>
  862. <!--failsiftheprojectisnotatestproject-->
  863. <targetname="-test-project-check">
  864. <!--can'tuseproject.is.testsincethesetuptargetisnotrun-->
  865. <if>
  866. <condition>
  867. <issetproperty="tested.project.dir"/>
  868. </condition>
  869. <else>
  870. <failmessage="Projectisnotatestproject."/>
  871. </else>
  872. </if>
  873. </target>
  874. <targetname="test"depends="-test-project-check"description="Runstestsfromthepackagedefinedintest.packageproperty">
  875. <propertyname="tested.project.absolute.dir"location="${tested.project.dir}"/>
  876. <propertyname="test.runner"value="android.test.InstrumentationTestRunner"/>
  877. <!--Applicationpackageofthetestedprojectextractedfromitsmanifestfile-->
  878. <xpathinput="${tested.project.absolute.dir}/AndroidManifest.xml"expression="/manifest/@package"output="tested.manifest.package"/>
  879. <xpathinput="AndroidManifest.xml"expression="/manifest/@package"output="manifest.package"/>
  880. <propertyname="emma.dump.file"value="/data/data/${tested.manifest.package}/coverage.ec"/>
  881. <ifcondition="${emma.enabled}">
  882. <then>
  883. <echo>WARNING:CodeCoverageiscurrentlyonlysupportedontheemulatorandrooteddevices.</echo>
  884. <run-tests-helperemma.enabled="true">
  885. <extra-instrument-args>
  886. <argvalue="-e"/>
  887. <argvalue="coverageFile"/>
  888. <argvalue="${emma.dump.file}"/>
  889. </extra-instrument-args>
  890. </run-tests-helper>
  891. <echo>Downloadingcoveragefileintoprojectdirectory...</echo>
  892. <execexecutable="${adb}"failonerror="true">
  893. <argline="${adb.device.arg}"/>
  894. <argvalue="pull"/>
  895. <argvalue="${emma.dump.file}"/>
  896. <argvalue="coverage.ec"/>
  897. </exec>
  898. <echo>Extractingcoveragereport...</echo>
  899. <emma>
  900. <reportsourcepath="${tested.project.absolute.dir}/${source.dir}"verbosity="${verbosity}">
  901. <!--TODO:report.dirorsomethinglikeshouldbeintroducedifnecessary-->
  902. <infilesetdir=".">
  903. <includename="coverage.ec"/>
  904. <includename="coverage.em"/>
  905. </infileset>
  906. <!--TODO:reportsinother,indicatedbyuserformats-->
  907. <htmloutfile="coverage.html"/>
  908. </report>
  909. </emma>
  910. <echo>Cleaninguptemporaryfiles...</echo>
  911. <deletefile="coverage.ec"/>
  912. <deletefile="coverage.em"/>
  913. <echo>Savingthereportfilein${basedir}/coverage/coverage.html</echo>
  914. </then>
  915. <else>
  916. <run-tests-helper/>
  917. </else>
  918. </if>
  919. </target>
  920. <!--**********Install/uninstallspecifictargets**********-->
  921. <!--安裝和卸載-->
  922. <targetname="install"description="Installsthenewlybuildpackage.Mustbeusedinconjunctionwithabuildtarget
  923. (debug/release/instrument).Iftheapplicationwaspreviouslyinstalled,theapplication
  924. isreinstalledifthesignaturematches.">
  925. <!--onlydoinstallif*not*alibraryproject-->
  926. <do-only-if-not-libraryelseText="Libraryproject:nothingtoinstall!">
  927. <if>
  928. <condition>
  929. <issetproperty="out.final.file"/>
  930. </condition>
  931. <then>
  932. <if>
  933. <condition>
  934. <resourceexists>
  935. <filefile="${out.final.file}"/>
  936. </resourceexists>
  937. </condition>
  938. <then>
  939. <echo>Installing${out.final.file}ontodefaultemulatorordevice...</echo>
  940. <execexecutable="${adb}"failonerror="true">
  941. <argline="${adb.device.arg}"/>
  942. <argvalue="install"/>
  943. <argvalue="-r"/>
  944. <argpath="${out.final.file}"/>
  945. </exec>
  946. <!--nowinstallthetestedprojectifapplicable-->
  947. <!--can'tuseproject.is.testsincethesetuptargetmightnothaverun-->
  948. <if>
  949. <condition>
  950. <issetproperty="tested.project.dir"/>
  951. </condition>
  952. <then>
  953. <propertyname="tested.project.absolute.dir"location="${tested.project.dir}"/>
  954. <!--figureoutwhichtestedpackagetoinstallbasedonemma.enabled-->
  955. <conditionproperty="tested.project.install.target"value="installi"else="installd">
  956. <issetproperty="emma.enabled"/>
  957. </condition>
  958. <subanttarget="${tested.project.install.target}"failonerror="true">
  959. <filesetdir="${tested.project.absolute.dir}"includes="build.xml"/>
  960. </subant>
  961. </then>
  962. </if>
  963. </then>
  964. <else>
  965. <failmessage="File${out.final.file}doesnotexist."/>
  966. </else>
  967. </if>
  968. </then>
  969. <else>
  970. <echo>Installfilenotspecified.</echo>
  971. <echo>
  972. </echo>
  973. <echo>'antinstall'nowrequiresthebuildtargettobespecifiedaswell.</echo>
  974. <echo>
  975. </echo>
  976. <echo>
  977. </echo>
  978. <echo>antdebuginstall</echo>
  979. <echo>antreleaseinstall</echo>
  980. <echo>antinstrumentinstall</echo>
  981. <echo>Thiswillbuildthegivenpackageandinstallit.</echo>
  982. <echo>
  983. </echo>
  984. <echo>Alternatively,youcanuse</echo>
  985. <echo>antinstalld</echo>
  986. <echo>antinstallr</echo>
  987. <echo>antinstalli</echo>
  988. <echo>antinstallt</echo>
  989. <echo>toonlyinstallanexistingpackage(thiswillnotrebuildthepackage.)</echo>
  990. <fail/>
  991. </else>
  992. </if>
  993. </do-only-if-not-library>
  994. </target>
  995. <targetname="installd"depends="-set-debug-files,install"description="Installs(only)thedebugpackage."/>
  996. <targetname="installr"depends="-set-release-mode,install"description="Installs(only)thereleasepackage."/>
  997. <targetname="installi"depends="-set-instrumented-mode,install"description="Installs(only)theinstrumentedpackage."/>
  998. <targetname="installt"depends="-test-project-check,installd"description="Installs(only)thetestandtestedpackages."/>
  999. <!--Uninstallsthepackagefromthedefaultemulator/device-->
  1000. <targetname="uninstall"description="Uninstallstheapplicationfromarunningemulatorordevice.">
  1001. <!--Nameoftheapplicationpackageextractedfrommanifestfile-->
  1002. <xpathinput="AndroidManifest.xml"expression="/manifest/@package"output="manifest.package"/>
  1003. <if>
  1004. <condition>
  1005. <issetproperty="manifest.package"/>
  1006. </condition>
  1007. <then>
  1008. <uninstall-helperapp.package="${manifest.package}"/>
  1009. </then>
  1010. <else>
  1011. <echo>Couldnotfindapplicationpackageinmanifest.Cannotrun'adbuninstall'.</echo>
  1012. </else>
  1013. </if>
  1014. <!--Nowuninstallthetestedproject,ifapplicable-->
  1015. <!--can'tuseproject.is.testsincethesetuptargetmightnothaverun-->
  1016. <if>
  1017. <condition>
  1018. <issetproperty="tested.project.dir"/>
  1019. </condition>
  1020. <then>
  1021. <propertyname="tested.project.absolute.dir"location="${tested.project.dir}"/>
  1022. <!--Applicationpackageofthetestedprojectextractedfromitsmanifestfile-->
  1023. <xpathinput="${tested.project.absolute.dir}/AndroidManifest.xml"expression="/manifest/@package"output="tested.manifest.package"/>
  1024. <if>
  1025. <condition>
  1026. <issetproperty="tested.manifest.package"/>
  1027. </condition>
  1028. <then>
  1029. <uninstall-helperapp.package="${tested.manifest.package}"/>
  1030. </then>
  1031. <else>
  1032. <echo>Couldnotfindtestedapplicationpackageinmanifest.Cannotrun'adbuninstall'.</echo>
  1033. </else>
  1034. </if>
  1035. </then>
  1036. </if>
  1037. </target>
  1038. <targetname="help">
  1039. <!--displaysstartsatcol13
  1040. |1380|-->
  1041. <echo>AndroidAntBuild.Availabletargets:</echo>
  1042. <echo>help:Displaysthishelp.</echo>
  1043. <echo>clean:Removesoutputfilescreatedbyothertargets.</echo>
  1044. <echo>The'all'targetcanbeusedtocleandependencies</echo>
  1045. <echo>(testedprojectsandlibraries)atthesametime</echo>
  1046. <echo>using:'antallclean'</echo>
  1047. <echo>debug:Buildstheapplicationandsignsitwithadebugkey.</echo>
  1048. <echo>release:Buildstheapplication.Thegeneratedapkfilemustbe</echo>
  1049. <echo>signedbeforeitispublished.</echo>
  1050. <echo>instrument:Buildsaninstrumentedpackageandsignsitwitha</echo>
  1051. <echo>debugkey.</echo>
  1052. <echo>test:Runsthetests.Projectmustbeatestprojectand</echo>
  1053. <echo>musthavebeenbuilt.Typicalusagewouldbe:</echo>
  1054. <echo>ant[emma]debuginstallttest</echo>
  1055. <echo>emma:Transientlyenablescodecoverageforsubsequent</echo>
  1056. <echo>targets.</echo>
  1057. <echo>install:Installsthenewlybuildpackage.Musteitherbeused</echo>
  1058. <echo>inconjunctionwithabuildtarget(debug/release/</echo>
  1059. <echo>instrument)orwiththepropersuffixindicating</echo>
  1060. <echo>whichpackagetoinstall(seebelow).</echo>
  1061. <echo>Iftheapplicationwaspreviouslyinstalled,the</echo>
  1062. <echo>applicationisreinstalledifthesignaturematches.</echo>
  1063. <echo>installd:Installs(only)thedebugpackage.</echo>
  1064. <echo>installr:Installs(only)thereleasepackage.</echo>
  1065. <echo>installi:Installs(only)theinstrumentedpackage.</echo>
  1066. <echo>installt:Installs(only)thetestandtestedpackages.</echo>
  1067. <echo>uninstall:Uninstallstheapplicationfromarunningemulatoror<
相關文章
相關標籤/搜索