Ant自动打包、多渠道打包的实现

Ant自动打包循环打包的流程

ant的功能:修改项目包名,资源文件替换,批量修改Java,xml代码,循环打包

  1. 安装配置ant环境
  2. cmd到工程目录下,执行 android update project -p project_path
  3. 如果有依赖的工程,在该工程下执行2步骤。可以看到工程目录下生成了build.xml以及local.properties
  4. 在主工程创建ant.properties文件配置keynote,还可以配置APK文件输出目录等。
  5. 创建custom_rules.xml,custom_rules是配置在build.xml中的自定义规则。custom_rules可以配置一系列替换应用资源,包名,渠道,第三方appKey等等操作。
  6. 配置完成后,在主工程执行 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 打包了,下一步是自定义修改工程里的包名,图片资源,渠道等。

自定义配置
  1. 在主工程目录下创建 custom_rules.xml ,ant.properties 文件
  2. 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='' 或者换成 &quot; 转义-->
            <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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值