最近在制作cocos2dx网游项目,在android跟腾讯合作方面, 有90多个渠道,所以制作了ant批量打包,网上资料不少但是要么没有细节,要么少东西,所以我把容易出问题的地方都列出来了。

ant下载:http://ant.apache.org/

ant-Contribhttp://ant-contrib.sourceforge.net/

ant-Contrib是用来批量执行的ant拓展,放到ant的lib目录下面

下面是build.xml注意事项

1. ANDROID_SDK_HOME为环境变量中的配置的android sdk目录

2. key 是渠道的list, 格式是channelname:channelID,channelname:channelID,.....

3. configFile是修改res/raw/aj_user_config.xml中<configFile>test</configFile>,这个是腾讯sdk的配置文件

4. version对应修改manifest中的version name

5. versioncode对应修改manifest中的versioncode

6. 另外apk的包名会根据channelID变化

7. <target name="deploy">这里开始了批量打包的循环,然后循环修改各个channel的对应文件

8. APK的打包流程:1)生成R文件 2)编译aidl 3)编译java文件 4)转换dex 5)copy资源 6)打包apk 7)apk签名 8)优化

9. 要注意java sdk的问题, ant跟1.7在几个地方兼容不好, 如果出现签名问题(加密算法问题)或者运行问题, 把java sdk的环境目录设置成1.6的。

10.因为要修改腾讯sdk里面的xml配置文件, 但是这块正则匹配不太好使,ant老报错,所以只能使用字符替换,所以在腾讯sdk里面的xml都设置了默认的替换值, 改一个之后再自动改回来。

11. 要把so文件也打入到apk中,在<exec executable="${apkbuilder}"这里, 加入-nf即可,下面代码里面有例子。

运行:可以写个批处理或者直接输入ant deploy即可!

下面是build.xml

        
  1. <projectname="CCGOEQQ"default="release">
  2. <!--ANT环境变量-->
  3. <propertyenvironment="env"/>
  4. <!--使用第三方的ant包,使ant支持for循环-->
  5. <taskdefresource="net/sf/antcontrib/antcontrib.properties">
  6. <classpath>
  7. <pathelementlocation="lib/ant-contrib-1.0b3.jar"/>
  8. </classpath>
  9. </taskdef>
  10. <!--应用名称-->
  11. <propertyname="appName"value="${ant.project.name}"/>
  12. <!--SDK目录(获取操作系统环境变量ANDROID_SDK_HOME的值)-->
  13. <propertyname="sdk-folder"value="${env.ANDROID_SDK_HOME}"/>
  14. <!--SDK指定平台目录-->
  15. <propertyname="sdk-platform-folder"value="${sdk-folder}/platforms/android-10"/>
  16. <!--SDK中tools目录-->
  17. <propertyname="sdk-tools"value="${sdk-folder}/tools"/>
  18. <!--SDK指定平台中tools目录-->
  19. <propertyname="sdk-platform-tools"value="${sdk-folder}/platform-tools"/>
  20. <!--使用到的命令(当前系统为windows,如果系统为linux,可将.bat文件替换成相对应的命令)-->
  21. <propertyname="aapt"value="${sdk-platform-tools}/aapt"/>
  22. <propertyname="aidl"value="${sdk-platform-tools}/aidl"/>
  23. <propertyname="dx"value="${sdk-platform-tools}/dx.bat"/>
  24. <propertyname="apkbuilder"value="${sdk-tools}/apkbuilder.bat"/>
  25. <propertyname="jarsigner"value="${env.JAVA_HOME}/bin/jarsigner"/>
  26. <propertyname="zipalign"value="${sdk-tools}/zipalign.exe"/>
  27. <!--编译需要的jar;如果项目使用到地图服务则需要maps.jar-->
  28. <propertyname="android-jar"value="${sdk-platform-folder}/android.jar"/>
  29. <propertyname="native.libs.absolute.dir"location="libs"/>
  30. <!---->
  31. <propertyname="channelname"value=""/>
  32. <propertyname="channelkey"value=""/>
  33. <!--编译aidl文件所需的预处理框架文件framework.aidl-->
  34. <propertyname="framework-aidl"value="${sdk-platform-folder}/framework.aidl"/>
  35. <!--清单文件-->
  36. <propertyname="manifest-xml"value="AndroidManifest.xml"/>
  37. <!--源文件目录-->
  38. <propertyname="resource-dir"value="res"/>
  39. <propertyname="asset-dir"value="assets"/>
  40. <!--java源文件目录-->
  41. <propertyname="srcdir"value="src"/>
  42. <propertyname="srcdir-ospath"value="${basedir}/${srcdir}"/>
  43. <!--外部类库所在目录-->
  44. <propertyname="external-lib"value="libs"/>
  45. <propertyname="external-lib-ospath"value="${basedir}/${external-lib}"/>
  46. <propertyname="external-lib-ospath_so"value="${basedir}/${external-lib}/armeabi"/>
  47. <!--定义你需要打包的渠道******改下面-->
  48. <!--渠道名:渠道号-->
  49. <propertyname="key"value="2002:2002"/>
  50. <propertyname="configFile"value="test"/>
  51. <!--!!!!!!!!!!!!!!!!!!-->
  52. <!--版本-->
  53. <propertyname="version"value="0.9.1"/>
  54. <!--每次升级加1-->
  55. <propertyname="versioncode"value="6"/>
  56. <!--初始化工作-->
  57. <targetname="init">
  58. <echo>目录初始化....</echo>
  59. <!--生成R文件的相对目录-->
  60. <varname="outdir-gen"value="gen"/>
  61. <!--编译后的文件放置目录-->
  62. <varname="outdir-bin"value="bin-${channelname}"/>
  63. <!--生成class目录-->
  64. <varname="outdir-classes"value="${outdir-bin}"/>
  65. <varname="outdir-classes-ospath"value="${basedir}/${outdir-classes}"/>
  66. <!--classes.dex相关变量-->
  67. <varname="dex-file"value="classes.dex"/>
  68. <varname="dex-path"value="${outdir-bin}/${dex-file}"/>
  69. <varname="dex-ospath"value="${basedir}/${dex-path}"/>
  70. <!--经过aapt生成的资源包文件-->
  71. <varname="resources-package"value="${outdir-bin}/resources.ap_"/>
  72. <varname="resources-package-ospath"value="${basedir}/${resources-package}"/>
  73. <varname="libs-package"value="${outdir-bin}/libs"/>
  74. <!--未认证apk包-->
  75. <varname="out-unsigned-package"value="${outdir-bin}/${appName}-unsigned.apk"/>
  76. <varname="out-unsigned-package-ospath"value="${basedir}/${out-unsigned-package}"/>
  77. <!--证书文件-->
  78. <varname="keystore-file"value="${basedir}/elex.keystore"/>
  79. <!--已认证apk包-->
  80. <varname="out-signed-package"value="${outdir-bin}/${appName}-${channelname}-${version}.apk"/>
  81. <varname="out-signed-package-ospath"value="${basedir}/${out-signed-package}"/>
  82. <deletedir="${outdir-bin}"/>
  83. <mkdirdir="${outdir-bin}"/>
  84. <mkdirdir="${outdir-classes}"/>
  85. </target>
  86. <!--循环打包-->
  87. <targetname="deploy">
  88. <foreachtarget="modify_manifest"list="${key}"param="nameandchannel"delimiter=",">
  89. </foreach>
  90. </target>
  91. <targetname="modify_manifest">
  92. <!--获取渠道名字-->
  93. <propertyregexoverride="true"property="channelname"input="${nameandchannel}"regexp="(.*):"select="\1"/>
  94. <!--获取渠道号码-->
  95. <propertyregexoverride="true"property="channelkey"input="${nameandchannel}"regexp=":(.*)"select="\1"/>
  96. <!--正则匹配替换渠道号-->
  97. <!--(.*)为正则匹配任意文本-->
  98. <!--\1是一个反向引用</channelID>-->
  99. <!--换包名,versionname,versioncode-->
  100. <replaceregexpflags="g"byline="false"encoding="UTF-8">
  101. <regexppattern='package="(.*)"android:versionCode="(.*)"android:versionName="(.*)"'/>
  102. <substitutionexpression='package="com.elextech.goeqq${channelname}"android:versionCode="${versioncode}"android:versionName="${version}"'/>
  103. <filesetdir=""includes="AndroidManifest.xml"/>
  104. </replaceregexp>
  105. <!--修改cannelID还有configFile-->
  106. <replacedir="${basedir}/res/raw"includes="**/*.xml"token="channelId>8888"value="channelId>${channelkey}"/>
  107. <replacedir="${basedir}/res/raw"includes="**/*.xml"token="configFile>test"value="configFile>${configFile}"/>
  108. <antcalltarget="CAOrelease"/>
  109. </target>
  110. <!--根据工程中的资源文件生成R.java文件-->
  111. <targetname="gen-R"depends="init">
  112. <echo>生成R.java文件....</echo>
  113. <execexecutable="${aapt}"failonerror="true">
  114. <argvalue="package"/>
  115. <argvalue="-f"/>
  116. <argvalue="-m"/>
  117. <argvalue="-J"/>
  118. <argvalue="${outdir-gen}"/>
  119. <argvalue="-S"/>
  120. <argvalue="${resource-dir}"/>
  121. <argvalue="-M"/>
  122. <argvalue="${manifest-xml}"/>
  123. <argvalue="-I"/>
  124. <argvalue="${android-jar}"/>
  125. </exec>
  126. </target>
  127. <!--编译aidl文件-->
  128. <targetname="aidl"depends="gen-R">
  129. <echo>编译aidl文件....</echo>
  130. <applyexecutable="${aidl}"failonerror="true">
  131. <!--指定预处理文件-->
  132. <argvalue="-p${framework-aidl}"/>
  133. <!--aidl声明的目录-->
  134. <argvalue="-I${srcdir}"/>
  135. <!--目标文件目录-->
  136. <argvalue="-o${outdir-gen}"/>
  137. <!--指定哪些文件需要编译-->
  138. <filesetdir="${srcdir}">
  139. <includename="**/*.aidl"/>
  140. </fileset>
  141. </apply>
  142. </target>
  143. <!--将工程中的java源文件编译成class文件-->
  144. <targetname="compile"depends="aidl">
  145. <echo>java源文件编译成class文件....GBK</echo>
  146. <javacencoding="utf-8"
  147. target="1.6"
  148. srcdir="."
  149. destdir="${outdir-classes}"
  150. bootclasspath="${android-jar}"
  151. verbose="false"
  152. >
  153. <compilerargline="-encodingUTF-8"/>
  154. <classpath>
  155. <filesetdir="${external-lib}"includes="*.jar"/>
  156. </classpath>
  157. </javac>
  158. </target>
  159. <!--将.class文件转化成.dex文件-->
  160. <targetname="dex"depends="compile">
  161. <echo>将.class文件转化成.dex文件....</echo>
  162. <execexecutable="${dx}"failonerror="true">
  163. <argvalue="--dex"/>
  164. <!--输出文件-->
  165. <argvalue="--output=${dex-ospath}"/>
  166. <!--要生成.dex文件的源classes和libraries-->
  167. <argvalue="${outdir-classes-ospath}"/>
  168. <argvalue="${external-lib-ospath}"/>
  169. </exec>
  170. </target>
  171. <!--将资源文件放进输出目录-->
  172. <targetname="package-res-and-assets">
  173. <echo>将资源文件放进输出目录....</echo>
  174. <execexecutable="${aapt}"failonerror="true">
  175. <argvalue="package"/>
  176. <argvalue="-f"/>
  177. <argvalue="-M"/>
  178. <argvalue="${manifest-xml}"/>
  179. <argvalue="-S"/>
  180. <argvalue="${resource-dir}"/>
  181. <argvalue="-A"/>
  182. <argvalue="${asset-dir}"/>
  183. <argvalue="-I"/>
  184. <argvalue="${android-jar}"/>
  185. <argvalue="-F"/>
  186. <argvalue="${resources-package}"/>
  187. </exec>
  188. </target>
  189. <!--打包成未签证的apk-->
  190. <targetname="package"depends="dex,package-res-and-assets">
  191. <echo>打包成未签证的apk....</echo>
  192. <execexecutable="${apkbuilder}"failonerror="true">
  193. <argvalue="${out-unsigned-package-ospath}"/>
  194. <argvalue="-u"/>
  195. <argvalue="-z"/>
  196. <argvalue="${resources-package-ospath}"/>
  197. <argvalue="-f"/>
  198. <argvalue="${dex-ospath}"/>
  199. <argvalue="-rf"/>
  200. <argvalue="${srcdir-ospath}"/>
  201. <argvalue="-nf"/>
  202. <argvalue="${external-lib-ospath}"/>
  203. </exec>
  204. </target>
  205. <!--对apk进行签证-->
  206. <targetname="jarsigner"depends="package">
  207. <echo>Packagingsignedapkforrelease...</echo>
  208. <execexecutable="${jarsigner}"failonerror="true">
  209. <argline="-verbose-digestalgSHA1-sigalgMD5withRSA"/>
  210. <argvalue="-keystore"/>
  211. <argvalue="${keystore-file}"/>
  212. <argvalue="-storepass"/>
  213. <argvalue="123456"/>
  214. <argvalue="-keypass"/>
  215. <argvalue="123456"/>
  216. <argvalue="-signedjar"/>
  217. <argvalue="${out-signed-package-ospath}"/>
  218. <argvalue="${out-unsigned-package-ospath}"/>
  219. <!--不要忘了证书的别名-->
  220. <argvalue="elex.keystore"/>
  221. </exec>
  222. </target>
  223. <!--发布-->
  224. <targetname="release"depends="jarsigner">
  225. <!--删除未签证apk-->
  226. <deletefile="${out-unsigned-package-ospath}"/>
  227. <!--删除其他文件-->
  228. <deletefile="${resources-package}"/>
  229. <deletefile="${dex-path}"/>
  230. <echo>APKisreleased.path:${out-signed-package-ospath}</echo>
  231. </target>
  232. <targetname="zipalign"depends="release">
  233. <execexecutable="${zipalign}"failonerror="true">
  234. <argvalue="-v"/>
  235. <argvalue="4"/>
  236. <argvalue="${out-signed-package-ospath}"/>
  237. <argvalue="${out-signed-package-ospath}-zipaligned.apk"/>
  238. </exec>
  239. </target>
  240. <!--整理目录-->
  241. <targetname="CAOrelease"depends="zipalign">
  242. <!--删除没优化apk-->
  243. <deletefile="${out-signed-package-ospath}"/>
  244. <!--删除其他文件-->
  245. <deletedir="${outdir-bin}/org"/>
  246. <deletedir="${outdir-bin}/com"/>
  247. <!--修改cannelID-->
  248. <replacedir="${basedir}/res/raw"includes="**/*.xml"token="channelId>${channelkey}"value="channelId>8888"/>
  249. <replacedir="${basedir}/res/raw"includes="**/*.xml"token="configFile>${configFile}"value="configFile>test"/>
  250. <echo>CAOClean</echo>
  251. </target>
  252. </project>

更多相关文章

  1. Android(安卓)P Image编译
  2. android apk 防止反编译技术第三篇-加密
  3. Android(安卓)NDK 开发教程六: application.mk
  4. 算法移植优化(一)android 学习笔记
  5. Android(安卓)NDK安装
  6. 使用ProGuard遇到“conversion to Dalvik format failed with er
  7. 在Ubuntu上下载、编译和安装Android最新源码
  8. Could not get BatchedBridge, make sure your bundle is packag
  9. android XML文件解析之 SAX解析方法

随机推荐

  1. Android-webview教程一
  2. OpenCore框架概述(二)
  3. Android基础之Android动画
  4. Android4.4 Telephony流程分析——联系人
  5. android 调试跟踪framework层代码
  6. Android(安卓)JNI代码
  7. Android数据手册:Android颜色码制表
  8. Android(安卓)EventBus实战 没听过你就ou
  9. Android(安卓)学习系列 - Fragment
  10. 设备管理器权限- Android