不废话, 直接上货
<?xml version="1.0" encoding="UTF-8"?>
<project name="MyProject" default="init" basedir=".">
<description>
simple example build file
</description>
<!-- 使用第三方的ant包,使ant支持for循环-->
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="${env.ANT_HOME}/lib/ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef>
<!-- set global properties for this build -->
<property file="build.properties" />
<property name="inDir" location="in"/>
<property name="outDir" location="out"/>
<property name="build-tools" location="android-sdk/build-tools/27.0.3"/>
<property name="netease-tools" location="netease-tools"/>
<property name="apksigner.jar" location="${build-tools}/lib/apksigner.jar"/>
<property name="makechannels.jar" location="${netease-tools}/makechannels.jar"/>
<property name="netease-apksigner.jar" location="${netease-tools}/apksigner.jar"/>
<property name="appName.apk" value="${inDir}/${appName}"/>
<!-- 多渠道打包配置 -->
<property name="channels.txt" location="${inDir}/channels.txt"/>
<!-- keystore配置 -->
<property name="key.store.path" location="${inDir}/${key.store}"/>
<property name="zipalign" value="${build-tools}/zipalign" />
<!-- Create the time stamp -->
<tstamp>
<format property="DSTAMP" pattern="yyMMdd" timezone="GMT+8"/>
</tstamp>
<target name="init">
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<target name="verifyApk" description="checking whether signatures of APK files will verify on Android devices.">
<!-- Cannot execute a jar in non-forked mode. Please set fork='true'. -->
<java jar="${apksigner.jar}" fork="true">
<arg value="verify" />
<arg value="--verbose" />
<arg value="${appName.apk}" />
</java>
</target>
<target name="zipalignCheck">
<exec executable="${zipalign}">
<arg value="-c" />
<arg value="-v" />
<arg value="4" />
<arg value="${appName.apk}" />
</exec>
</target>
<target name="makechannels" description="makechannel info each">
<java jar="${makechannels.jar}" fork="true">
<arg value="-apk" />
<arg value="${appName.apk}" />
<arg value="-config" />
<arg value="${channels.txt}" />
<arg value="-out" />
<arg value="${outDir}" />
</java>
</target>
<target name="apksigner" description="可重新签名单个文件 或 文件夹">
<java jar="${netease-apksigner.jar}" fork="true">
<arg value="-appname" />
<arg value="test" />
<arg value="-keystore" />
<arg value="${key.store.path}" />
<arg value="-pswd" />
<arg value="${key.store.password}" />
<arg value="-alias" />
<arg value="${key.alias}" />
<arg value="-aliaspswd" />
<arg value="${key.alias.password}" />
<arg value="-v1" />
<arg value="true" />
<arg value="-v2" />
<arg value="false" />
<arg value="${outDir}" />
</java>
</target>
<target name="zipalignItem" description="对单个文件进行zipalign">
<echo>取出原始${itemAppName}</echo>
<!-- 通过${itemAppName}构建${newApkName} -->
<loadresource property="newApkName" encoding="UTF-8">
<string value="${itemAppName}" />
<filterchain>
<tokenfilter>
<!-- 巧妙将后缀.apk加上了时间 -->
<replaceregex pattern=".apk" replace="_zipalign.apk" flags="g" />
</tokenfilter>
</filterchain>
</loadresource>
<echo>开始构建${newApkName}</echo>
<exec executable="${zipalign}">
<arg value="-f" />
<arg value="-v" />
<arg value="4" />
<arg value="${itemAppName}" />
<arg value="${newApkName}" />
</exec>
</target>
<target name="easyChannels">
<!-- 0. 清理历史数据 -->
<antcall target="clean" />
<!-- 1. 根据channels文件进行多渠道打包 -->
<antcall target="makechannels" />
<!-- 2. 集体重新签名 -->
<antcall target="apksigner" />
<!-- 3. 遍历并zipalign -->
<foreach param="itemAppName" target="zipalignItem">
<path>
<fileset dir="${outDir}">
<include name="*.apk"/>
</fileset>
</path>
</foreach>
</target>
<target name="clean" description="clean up">
<!-- 避免删除了重复删除文件夹的尴尬, 有必要吗? -->
<delete>
<fileset dir="${outDir}" />
</delete>
</target>
</project>
优点:
- 并不是说ant淘汰了, 由于不参与构建apk, 只是拿到apk包到重新多渠道后签名和zipalign优化, 速度还是比较可观的.
笔记:
- 需要提交配置好环境变量
- 日期时间戳dstamp、tsdamp、today的应用, 尼玛HH:mm才是二十四小时, hh:mm是十二小时制
- FilterChain是个好东西, 本来对于正则表达式理解的不深, 然后ant对Properties的value这种字符串无从下手的时候, 万能的搜索帮了大忙
小疑惑:
- 采用删除文件下所有文件, 而不是包括文件夹, 我想知道这个有没有必要
参考
- ANT获取时间 - yakoo5的专栏 - CSDN博客
https://blog.csdn.net/yakoo5/article/details/8760663 - Ant类型之FilterChain - 荣耀之路 - CSDN博客
https://blog.csdn.net/asty9000/article/details/79198172 - ant删除文件操作 - 孤云博客 - CSDN博客
https://blog.csdn.net/u010142437/article/details/26681213