Android多渠道Ant打包详细
最近在制作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
- <projectname="CCGOEQQ"default="release">
- <!--ANT环境变量-->
- <propertyenvironment="env"/>
- <!--使用第三方的ant包,使ant支持for循环-->
- <taskdefresource="net/sf/antcontrib/antcontrib.properties">
- <classpath>
- <pathelementlocation="lib/ant-contrib-1.0b3.jar"/>
- </classpath>
- </taskdef>
- <!--应用名称-->
- <propertyname="appName"value="${ant.project.name}"/>
- <!--SDK目录(获取操作系统环境变量ANDROID_SDK_HOME的值)-->
- <propertyname="sdk-folder"value="${env.ANDROID_SDK_HOME}"/>
- <!--SDK指定平台目录-->
- <propertyname="sdk-platform-folder"value="${sdk-folder}/platforms/android-10"/>
- <!--SDK中tools目录-->
- <propertyname="sdk-tools"value="${sdk-folder}/tools"/>
- <!--SDK指定平台中tools目录-->
- <propertyname="sdk-platform-tools"value="${sdk-folder}/platform-tools"/>
- <!--使用到的命令(当前系统为windows,如果系统为linux,可将.bat文件替换成相对应的命令)-->
- <propertyname="aapt"value="${sdk-platform-tools}/aapt"/>
- <propertyname="aidl"value="${sdk-platform-tools}/aidl"/>
- <propertyname="dx"value="${sdk-platform-tools}/dx.bat"/>
- <propertyname="apkbuilder"value="${sdk-tools}/apkbuilder.bat"/>
- <propertyname="jarsigner"value="${env.JAVA_HOME}/bin/jarsigner"/>
- <propertyname="zipalign"value="${sdk-tools}/zipalign.exe"/>
- <!--编译需要的jar;如果项目使用到地图服务则需要maps.jar-->
- <propertyname="android-jar"value="${sdk-platform-folder}/android.jar"/>
- <propertyname="native.libs.absolute.dir"location="libs"/>
- <!---->
- <propertyname="channelname"value=""/>
- <propertyname="channelkey"value=""/>
- <!--编译aidl文件所需的预处理框架文件framework.aidl-->
- <propertyname="framework-aidl"value="${sdk-platform-folder}/framework.aidl"/>
- <!--清单文件-->
- <propertyname="manifest-xml"value="AndroidManifest.xml"/>
- <!--源文件目录-->
- <propertyname="resource-dir"value="res"/>
- <propertyname="asset-dir"value="assets"/>
- <!--java源文件目录-->
- <propertyname="srcdir"value="src"/>
- <propertyname="srcdir-ospath"value="${basedir}/${srcdir}"/>
- <!--外部类库所在目录-->
- <propertyname="external-lib"value="libs"/>
- <propertyname="external-lib-ospath"value="${basedir}/${external-lib}"/>
- <propertyname="external-lib-ospath_so"value="${basedir}/${external-lib}/armeabi"/>
- <!--定义你需要打包的渠道******改下面-->
- <!--渠道名:渠道号-->
- <propertyname="key"value="2002:2002"/>
- <propertyname="configFile"value="test"/>
- <!--!!!!!!!!!!!!!!!!!!-->
- <!--版本-->
- <propertyname="version"value="0.9.1"/>
- <!--每次升级加1-->
- <propertyname="versioncode"value="6"/>
- <!--初始化工作-->
- <targetname="init">
- <echo>目录初始化....</echo>
- <!--生成R文件的相对目录-->
- <varname="outdir-gen"value="gen"/>
- <!--编译后的文件放置目录-->
- <varname="outdir-bin"value="bin-${channelname}"/>
- <!--生成class目录-->
- <varname="outdir-classes"value="${outdir-bin}"/>
- <varname="outdir-classes-ospath"value="${basedir}/${outdir-classes}"/>
- <!--classes.dex相关变量-->
- <varname="dex-file"value="classes.dex"/>
- <varname="dex-path"value="${outdir-bin}/${dex-file}"/>
- <varname="dex-ospath"value="${basedir}/${dex-path}"/>
- <!--经过aapt生成的资源包文件-->
- <varname="resources-package"value="${outdir-bin}/resources.ap_"/>
- <varname="resources-package-ospath"value="${basedir}/${resources-package}"/>
- <varname="libs-package"value="${outdir-bin}/libs"/>
- <!--未认证apk包-->
- <varname="out-unsigned-package"value="${outdir-bin}/${appName}-unsigned.apk"/>
- <varname="out-unsigned-package-ospath"value="${basedir}/${out-unsigned-package}"/>
- <!--证书文件-->
- <varname="keystore-file"value="${basedir}/elex.keystore"/>
- <!--已认证apk包-->
- <varname="out-signed-package"value="${outdir-bin}/${appName}-${channelname}-${version}.apk"/>
- <varname="out-signed-package-ospath"value="${basedir}/${out-signed-package}"/>
- <deletedir="${outdir-bin}"/>
- <mkdirdir="${outdir-bin}"/>
- <mkdirdir="${outdir-classes}"/>
- </target>
- <!--循环打包-->
- <targetname="deploy">
- <foreachtarget="modify_manifest"list="${key}"param="nameandchannel"delimiter=",">
- </foreach>
- </target>
- <targetname="modify_manifest">
- <!--获取渠道名字-->
- <propertyregexoverride="true"property="channelname"input="${nameandchannel}"regexp="(.*):"select="\1"/>
- <!--获取渠道号码-->
- <propertyregexoverride="true"property="channelkey"input="${nameandchannel}"regexp=":(.*)"select="\1"/>
- <!--正则匹配替换渠道号-->
- <!--(.*)为正则匹配任意文本-->
- <!--\1是一个反向引用</channelID>-->
- <!--换包名,versionname,versioncode-->
- <replaceregexpflags="g"byline="false"encoding="UTF-8">
- <regexppattern='package="(.*)"android:versionCode="(.*)"android:versionName="(.*)"'/>
- <substitutionexpression='package="com.elextech.goeqq${channelname}"android:versionCode="${versioncode}"android:versionName="${version}"'/>
- <filesetdir=""includes="AndroidManifest.xml"/>
- </replaceregexp>
- <!--修改cannelID还有configFile-->
- <replacedir="${basedir}/res/raw"includes="**/*.xml"token="channelId>8888"value="channelId>${channelkey}"/>
- <replacedir="${basedir}/res/raw"includes="**/*.xml"token="configFile>test"value="configFile>${configFile}"/>
- <antcalltarget="CAOrelease"/>
- </target>
- <!--根据工程中的资源文件生成R.java文件-->
- <targetname="gen-R"depends="init">
- <echo>生成R.java文件....</echo>
- <execexecutable="${aapt}"failonerror="true">
- <argvalue="package"/>
- <argvalue="-f"/>
- <argvalue="-m"/>
- <argvalue="-J"/>
- <argvalue="${outdir-gen}"/>
- <argvalue="-S"/>
- <argvalue="${resource-dir}"/>
- <argvalue="-M"/>
- <argvalue="${manifest-xml}"/>
- <argvalue="-I"/>
- <argvalue="${android-jar}"/>
- </exec>
- </target>
- <!--编译aidl文件-->
- <targetname="aidl"depends="gen-R">
- <echo>编译aidl文件....</echo>
- <applyexecutable="${aidl}"failonerror="true">
- <!--指定预处理文件-->
- <argvalue="-p${framework-aidl}"/>
- <!--aidl声明的目录-->
- <argvalue="-I${srcdir}"/>
- <!--目标文件目录-->
- <argvalue="-o${outdir-gen}"/>
- <!--指定哪些文件需要编译-->
- <filesetdir="${srcdir}">
- <includename="**/*.aidl"/>
- </fileset>
- </apply>
- </target>
- <!--将工程中的java源文件编译成class文件-->
- <targetname="compile"depends="aidl">
- <echo>java源文件编译成class文件....GBK</echo>
- <javacencoding="utf-8"
- target="1.6"
- srcdir="."
- destdir="${outdir-classes}"
- bootclasspath="${android-jar}"
- verbose="false"
- >
- <compilerargline="-encodingUTF-8"/>
- <classpath>
- <filesetdir="${external-lib}"includes="*.jar"/>
- </classpath>
- </javac>
- </target>
- <!--将.class文件转化成.dex文件-->
- <targetname="dex"depends="compile">
- <echo>将.class文件转化成.dex文件....</echo>
- <execexecutable="${dx}"failonerror="true">
- <argvalue="--dex"/>
- <!--输出文件-->
- <argvalue="--output=${dex-ospath}"/>
- <!--要生成.dex文件的源classes和libraries-->
- <argvalue="${outdir-classes-ospath}"/>
- <argvalue="${external-lib-ospath}"/>
- </exec>
- </target>
- <!--将资源文件放进输出目录-->
- <targetname="package-res-and-assets">
- <echo>将资源文件放进输出目录....</echo>
- <execexecutable="${aapt}"failonerror="true">
- <argvalue="package"/>
- <argvalue="-f"/>
- <argvalue="-M"/>
- <argvalue="${manifest-xml}"/>
- <argvalue="-S"/>
- <argvalue="${resource-dir}"/>
- <argvalue="-A"/>
- <argvalue="${asset-dir}"/>
- <argvalue="-I"/>
- <argvalue="${android-jar}"/>
- <argvalue="-F"/>
- <argvalue="${resources-package}"/>
- </exec>
- </target>
- <!--打包成未签证的apk-->
- <targetname="package"depends="dex,package-res-and-assets">
- <echo>打包成未签证的apk....</echo>
- <execexecutable="${apkbuilder}"failonerror="true">
- <argvalue="${out-unsigned-package-ospath}"/>
- <argvalue="-u"/>
- <argvalue="-z"/>
- <argvalue="${resources-package-ospath}"/>
- <argvalue="-f"/>
- <argvalue="${dex-ospath}"/>
- <argvalue="-rf"/>
- <argvalue="${srcdir-ospath}"/>
- <argvalue="-nf"/>
- <argvalue="${external-lib-ospath}"/>
- </exec>
- </target>
- <!--对apk进行签证-->
- <targetname="jarsigner"depends="package">
- <echo>Packagingsignedapkforrelease...</echo>
- <execexecutable="${jarsigner}"failonerror="true">
- <argline="-verbose-digestalgSHA1-sigalgMD5withRSA"/>
- <argvalue="-keystore"/>
- <argvalue="${keystore-file}"/>
- <argvalue="-storepass"/>
- <argvalue="123456"/>
- <argvalue="-keypass"/>
- <argvalue="123456"/>
- <argvalue="-signedjar"/>
- <argvalue="${out-signed-package-ospath}"/>
- <argvalue="${out-unsigned-package-ospath}"/>
- <!--不要忘了证书的别名-->
- <argvalue="elex.keystore"/>
- </exec>
- </target>
- <!--发布-->
- <targetname="release"depends="jarsigner">
- <!--删除未签证apk-->
- <deletefile="${out-unsigned-package-ospath}"/>
- <!--删除其他文件-->
- <deletefile="${resources-package}"/>
- <deletefile="${dex-path}"/>
- <echo>APKisreleased.path:${out-signed-package-ospath}</echo>
- </target>
- <targetname="zipalign"depends="release">
- <execexecutable="${zipalign}"failonerror="true">
- <argvalue="-v"/>
- <argvalue="4"/>
- <argvalue="${out-signed-package-ospath}"/>
- <argvalue="${out-signed-package-ospath}-zipaligned.apk"/>
- </exec>
- </target>
- <!--整理目录-->
- <targetname="CAOrelease"depends="zipalign">
- <!--删除没优化apk-->
- <deletefile="${out-signed-package-ospath}"/>
- <!--删除其他文件-->
- <deletedir="${outdir-bin}/org"/>
- <deletedir="${outdir-bin}/com"/>
- <!--修改cannelID-->
- <replacedir="${basedir}/res/raw"includes="**/*.xml"token="channelId>${channelkey}"value="channelId>8888"/>
- <replacedir="${basedir}/res/raw"includes="**/*.xml"token="configFile>${configFile}"value="configFile>test"/>
- <echo>CAOClean</echo>
- </target>
- </project>
更多相关文章
- Android(安卓)P Image编译
- android apk 防止反编译技术第三篇-加密
- Android(安卓)NDK 开发教程六: application.mk
- 算法移植优化(一)android 学习笔记
- Android(安卓)NDK安装
- 使用ProGuard遇到“conversion to Dalvik format failed with er
- 在Ubuntu上下载、编译和安装Android最新源码
- Could not get BatchedBridge, make sure your bundle is packag
- android XML文件解析之 SAX解析方法