Ant自动打包循环打包的流程
ant的功能:修改项目包名,资源文件替换,批量修改Java,xml代码,循环打包
- 安装配置ant环境
- cmd到工程目录下,执行 android update project -p project_path
- 如果有依赖的工程,在该工程下执行2步骤。可以看到工程目录下生成了build.xml以及local.properties
- 在主工程创建ant.properties文件配置keynote,还可以配置APK文件输出目录等。
- 创建custom_rules.xml,custom_rules是配置在build.xml中的自定义规则。custom_rules可以配置一系列替换应用资源,包名,渠道,第三方appKey等等操作。
- 配置完成后,在主工程执行 ant release 打包结束。
配置ant
1.下载ant
官方主页http://ant.apache.org/bindownload.cgi下载(目前为Ant1.9.7,windows选择zip包)
2.配置ant环境变量
window中设置ant环境变量:
ANT_HOME C:/ apache-ant-1.9.7(你的ant目录)
path C:/ apache-ant-1.9.7/bin
classpath C:/apache-ant-1.9.7/lib
注意path要放在用户的path里。完成后cmd ant 验证,如果出现如下内容,说明安装成功:
Buildfile: build.xml does not exist!
Build failed
生成工程配置文件
cmd到工程目录下,执行 android update project -p project_path (project_path 是你的工程目录)
如果有依赖的工程,在该工程下执行该步骤。可以看到工程目录下生成了build.xml以及local.properties
* local.properties里sdk.dir是你的安卓SDK目录
* build.xml 最后有一段 <import file="${sdk.dir}/tools/ant/build.xml" />
* 这个目录指向sdk目录下的Google配置的build.xml 如果需要自己配置,请自行修改
顺利的话,这一步已经可以用 cmd ant release 打包了,下一步是自定义修改工程里的包名,图片资源,渠道等。
自定义配置
- 在主工程目录下创建 custom_rules.xml ,ant.properties 文件
- ant.properties 主要写入工程路径,安装包输出路径,keystore输出路径,以及你要修改的包名,图片资源路径等等。例:
#项目地址
project.dir=D:\\cubecloudcity
#图片资源的路径
#更换图片时,将图片放置进该文件夹并覆盖旧文件
image_res_path=D:\\cubecloudcity\\imageRes
#编译输出绝对路径
out.absolute.dir=E:\\apk_release
#生成文件绝对路径
gos.path=E:\\apk_release
#key路径
key.store=E:\\apk_release\\keystore\\keynote(mfkj2016)
custom_rules
这里主要解释ant的替换流程以及代码注释 custom_rules 一般写法:
<?xml version="1.0" encoding="UTF-8"?>
<project
name="custom_rules"
default="release" >
<!-- 主工程 project 在这里创建一个 name="basedir"的property 就可以在下面的代码里引用 引用格式为${*} -->
<property
name="basedir"
value="${project.dir}/project" />
<!-- target 的名字是ant规定的,详细cmd ant -help 或 google,这里不赘述 -pre-build 是准备打包 -->
<target name="-pre-build">
<!-- 替换图片资源的实现-->
<!-- 删除 image_res.dir 目录-->
<delete dir="${image_res.dir}" />
<!-- 创建 image_res.dir 目录-->
<mkdir dir="${image_res.dir}" />
<!-- 复制文件到 image_res.dir 目录 fileset dir 是文件来源目录,includes:文件匹配规则 **/* 代表所有文件包含子目录文件 如果仅复制图片可以 写成 *.jpg or *.png -->
<copy todir="${image_res.dir}" >
<fileset
dir="${image_res_path}"
includes="**/*" />
</copy>
<!-- 修改string.xml replaceregexp 表示替换的正则表达式 -->
<replaceregexp
byline="true"
encoding="UTF-8"
flags="g" >
<!-- 要替换的字符串 -->
<regexp pattern="${old_name}" />
<!-- 新的字符串 -->
<substitution expression="${new_name}" />
<!-- res_dir 是我的res目录 -->
<fileset
dir="${res_dir}/values"
includes="strings.xml" />
</replaceregexp>
<!-- 修改Java代码 -->
<!-- 例:替换旧版本的请求网址 -->
<replaceregexp
byline="true"
encoding="UTF-8"
flags="g" >
<!-- 要替换的旧版本的请求网址-->
<regexp pattern="${coc_old_request_port}" />
<!-- 新地址-->
<substitution expression="${coc_new_request_port}" />
<!-- coc_request_url_path 指向Constant.java文件父目录-->
<!-- 这里是修改了Constant.java 里的旧版本请求地址-->
<fileset
dir="${coc_request_url_path}"
includes="Constant.java" />
</replaceregexp>
<!-- 替换包名,同样的替换规则,不过修改包名不仅仅是要替换AndroidManifest中的包名,Java代码中的packageName.R文件、布局文件中的res/package_name都要修改。 -->
<replaceregexp
byline="true"
encoding="UTF-8"
flags="g" >
<regexp pattern="${old_package_name}" />
<substitution expression="${new_package_name}" />
<!-- 替换AndroidManifest-->
<fileset
dir="${basedir}"
includes="AndroidManifest.xml" />
</replaceregexp>
<replaceregexp
byline="true"
encoding="UTF-8"
flags="g" >
<regexp pattern="import(.*)${old_package_name}.R" />
<substitution expression="import ${new_package_name}.R" />
<!-- 替换Java文件中出现过的包名-->
<fileset
dir="${basedir}/src"
includes="**/*.java" />
</replaceregexp>
<replaceregexp
byline="true"
encoding="UTF-8"
flags="g" >
<regexp pattern="res/${old_package_name}" />
<substitution expression="res/${new_package_name}" />
<!-- 替换布局文件中出现过的包名-->
<fileset
dir="${basedir}/res/layout"
includes="*.xml" />
</replaceregexp>
<!-- 替换渠道,appkey等 -->
<!-- 这一步是替换写在 AndroidManifest 中
<meta-data android:name="UMENG_APPKEY" android:value="50000000" />
这里要注意 regexp pattern 正则表达式要与你写的meta-data匹配,强烈要求写成单行的模式 <meta-data name=* value=* /> 注意空格,不要回车!不要回车!不要回车!
-->
<replaceregexp
byline="true"
encoding="UTF-8"
flags="g" >
<!-- 因为name=""里包含了双引号,所以要用单引号。pattern='' 或者换成 " 转义-->
<regexp pattern='android:name="UMENG_APPKEY" android:value="(.*)"' />
<substitution expression='android:name="UMENG_APPKEY" android:value="${new_um_ak}"' />
<fileset
dir="${basedir}"
includes="AndroidManifest.xml" />
</replaceregexp>
<!-- 循环打包的需要请到网上搜索,歇会再写 -->
<!-- 算是写完 custom_rules.xml 了 -->
</target>
</project>
最后 cmd 到主工程目录下运行 ant release 就结束了
出现问题请查看cmd里的错误提示,注意备份。
android.lyq@foxmail.com