码迷,mamicode.com
首页 > 移动开发 > 详细

android ant 自动批量打包——带有第三方项目library的情况

时间:2015-01-26 10:14:56      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:ant 批量打包

如果你每次打包都需要不断地手动打包,通过不断地复制粘贴,当你打几百个包的情况下,我相信你一定会疯掉的,当然,这种事情在我们程序员看来,都是可以解决的事情,因为,我们的工作就是让本来繁琐的工作变得简单一点。今天我们就需要简单地介绍一下ant批量打包的问题吧。

网上看到的资料各有千秋吧,现在是时候做一个总结,站在各位大神的肩膀上我们才能够看得更加远。

首先你应该去官网上面下载apache-ant的最新版,我这边使用了一个apache-ant-1.9.4,这是当前的最新版的,现在附上下载链接——可以去我的资源上面去下载,下载链接为:http://download.csdn.net/detail/litianpeng1991/8396457  

下载好了之后,我们开始配置环境 变量,下面是配置过程:

这是我的ant的路径:

技术分享

配置环境变量:

技术分享

技术分享

配置好了之后我们可以去cmd下面验证一下:

技术分享

如果出现上面的情况,说明ant已经配置成功了,接下来我们为了可以实现批量(循环)打包,必须要实用一个jar包——ant-contrib-1.0b3.jar

大家可以去我的资源页上面下载,附上下载链接——http://download.csdn.net/detail/litianpeng1991/8396465 

下载好了之后大家一定要将后缀名从zip改为jar,然后将这个jar包拷贝到apche-ant-1.9.4/lib/文件夹下面

技术分享

接下来就轮到我们project进场了。

1、首先我们进入project的目录下,输入命令,命令格式如下:

android update project --name <project_name> --target <target_ID>--path <path_to_your_project>

http://developer.android.com/tools/projects/projects-cmdline.html 具体如果有不明白的地方可以参考google官方给出的api文档

2、我们将第三方jar包可以直接放在libs文件夹下面,android在编译打包的时候可以自动将这些jar加进去的,但是我们也要考虑到一种情况的,就是android project是支持引用第三方项目library的,就是第三方library是以project的形式存在的,这时候我们应该怎么办呢?

下面介绍解决的办法:(下面的命令都要在一直的 项目目录下,千万别进错了目录)

android project --name 项目名 -p ./ --subprojects

这时候肯定会出现一个问题的:

Error:The project either has no target set or the target is invalid,

Please provide  a --target to the "android.bat update" command.

这是因为我们的第三方项目library其实也是需要进行ant设置的,

这时候我们进行第三方项目的目录下:运行如下命令

android update 第三方项目名 -p ./

运行完这个之后,我们第三方项目目录下应该多了两个文件build.xml和local.properties两个文件

然后我们再进行原来的项目目录下运行原来的命令,但是如果还会出现上面红色标记的问题,此时也可以运行 下面的命令:

 android update project -p . -t android-15 -s(其中这个android-15是可以随便写的,写你自己有的target)

这时候我们会发现我们的项目名下面也会有两个新生成的文件,分别是build.xml和local.properties

build.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project
    name="<span style="background-color: rgb(255, 0, 0);">项目名</span>"
    default="help" >

    <property file="local.properties" />

    <property file="ant.properties" />

    <property environment="env" />

    <condition
        property="sdk.dir"
        value="${env.ANDROID_HOME}" >

        <isset property="env.ANDROID_HOME" />
    </condition>

    <loadproperties srcFile="project.properties" />

    <fail
        message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
        unless="sdk.dir" />

    <import
        file="custom_rules.xml"
        optional="true" />

    <!-- version-tag: 1 -->

    <import file="${sdk.dir}/tools/ant/build.xml" />

</project>
local.properties文件内容如下:

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.

# location of the SDK. This is only used by Ant
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=D:\\android_developer\\androidSDK\\sdk

这时候我们开始编写custom_rules.xml——这是我们新建的一个xml文件,下面的红色部分,要将我们上面下载的jar包放到libs中去

<?xml version="1.0" encoding="UTF-8"?>
<!-- 渠道包打包脚本  ant deploy -->
<project name="custom_rules" >

    <!-- 引用支持循环的jar包ant-contrib-1.0b3.jar -->

    <taskdef resource="net/sf/antcontrib/antcontrib.properties" >

        <classpath>

            <span style="color:#ff0000;"><pathelement location="libs/ant-contrib-1.0b3.jar" /></span>
        </classpath>
    </taskdef>

    <!-- 循环打包,target名为deploy,构建的时候必须选择deploy -->

    <target name="deploy" >

        <!-- 进来的时候先clean一下项目 -->

        <antcall target="clean" />
        <!-- for循环内容传进来的参数为market_channels,以","为分隔构建list,循环读取list,并将读取到的字符串以参数channel传进modify_manifest中 -->

        <foreach
            delimiter=","
            list="${market_channels}"
            param="channel"
            target="modify_manifest" >
        </foreach>
    </target>

    <target name="modify_manifest" >

        <!-- 按正则匹配获取渠道名字,赋给channelname -->

        <propertyregex
            input="${channel}"
            override="true"
            property="channelname"
            regexp="(.*):"
            select="\1" />
        <!-- 按正则匹配获取渠道号码,赋给channelkey -->

        <propertyregex
            input="${channel}"
            override="true"
            property="channelkey"
            regexp=":(.*)"
            select="\1" />
        <!-- 将AndroidManifest.xml中的android:name="channelname"替换成为android:name="${channelname}",这里的${channelname}是我们上面正则匹配出来的内容 -->

        <replaceregexp
            byline="true"
            encoding="utf-8"
            file="AndroidManifest.xml"
            match="android:name="channelname""
            replace="android:name="${channelname}"" />
        <!-- 将AndroidManifest.xml中的android:value="channelkey"替换成为android:value="${channelkey}" -->

        <replaceregexp
            byline="true"
            encoding="utf-8"
            file="AndroidManifest.xml"
            match="android:value="channelkey""
            replace="android:value="${channelkey}"" />

        <!-- 用release打包 -->

        <antcall target="release" />
        <!-- 拷贝渠道包到指定目录下,out.absolute.dir在自带的build.xml中定义了,为bin目录,如果要修改,可以在local.properties中添加一行out.absolute.dir=指定目录 -->

        <copy
            file="${out.absolute.dir}/${ant.project.name}-release.apk"
            tofile="${out.absolute.dir}/out/${ant.project.name}-v${version}-${channelkey}.apk" />

        <!-- 打包完一个渠道包后把渠道名和渠道号替换回原来格式,这样可以进行下一次替换,AndroidManifest.xml里所有匹配的东西都会被替换 -->

        <replaceregexp
            byline="true"
            encoding="utf-8"
            file="AndroidManifest.xml"
            match="android:name="${channelname}""
            replace="android:name="channelname"" />

        <replaceregexp
            byline="true"
            encoding="utf-8"
            file="AndroidManifest.xml"
            match="android:value="${channelkey}""
            replace="android:value="channelkey"" />
    </target>

</project>
接下来还需要新建一个ant.properties配置文件:

key.store=key.store路径
key.store.password=密码
key.alias=写上你的alias
key.alias.password=密码

#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

market_channels=UMENG_CHANNEL:3000,UMENG_CHANNEL:3001,UMENG_CHANNEL:3002

version=1.1.2
写完这个 之后,我们还需要更改AndroidManifest.xml中一处:

        <meta-data android:name="channelname" android:value="channelkey"/>

记住,让这个在一行之中,连空格都要控制好,因为匹配中已经写好了相关的配置。

接下来大家可以运行了,但是如果运行中出现了——因为很多警告导致错误的,

那么大家可以看一看,是不是自己写了混淆文件,不能讲刚刚加入的jar 包混淆,

如果还是出现问题,那么直接添加上忽略warnings就可以了,感谢大家的捧场,希望大家可以多多喜欢。向上吧,少年。




android ant 自动批量打包——带有第三方项目library的情况

标签:ant 批量打包

原文地址:http://blog.csdn.net/litianpenghaha/article/details/43148557

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!