android Ant 批量多渠道打包

2024-08-23 15:38

本文主要是介绍android Ant 批量多渠道打包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


原帖:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=323111&highlight=ant  

参考贴:http://blog.csdn.net/tenggangren/article/details/8051937

             http://www.cnblogs.com/qianxudetianxia/archive/2012/07/04/2573687.html


实例工程、所需的文件都在最后的附件中。


    今天花费了几个小时,参考网上的资料,期间遇到了好几个问题, 终于实现了使用Ant批量多渠道打包,现在,梳理一下思路,总结使用Ant批量多渠道打包的方法:1.  下载安装Ant,不是使用Androis sdk 或者 Eclipse中的Ant,而是去官网下载完整的Ant。官网: http://ant.apache.org/ 


1) 解压Ant,比如解压到D:\Android\Ant
2) 我的电脑->属性->高级->环境变量 
3) 系统变量新建ANT_HOME,变量值为D:\Android\Ant 
4) 系统变量新建或修改path,变量值为%ANT_HOME%\bin 



测试ant是否成功,你可以在控制台输入Cmd 回车, ant 回车。如果出现

Buildfile: build.xml does not exist!

Build failed

恭喜你已经ant安装完毕了!!


2. 安装扩展包 Ant-contrib,支持循环打包。
1) 到http://sourceforge.net/projects/ant-contrib/files/ant-contrib/ 下载1.0b3
2) 从下载的压缩包中复制ant-contrib-1.0b3.jar,到放到Ant的lib文件夹中。


3. 复制签名key文件“gaoxin.key”到工程的更目录下。


4. 在工程的根目录下创建文件build.xml。
[mw_shl_code=java,true]<project
    name="TestMutilChannelApk"
    default="release" >

    <!-- ANT环境变量 -->

    <property environment="env" />
    <!-- 使用第三方的ant包,使ant支持for循环 -->

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

        <classpath>

            <pathelement location="D:/Android/Ant/lib/ant-contrib-1.0b3.jar" />
        </classpath>
    </taskdef>
    <!-- 应用名称 -->

    <property
        name="appName"
        value="${ant.project.name}" />
    <!-- SDK目录(获取操作系统环境变量ANDROID_SDK_HOME的值) -->

    <property
        name="sdk-folder"
        value="D:/Android/adt-bundle-windows-x86_64-20131030/sdk" />
    <!-- SDK指定平台目录 -->

    <property
        name="sdk-platform-folder"
        value="${sdk-folder}/platforms/android-8" />
    <!-- SDK中tools目录 -->

    <property
        name="sdk-tools"
        value="${sdk-folder}/tools" />
    <!-- SDK指定平台中tools目录 -->

    <property
        name="sdk-platform-tools"
        value="${sdk-folder}/platform-tools" />

    <!-- 使用到的命令(当前系统为windows,如果系统为linux,可将.bat文件替换成相对应的命令) -->

    <property
        name="aapt"
        value="${sdk-platform-tools}/aapt" />

    <property
        name="aidl"
        value="${sdk-platform-tools}/aidl" />

    <property
        name="dx"
        value="${sdk-platform-tools}/dx.bat" />

    <property
        name="apkbuilder"
        value="${sdk-tools}/apkbuilder.bat" />

    <property
        name="jarsigner"
        value="${env.JAVA_HOME}/bin/jarsigner" />

    <property
        name="zipalign"
        value="${sdk-tools}/zipalign.exe" />

    <!-- 编译需要的jar; 如果项目使用到地图服务则需要maps.jar -->

    <property
        name="android-jar"
        value="${sdk-platform-folder}/android.jar" />

    <property
        name="android-maps-jar"
        value="${sdk-folder}/add-ons/addon_google_apis_google_inc_8/libs/maps.jar" />

    <!--  -->

    <property
        name="channelname"
        value="" />

    <property
        name="channelkey"
        value="" />
    <!-- 渠道名:渠道号 -->

    <property
        name="key"
        value="UM:umumum,BAI:baidu" />

    <!-- 编译aidl文件所需的预处理框架文件framework.aidl -->

    <property
        name="framework-aidl"
        value="${sdk-platform-folder}/framework.aidl" />
    <!-- 清单文件 -->

    <property
        name="manifest-xml"
        value="AndroidManifest.xml" />
    <!-- 源文件目录 -->

    <property
        name="resource-dir"
        value="res" />

    <property
        name="asset-dir"
        value="assets" />
    <!-- java源文件目录 -->

    <property
        name="srcdir"
        value="src" />

    <property
        name="srcdir-ospath"
        value="${basedir}/${srcdir}" />
    <!-- 外部类库所在目录 -->

    <property
        name="external-lib"
        value="libs" />

    <property
        name="external-lib-ospath"
        value="${basedir}/${external-lib}" />

    <!-- 版本 -->

    <property
        name="version"
        value="3.0" />

    <!-- 循环打包 -->

    <target name="deploy" >

        <foreach
            delimiter=","
            list="${key}"
            param="nameandchannel"
            target="modify_manifest" >
        </foreach>
    </target>

    <target name="modify_manifest" >

        <!-- 获取渠道名字 -->

        <propertyregex
            input="${nameandchannel}"
            override="true"
            property="channelname"
            regexp="(.*):"
            select="\1" />
        <!-- 获取渠道号码 -->

        <propertyregex
            input="${nameandchannel}"
            override="true"
            property="channelkey"
            regexp=":(.*)"
            select="\1" />
        <!-- 正则匹配替换渠道号 -->

        <replaceregexp
            byline="false"
            encoding="UTF-8"
            flags="g" >

            <regexp pattern="meta-data android:value="(.*)" android:name="app_key"" />

            <substitution expression="meta-data android:value="${channelkey}" android:name="app_key"" />

            <fileset
                dir=""
                includes="AndroidManifest.xml" />
        </replaceregexp>

        <antcall target="zipalign" />
    </target>

    <!-- 初始化工作 -->

    <target name="init" >

        <echo>
目录初始化....


        </echo>
        <!-- 生成R文件的相对目录 -->

        <var
            name="outdir-gen"
            value="gen" />
        <!-- 编译后的文件放置目录 -->

        <var
            name="outdir-bin"
            value="bin-${channelname}" />
        <!-- 生成class目录 -->

        <var
            name="outdir-classes"
            value="${outdir-bin}" />

        <var
            name="outdir-classes-ospath"
            value="${basedir}/${outdir-classes}" />

        <!-- classes.dex相关变量 -->

        <var
            name="dex-file"
            value="classes.dex" />

        <var
            name="dex-path"
            value="${outdir-bin}/${dex-file}" />

        <var
            name="dex-ospath"
            value="${basedir}/${dex-path}" />

        <!-- 经过aapt生成的资源包文件 -->

        <var
            name="resources-package"
            value="${outdir-bin}/resources.ap_" />

        <var
            name="resources-package-ospath"
            value="${basedir}/${resources-package}" />

        <!-- 未认证apk包 -->

        <var
            name="out-unsigned-package"
            value="${outdir-bin}/${appName}-unsigned.apk" />

        <var
            name="out-unsigned-package-ospath"
            value="${basedir}/${out-unsigned-package}" />

        <!-- 证书文件 -->

        <var
            name="keystore-file"
            value="${basedir}/gaoxin.key" />

        <!-- 已认证apk包 -->

        <var
            name="out-signed-package"
            value="${outdir-bin}/${appName}-${channelname}-${version}.apk" />

        <var
            name="out-signed-package-ospath"
            value="${basedir}/${out-signed-package}" />

        <delete dir="${outdir-bin}" />

        <mkdir dir="${outdir-bin}" />

        <mkdir dir="${outdir-classes}" />
    </target>

    <!-- 根据工程中的资源文件生成R.java文件 -->

    <target
        name="gen-R"
        depends="init" >

        <echo>
生成R.java文件....


        </echo>

        <exec
            executable="${aapt}"
            failοnerrοr="true" >

            <arg value="package" />

            <arg value="-f" />

            <arg value="-m" />

            <arg value="-J" />

            <arg value="${outdir-gen}" />

            <arg value="-S" />

            <arg value="${resource-dir}" />

            <arg value="-M" />

            <arg value="${manifest-xml}" />

            <arg value="-I" />

            <arg value="${android-jar}" />
        </exec>
    </target>

    <!-- 编译aidl文件 -->

    <target
        name="aidl"
        depends="gen-R" >

        <echo>
编译aidl文件....


        </echo>

        <apply
            executable="${aidl}"
            failοnerrοr="true" >

            <!-- 指定预处理文件 -->

            <arg value="-p${framework-aidl}" />
            <!-- aidl声明的目录 -->

            <arg value="-I${srcdir}" />
            <!-- 目标文件目录 -->

            <arg value="-o${outdir-gen}" />
            <!-- 指定哪些文件需要编译 -->

            <fileset dir="${srcdir}" >

                <include name="**/*.aidl" />
            </fileset>
        </apply>
    </target>

    <!-- 将工程中的java源文件编译成class文件 -->

    <target
        name="compile"
        depends="aidl" >

        <echo>
java源文件编译成class文件....


        </echo>

        <javac
            bootclasspath="${android-jar}"
            destdir="${outdir-classes}"
            encoding="utf-8"
            srcdir="."
            target="1.5"
            verbose="false" >

            <compilerarg line="-encoding GBK " />

            <classpath>

                <fileset
                    dir="${external-lib}"
                    includes="*.jar" />
            </classpath>
        </javac>
    </target>

    <!-- 将.class文件转化成.dex文件 -->

    <target
        name="dex"
        depends="compile" >

        <echo>
将.class文件转化成.dex文件....


        </echo>

        <exec
            executable="${dx}"
            failοnerrοr="true" >

            <arg value="--dex" />
            <!-- 输出文件 -->

            <arg value="--output=${dex-ospath}" />
            <!-- 要生成.dex文件的源classes和libraries -->

            <arg value="${outdir-classes-ospath}" />

            <arg value="${external-lib-ospath}" />
        </exec>
    </target>

    <!-- 将资源文件放进输出目录 -->

    <target name="package-res-and-assets" >

        <echo>
将资源文件放进输出目录....


        </echo>

        <exec
            executable="${aapt}"
            failοnerrοr="true" >

            <arg value="package" />

            <arg value="-f" />

            <arg value="-M" />

            <arg value="${manifest-xml}" />

            <arg value="-S" />

            <arg value="${resource-dir}" />

            <arg value="-A" />

            <arg value="${asset-dir}" />

            <arg value="-I" />

            <arg value="${android-jar}" />

            <arg value="-F" />

            <arg value="${resources-package}" />
        </exec>
    </target>

    <!-- 打包成未签证的apk -->

    <target
        name="package"
        depends="dex, package-res-and-assets" >

        <echo>
打包成未签证的apk....


        </echo>

        <exec
            executable="${apkbuilder}"
            failοnerrοr="true" >

            <arg value="${out-unsigned-package-ospath}" />

            <arg value="-u" />

            <arg value="-z" />

            <arg value="${resources-package-ospath}" />

            <arg value="-f" />

            <arg value="${dex-ospath}" />

            <arg value="-rf" />

            <arg value="${srcdir-ospath}" />
        </exec>
    </target>

    <!-- 对apk进行签证 ,因为JDK7会修改签名的默认算法,所以需要指定SHA1 -->

    <target
        name="jarsigner"
        depends="package" >

        <echo>
Packaging signed apk for release...


        </echo>

        <exec
            executable="${jarsigner}"
            failοnerrοr="true" >

            <arg value="-verbose" />

            <arg value="-digestalg" />

            <arg value="SHA1" />

            <arg value="-sigalg" />

            <arg value="MD5withRSA" />

            <arg value="-keystore" />

            <arg value="${keystore-file}" />

            <arg value="-storepass" />

            <arg value="123456" />

            <arg value="-keypass" />

            <arg value="123456" />

            <arg value="-signedjar" />

            <arg value="${out-signed-package-ospath}" />

            <arg value="${out-unsigned-package-ospath}" />
            <!-- 不要忘了证书的别名 -->

            <arg value="gaoxin" />
        </exec>
    </target>

    <!-- 发布 -->

    <target
        name="release"
        depends="jarsigner" >

        <!-- 删除未签证apk -->

        <delete file="${out-unsigned-package-ospath}" />

        <echo>
APK is released. path:${out-signed-package-ospath}


        </echo>
    </target>
    <!-- 打包的应用程序进行优化 -->

    <target
        name="zipalign"
        depends="release" >

        <exec
            executable="${zipalign}"
            failοnerrοr="true" >

            <arg value="-v" />

            <arg value="4" />

            <arg value="${out-signed-package-ospath}" />

            <arg value="${out-signed-package-ospath}-zipaligned.apk" />
        </exec>
    </target>

</project>[/mw_shl_code]



该文件需要改动地方:

1) <project name="TestMutilChannelApk" default="release" >  TestMutilChannelApk 的值替换成你的工程名。
2) <taskdef resource="net/sf/antcontrib/antcontrib.properties" >

        <classpath>

            <pathelement location="D:/Android/Ant/lib/ant-contrib-1.0b3.jar" />
        </classpath>
    </taskdef>
    “D:/Android/Ant/lib/ant-contrib-1.0b3.jar” 替换成你存放ant-contrib-1.0b3.jar的地方。
    本来这边可以使用环境变量ANT_HOME,但是一直不行,所以改成了绝对路径。
3) 替换你的SDK目录:
<property
        name="sdk-folder"
        value="D:/Android/adt-bundle-windows-x86_64-20131030/sdk" />
"D:/Android/adt-bundle-windows-x86_64-20131030/sdk" 替换成你的SDK目录
本来这边可以使用环境变量ANDROID_SDK_HOME,但是一直不行,所以改成了绝对路径。


4)配置渠道名和渠道号:
<property
        name="key"
        value="UM:umumum,BAI:baidu" />
"UM:umumum,BAI:baidu"替换成你要配置渠道名和渠道号。格式:渠道名1:渠道号1,渠道名2:渠道号2,......


5)修改版本号:
<property
        name="version"
        value="3.0" />
"3.0" 替换成你的版本号。


6)设置签名部分:
<var
            name="keystore-file"
            value="${basedir}/gaoxin.key" />
"${basedir}/gaoxin.key" 替换成的你签名文件的路径


    <!-- 对apk进行签证 ,因为JDK7会修改签名的默认算法,所以需要指定SHA1 -->
    <target
        name="jarsigner"
        depends="package" >

        <echo>
Packaging signed apk for release...


        </echo>

        <exec
            executable="${jarsigner}"
            failοnerrοr="true" >

            <arg value="-verbose" />

            <arg value="-digestalg" />

            <arg value="SHA1" />

            <arg value="-sigalg" />

            <arg value="MD5withRSA" />

            <arg value="-keystore" />

            <arg value="${keystore-file}" />

            <arg value="-storepass" />

            <arg value="123456" />

            <arg value="-keypass" />

            <arg value="123456" />

            <arg value="-signedjar" />

            <arg value="${out-signed-package-ospath}" />

            <arg value="${out-unsigned-package-ospath}" />
            <!-- 不要忘了证书的别名 -->

            <arg value="gaoxin" />
        </exec>
    </target>


如果你的JDK是7,需要添加红色部分的代码,如果是6,就可以不需要,否则,最终的APK安装会出现“该文件签名有问题,无法安装”。

第一个 <arg value="123456" /> 替换成你的密钥的密码

第二个 <arg value="123456" /> 替换成你别名的密码
<arg value="gaoxin" />  "gaoxin" 替换成你密钥中的别名





5. 在AndroidManifest.xml中设置保存渠道号的meta-data:



注意,build.xml文件中的:
<target name="modify_manifest" >

        <!-- 获取渠道名字 -->

        <propertyregex
            input="${nameandchannel}"
            override="true"
            property="channelname"
            regexp="(.*):"
            select="\1" />
        <!-- 获取渠道号码 -->

        <propertyregex
            input="${nameandchannel}"
            override="true"
            property="channelkey"
            regexp=":(.*)"
            select="\1" />
        <!-- 正则匹配替换渠道号 -->

        <replaceregexp
            byline="false"
            encoding="UTF-8"
            flags="g" >

            <regexp pattern="meta-data android:value=&quot;(.*)&quot; android:name=&quot;app_key&quot;" />

            <substitution expression="meta-data android:value=&quot;${channelkey}&quot; android:name=&quot;app_key&quot;" />

            <fileset
                dir=""
                includes="AndroidManifest.xml" />
        </replaceregexp>

        <antcall target="zipalign" />
    </target>


中的<regexp pattern="meta-data android:value=&quot;(.*)&quot; android:name=&quot;app_key&quot;" />要和你的AndroidManifest.xml的中meta-data字符串格式对应,如果不对应,正则替换就替换不了。


6. 最新的Android SDK 没有文件"apkbuilder.bat",我在网上下载了一个以前版本的,发现用不了,后来找到一个别人根据最新SDK修改过的。
把下载的"apkbuilder.bat"放到“D:\Android\adt-bundle-windows-x86_64-20131030\sdk\tools”中。


7. 运行build.xml:







选中deploy,去掉选中release[default],点击运行。






工程目录下多出了两个文件夹:


文件夹里面:


下载地址:http://download.csdn.net/detail/u012971339/8849995

这篇关于android Ant 批量多渠道打包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1099792

相关文章

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Python按条件批量删除TXT文件行工具

《Python按条件批量删除TXT文件行工具》这篇文章主要为大家详细介绍了Python如何实现按条件批量删除TXT文件中行的工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.简介2.运行效果3.相关源码1.简介一个由python编写android的可根据TXT文件按条件批

Java实现批量化操作Excel文件的示例代码

《Java实现批量化操作Excel文件的示例代码》在操作Excel的场景中,通常会有一些针对Excel的批量操作,这篇文章主要为大家详细介绍了如何使用GcExcel实现批量化操作Excel,感兴趣的可... 目录前言 | 问题背景什么是GcExcel场景1 批量导入Excel文件,并读取特定区域的数据场景2

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影