Android多渠道Ant打包

转自:http://zgame.blog.51cto.com/6144241/1075003


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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值