目前看到网上很多打包的文章,使用了apkbuilder之类的,如下:
<!-- 使用到的命令(当前系统为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" />
其实这些东西在最新的sdk里面是没有的,很多朋友都表示不知道如何去写这个脚本文件。
闲话少说,直接上干货。
准备4个文件,ant.properties,local.properties,custom_rules.xml,build.xml[当然,前提是你的项目已经基于Ant构建了哈,如果不知道,就百度一下]
manifest文件里面的节点必须有:
<meta-data
android:name="BaiduMobAd_CHANNEL" android:value="BaiduMobAd_CHANNEL_VALUE" >
</meta-data>
第一: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=/Users/luffy/Documents/adt/sdk
project.dir=/Users/luffy/Documents/git/Test-android
第二:ant.properties文件
application.package=com.test.hello
ant.project.name=test
java.encoding=utf-8
jar.libs.dir=libs
build.first=false
market_channels=release,360Market,qqMarket,leMarket,gita2Market
key.alias=testalias
key.alias.password=test123456
key.store.password=test123456
key.store=/Users/luffy/Documents/test/test.keystore
ant-contrib=/usr/share/locale/apache-ant-1.9.4/lib/ant-contrib-1.0b3.jar
out.absolute.dir=/Users/luffy/Documents/version/test
gos.path=/Users/luffy/Documents/version
app_version=2.0.2
这个主要要注意的是 ant-contrid ,它是用来循环打包的插件,如果在最新的ant里面没有,就去单独下载下来,放入ant的lib目录里
然后是out.absolute.dir,这是循环打包时,临时文件的存放路径
最后是gos.path 这是最终版本的存放路径。
第三:custom_rules.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 渠道包打包脚本 ant deploy -->
<project name="custom_rules" >
<taskdef resource="net/sf/antcontrib/antcontrib.properties" >
<classpath>
<pathelement location="${ant-contrib}" />
</classpath>
</taskdef>
<!-- 循环打包 -->
<target name="deploy" >
<antcall target="clean" />
<foreach
delimiter=","
list="${market_channels}"
param="channel"
target="modify_manifest" >
</foreach>
</target>
<target name="modify_manifest" >
<replaceregexp
encoding="utf-8"
file="AndroidManifest.xml"
match="BaiduMobAd_CHANNEL_VALUE"
replace="${channel}" />
<antcall target="release" />
<copy tofile="${gos.path}/${ant.project.name}_${channel}_v${app_version}.apk" >
<fileset
dir="${out.absolute.dir}/"
includes="test-release.apk" />
</copy>
<delete includeEmptyDirs="true" >
<fileset
dir="${out.absolute.dir}"
includes="**/*" />
</delete>
<replaceregexp
encoding="utf-8"
file="AndroidManifest.xml"
match="${channel}"
replace="BaiduMobAd_CHANNEL_VALUE" />
<echo message="===========================" />
</target>
</project>
第四:build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project
name="test"
default="help" >
<property file="local.properties" />
<property file="ant.properties" />
<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" />
<import file="${sdk.dir}/tools/ant/build.xml" />
</project>
然后我们整体来解读这两个xml文件,其中build比较简单,就是引入 local.properties,ant properties,custom_rules.xml 和 sdk里面自带的 build.xml
如果你对这个custom脚本文件表示看不懂,教你一个简单的办法。把每一个 target节点,当成java的一个method,方法调用!
我们来看看,里面其实只有两个 target :deploy 和 modify_manifest
那么我们可以这样来理解 deploy,它首先是'调用'了 clean方法来clean项目的缓存[bin目录] 和 执行一行 for循环代码。在for循环里面不断的‘调用’
modify_manifest 方法。
而 modify_manifest 首先用传递进来的渠道号 替换 manifest文件的 BaiduMobAd_CHANNEL_VALUE,然后调用 release 方法来生成apk。此时的apk是存放在临时目录里面,所以它又执行了一个copy代码,把临时目录里面的apk拷贝到另一个文件夹里面,然后再执行一个delete代码清空临时目录,最后再把 替换的渠道号还原为 BaiduMobAd_CHANNEL_VALUE。
最后我们在命令行里面执行 ant deploy 命令, 就可以同时生成多个渠道的包了