使用Ant打包Apk

╰半橙微兮° 2022-09-25 03:28 365阅读 0赞

文章 Android 使用Ant打渠道包讲解了如何使用Ant打渠道包,没有涉及具体的编译过程,例如使用Ant如何生成R文件等。那么今天,使用Ant来打一个Apk包!

一、不管使用什么ide来打Apk包,一般会经过以下几个步骤:
1.生成R.java类文件
使用Android SDK提供用aapt.exe生成R.Java文件。
2.将.aidl文件生成.java类文件
使用Android SDK提供的aidl.exe生成相应Jva文件。
3.编译.java类文件生成class文件
使用Jdk的javac命令编译Java源文件生成class文件。
4.将class文件打包生成classes.dex文件
使用Android SDK提供的dx.bat将class文件转换成classes.dex文件。
5.打包资源文件(包括res、assets、androidmanifest.xml等)
使用Android SDK提供的aapt.exe生成资源包文件resources.ap_。
6.生成未签名的apk安装文件
使用Android SDK提供apkbuilder.bat打包资源和classes.dex文件,生成unsigned.apk。
7.对未签名的apk进行签名生成签名后的android文件
用jarsinger命令对apk认证,生成signed.apk。

或者如下描述,

1.根据资源文件和AndroidManifest.xml生成R.java文件
2.处理aidl,生成对应的java文件,如果没有aidl,则跳过
3.编译工程源码(主项目,库)src目录下所有的源码,同时上边生成的R.java和aidl生成的java文件也会被编译生成相应的class文件
4.将第3步生成的class文件打包生成.dex文件
5.将资源文件打包,生成初始的apk
6.将第4步生成的.dex文件加入到apk中生成未签名的包
7.apk签名

二、具体操作。

1.新建Android工程。

2.使用Android SDK命令创建Ant的build.xml。命令‘android update project –path .’ 。

  1. 在IDE上刷新工程,可以看到项目根目录下多了build.xml以及local.properties两个文件。

这几步就不多说了,详情请参考这篇文章 Android 使用Ant打渠道包。主要还是看看custom_rules.xml这个文件,(custom_rules.xml这个文件需要手动创建),具体代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project name="custom_rules" >
  3. <!-- 定义一个时间变量,打完包后跟渠道号一起命名apk -->
  4. <tstamp>
  5. <format property="pktime" pattern="yyyyMMddHHmm" locale="hour"/>
  6. </tstamp>
  7. <!-- 定义一个版本号变量,打完包后一起命名apk -->
  8. <property name="version" value="${test.server.url}" />
  9. <property name="basedir" value=" " />
  10. <property name="library-dir" value="${basedir}">
  11. </property>
  12. <!-- SDK目录(获取操作系统环境变量ANDROID_SDK_HOME的值) -->
  13. <property name="sdk-folder" value="${sdk.dir}" />
  14. <!-- SDK指定平台目录 -->
  15. <property name="sdk-platform-folder" value="${sdk-folder}/platforms/android-19" />
  16. <!-- SDK中tools目录 -->
  17. <property name="sdk-tools" value="${sdk-folder}/tools" />
  18. <!-- SDK指定平台中tools目录 -->
  19. <property name="sdk-platform-tools" value="${sdk-folder}/build-tools/23.0.1" />
  20. <!-- 使用到的命令(当前系统为windows,如果系统为linux,可将.bat文件替换成相对应的命令) -->
  21. <property name="aapt" value="${sdk-platform-tools}/aapt.exe" />
  22. <property name="aidl" value="${sdk-platform-tools}/aidl.exe" />
  23. <property name="dx" value="${sdk-platform-tools}/dx.bat" />
  24. <property name="apkbuilder" value="${sdk-tools}/apkbuilder.bat" />
  25. <property name="jarsigner" value="${env.JAVA_HOME}/bin/jarsigner" />
  26. <!-- 编译需要的jar; 如果项目使用到地图服务则需要maps.jar -->
  27. <property name="android-jar" value="${sdk-platform-folder}/android.jar" />
  28. <!-- 编译aidl文件所需的预处理框架文件framework.aidl -->
  29. <property name="framework-aidl" value="${sdk-platform-folder}/framework.aidl" />
  30. <!-- 生成R文件的相对目录 -->
  31. <property name="outdir-gen" value="gen" />
  32. <!-- 编译后的文件放置目录 -->
  33. <property name="outdir-bin" value="out" />
  34. <!-- 清单文件 -->
  35. <property name="manifest-xml" value="AndroidManifest.xml" />
  36. <!-- 源文件目录 -->
  37. <property name="resource-dir" value="res" />
  38. <property name="asset-dir" value="assets" />
  39. <!-- java源文件目录 -->
  40. <property name="srcdir" value="src" />
  41. <property name="srcdir-ospath" value="${basedir}/${srcdir}" />
  42. <!-- 外部类库所在目录 -->
  43. <property name="external-lib" value="libs" />
  44. <property name="external-lib-ospath" value="${basedir}/${external-lib}" />
  45. <!-- 生成class目录 -->
  46. <property name="outdir-classes" value="${outdir-bin}" />
  47. <property name="outdir-classes-ospath" value="${basedir}/${outdir-classes}" />
  48. <!-- classes.dex相关变量 -->
  49. <property name="dex-file" value="classes.dex" />
  50. <property name="dex-path" value="${outdir-bin}/${dex-file}" />
  51. <property name="dex-ospath" value="${basedir}/${dex-path}" />
  52. <!-- 经过aapt生成的资源包文件 -->
  53. <property name="resources-package" value="${outdir-bin}/resources.ap_" />
  54. <property name="resources-package-ospath" value="${basedir}/${resources-package}" />
  55. <!-- 未认证apk包 -->
  56. <property name="out-unsigned-package" value="${outdir-bin}/${app.name}-unsigned.apk" />
  57. <property name="out-unsigned-package-ospath" value="${basedir}/${out-unsigned-package}" />
  58. <!-- 证书文件 -->
  59. <property name="keystore-file" value="${key.store}" />
  60. <!-- 已认证apk包 -->
  61. <property name="out-signed-package" value="${outdir-bin}/${app.name}_${pktime}${version}.apk" />
  62. <property name="out-signed-package-ospath" value="${basedir}/${out-signed-package}" />
  63. <target name="buildAll" >
  64. <antcall target="clean" />
  65. <antcall target="init" />
  66. <antcall target="gen-R" />
  67. <antcall target="aidl" />
  68. <antcall target="compile" />
  69. <antcall target="dex" />
  70. <antcall target="package-res-and-assets" />
  71. <antcall target="package" />
  72. <antcall target="jarsigner" />
  73. <antcall target="release" />
  74. </target>
  75. <!-- 初始化工作 -->
  76. <target name="init">
  77. <echo>Initializing all output directories...</echo>
  78. <delete dir="${outdir-bin}" />
  79. <delete dir="${outdir-gen}" />
  80. <mkdir dir="${outdir-bin}" />
  81. <mkdir dir="${outdir-gen}" />
  82. <mkdir dir="${outdir-classes}" />
  83. </target>
  84. <!-- 根据工程中的资源文件生成R.java文件 -->
  85. <target name="gen-R" depends="init">
  86. <echo>Generating R.java from the resources...</echo>
  87. <exec executable="${aapt}" failοnerrοr="true">
  88. <!-- package表示打包-->
  89. <arg value="package" />
  90. <!--m,J,gen表示创建包名的目录和R.java到gen目录下 -->
  91. <arg value="-m" />
  92. <arg value="--auto-add-overlay" />
  93. <arg value="-J" />
  94. <arg value="${outdir-gen}" />
  95. <!-- M指定AndroidManifest.xml文件-->
  96. <arg value="-M" />
  97. <arg value="${manifest-xml}" />
  98. <!-- S指定res目录,生成对应的ID,可多个-->
  99. <arg value="-S" />
  100. <!-- 注意点:同时需要调用Library的res-->
  101. <arg value="${resource-dir}" />
  102. <arg value="-S" />
  103. <arg value="${library-dir}/${resource-dir}" />
  104. <arg value="--extra-packages" />
  105. <arg value="com.mobcent.share.android" />
  106. <arg value="-A" />
  107. <arg value="${asset-dir}" />
  108. <!-- I指定android包的位置-->
  109. <arg value="-I" />
  110. <arg value="${android-jar}" />
  111. <arg value="--auto-add-overlay" /> <!-- 这个重要,覆盖资源,不然报错-->
  112. </exec>
  113. </target>
  114. <!-- 编译aidl文件 -->
  115. <target name="aidl" depends="gen-R">
  116. <echo>Compiling .aidl into java files...</echo>
  117. <apply executable="${aidl}" failοnerrοr="true">
  118. <!-- 指定预处理文件 -->
  119. <arg value="-p${framework-aidl}" />
  120. <!-- aidl声明的目录 -->
  121. <arg value="-I${srcdir}" />
  122. <!-- 目标文件目录 -->
  123. <arg value="-o${outdir-gen}" />
  124. <!-- 指定哪些文件需要编译 -->
  125. <fileset dir="${srcdir}">
  126. <include name="**/*.aidl" />
  127. </fileset>
  128. </apply>
  129. </target>
  130. <!-- 将工程中的java源文件编译成class文件 -->
  131. <target name="compile" depends="aidl">
  132. <echo>Compiling java source code...</echo>
  133. <javac encoding="utf-8" target="1.6" destdir="${outdir-classes}" bootclasspath="${android-jar}">
  134. <src path="src" /> <!-- 工程src目录-->
  135. <src path="gen" /> <!-- 工程gen目录 -->
  136. <classpath>
  137. <fileset dir="${external-lib-ospath}" includes="*.jar" />
  138. </classpath>
  139. </javac>
  140. </target>
  141. <!-- 将.class文件转化成.dex文件 -->
  142. <target name="dex" depends="compile">
  143. <echo>Converting compiled files and external libraries into a .dex
  144. file...
  145. </echo>
  146. <exec executable="${dx}" failοnerrοr="true" >
  147. <arg value="--dex" />
  148. <!-- 输出文件 -->
  149. <arg value="--output=${dex-ospath}" />
  150. <!-- 要生成.dex文件的源classes和libraries -->
  151. <arg value="${outdir-classes-ospath}" /> <!-- classes文件位置 -->
  152. <arg value="${external-lib-ospath}" /> <!-- 把libs下所有jar打包 -->
  153. </exec>
  154. </target>
  155. <!-- 将资源文件放进输出目录 -->
  156. <!--在这截断-->
  157. <target name="package-res-and-assets" depends="dex">
  158. <echo>Packaging resources and assets...</echo>
  159. <exec executable="${aapt}" failοnerrοr="true">
  160. <arg value="package" />
  161. <arg value="-f" /> <!-- 资源覆盖重写 -->
  162. <arg value="-M" />
  163. <arg value="${manifest-xml}" />
  164. <arg value="-S" />
  165. <arg value="${resource-dir}" />
  166. <arg value="-A" />
  167. <arg value="${asset-dir}" />
  168. <arg value="-S" />
  169. <arg value="${library-dir}/${resource-dir}" />
  170. <arg value="-A" /> <!-- asset目录也打包 -->
  171. <arg value="${library-dir}/${asset-dir}" />
  172. <arg value="-I" />
  173. <arg value="${android-jar}" />
  174. <arg value="-F" /> <!-- 输出资源压缩包 -->
  175. <arg value="${resources-package}" />
  176. <arg value="--auto-add-overlay" />
  177. </exec>
  178. </target>
  179. <!-- 打包成未签证的apk -->
  180. <target name="package" depends="dex, package-res-and-assets">
  181. <echo>Packaging unsigned apk for release...</echo>
  182. <exec executable="${apkbuilder}" failοnerrοr="true">
  183. <arg value="${out-unsigned-package-ospath}" /> <!-- 输出 -->
  184. <arg value="-u" /> <!-- u指创建未签名的包-->
  185. <arg value="-z" /> <!-- 资源压缩包 -->
  186. <arg value="${resources-package-ospath}" />
  187. <arg value="-f" /> <!-- dex文件 -->
  188. <arg value="${dex-ospath}" />
  189. <arg value="-rf" />
  190. <arg value="${srcdir-ospath}" />
  191. <arg value="-nf"/> <!-- 把libs下的so库打包 -->
  192. <arg value="${library-dir}/libs"/>
  193. </exec>
  194. <echo>It will need to be signed with jarsigner before being published.
  195. </echo>
  196. </target>
  197. <!-- 对apk进行签证 -->
  198. <target name="jarsigner" depends="package">
  199. <echo>Packaging signed apk for release...</echo>
  200. <exec executable="${jarsigner}" failοnerrοr="true">
  201. <arg value="-keystore" />
  202. <arg value="${keystore-file}" />
  203. <arg value="-storepass" />
  204. <arg value="${key.store.password}" />
  205. <arg value="-keypass" />
  206. <arg value="${key.alias.password}" />
  207. <arg value="-signedjar" />
  208. <arg value="${out-signed-package-ospath}" />
  209. <arg value="${out-unsigned-package-ospath}" />
  210. <!-- 不要忘了证书的别名 -->
  211. <arg value="${key.alias}" />
  212. </exec>
  213. </target>
  214. <!-- 发布 -->
  215. <target name="release" depends="jarsigner">
  216. <!-- 删除未签证apk -->
  217. <delete file="${out-unsigned-package-ospath}" />
  218. <echo>APK is released. path:${out-signed-package-ospath}</echo>
  219. </target>
  220. </project>

代码都有注释,如有不清楚的标签,请查Ant看官网文档。

下面再看看ant.properties文件,具体如下,

  1. #keystore
  2. key.store=E:\\me.keystore
  3. #keystore
  4. key.store.password=111111
  5. #alias
  6. key.alias=xinxing
  7. #alias
  8. key.alias.password=111111
  9. apk.dir=./apk
  10. app.name=ant_app
  11. #
  12. version=(1.2.1)

keystore密码,apk名称,版本号等。

三、打包。

1.首先在命令行下,定位到项目所在的目录,

Center

  1. 在命令行中,输入打包命令,稍等片刻,如出现下面截图,则打包成功,

Center 1

  1. 在项目的根目录下,有一个‘out’文件夹,

Center 2 Center 3

  1. 打包前项目截图 打包后截图

至此,使用Ant打包就完成了!

四、小结。

使用Ant打包Apk的步骤就是上面说的7步,每一步都是生成不同的文件或者文件夹。相信,只要你多加练习,也会掌握的!

PS : Demo工程下载链接

发表评论

表情:
评论列表 (有 0 条评论,365人围观)

还没有评论,来说两句吧...

相关阅读

    相关 使用Ant打包Apk

      文章[ Android 使用Ant打渠道包][Android _Ant]讲解了如何使用Ant打渠道包,没有涉及具体的编译过程,例如使用Ant如何生成R文件等。那么今天,使用

    相关 使用Ant打渠道Apk

    Android打包apk时,有时候需要打各种渠道包,例如 豌豆荚、华为手机市场、小米市场、360市场等,那么每一种渠道打包时,都需要配置不同的数据元,如果渠道较多,那么打包也是

    相关 打包Apk

       开发Android应用,我们总是免不了需要打包Apk,不管你使用的Ide是Android Sutido还是Eclipse,打包都比较简单。我们都知道Eclipse的签名文

    相关 apk打包过程

    在编写android的时候,写好java代码后,eclipse直接帮我们生成了可安装的apk,但有时需要自动化的去生成个性化apk的时候,我们就需要编写脚本或代码来自动生成一个