最近在持续地完善Ant脚本,让构建更简单智能化。
现在客户化的步骤有:
1. 替代标准Android SDK的jar
2. 在构建前去SVN获取最新提交的SVN号,然后修改AndroidManifest.xml的versionName,让它包含SVN号、构建时间信息。方便查询。
3. 构建完之后,再把对AndroidManifest文件的修改revert回来。
4. 调用系统签名文件进行系统签名
这里需要用到的软件有:SlikSvn、xmltask。
感觉比较有成就感的是第二步。使得本地电脑只需要提供基本的版本号,如1.2.4,然后把这个修改提交到SVN,然后经过Ant的构建,apk的版本自动改成包含SVN、构建日期等信息,但构建完之后,本地文件又没有任何改动。
几个关键步骤:
获取SVN号:(如果本地有修改的文件的话,获取的SVN号后面会MP字样,在Jenkins因为都是最新代码,就不会有此问题)
<target name="-get-svnversion"> <exec outputproperty="build.svnversion" executable="${svnversion.home}/svnversion"> <arg line="-c" /> <redirector> <outputfilterchain> <linecontainsregexp> <regexp pattern="^*:"/> </linecontainsregexp> <tokenfilter> <replaceregex pattern="[0-9]+\:\s*" flags="s" replace=""/> </tokenfilter> </outputfilterchain> </redirector> </exec> <echo> Current version is: ${build.svnversion}</echo> </target>
提取AndroidManifest文件里面的版本号:
<target name="-extract-version"> <xmltask source="${android.manifest}"> <copy path="manifest/@android:versionName" property="current.version"/> </xmltask> <echo>${current.version}</echo> </target>
修改AndroidManifest里面的版本名称:
<target name="-update-version" depends="-get-svnversion,-extract-version"> <property name="matchChannel.start" value='android:versionName=\"' /> <property name="matchChannel.end" value='\"' /> <tstamp> <format property="TODAY_UK" pattern="yyyyMMdd-HHmm" locale="en,UK"/> </tstamp> <echo>the current date is ${TODAY_UK}</echo> <replaceregexp file="AndroidManifest.xml" match='${matchChannel.start}[^"]*${matchChannel.end}' replace="${matchChannel.start}${ant.project.name}-${current.version}-${TODAY_UK}-${build.svnversion}${matchChannel.end}" /> </target>
在使用xmltask之前,需要先下载该jar文件,然后把它放在某个位置。我这里就放在${ant.home}/lib/目录下。然后在xml前面写上:
<taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" classpath="${ant.home}/lib/xmltask.jar"/>
值得注意的是:在调用SVN获取版本号的时候,可能会说SVN版本太低,需要升级。我的脚本里面没有调用svn upgrade的命令(或许后续应该考虑加进去),手动在命令行输入刚才的命令。
这样基本的构建脚本就完成了。每次要拿软件的时候,就直接在Jenkins上拿了。