Android使用Ant進行apk多渠道打包

richie.wang的部落格發表於2014-12-02

前言:

Ant 是什麼?

詳細介紹請看http://ant.apache.org/

總之一句話:Ant是一個Apache基金會下的跨平臺的構件工具,它可以實現專案的自動構建和部署等功能。

準備工作:

android sdk中預設支援使用ant來執行編譯動作。但是要想使用ant來進行編譯,還需要ant的執行環境。

為了能順利使用ant來編譯,我們需要如下準備:

1,android sdk,最簡單的是下載一個adt bundle即可;

2,ant包,下載連結:http://ant.apache.org/bindownload.cgi,將壓縮包下載完解壓到某個目錄即可。

3,ant-contrib.jar,這個jar主要用來支援編譯的批量操作,下載地址http://mirrors.ibiblio.org/maven2/ant-contrib/ant-contrib/1.0b3/ant-contrib-1.0b3.jar,下完之後放到步驟2解壓目錄的lib目錄。

參考:

關於android編譯生成apk的流程,可以參照http://www.oschina.net/code/snippet_16_6782,

其實有個偷懶的方式,就是借用 android sdk的tools/ant/目錄中build.xml檔案內已定義好的動作,主要是用到”release”。

下面主要介紹一下基於已定義好的release,怎麼修改實現自己的build.xml檔案。

步驟:

首先介紹一下build.xml檔案中變數的定義格式如下,後面會用到

1 <property name=”key_sample” value=”value_sample” />

1,對生成目錄做必要的清除動作,起名為myClean,這裡我刪除了生成目錄下的所有apk檔案。

1     <target name="myClean">
2         <mkdir dir="${outputDir}"/>
3         <delete verbose="true">
4             <fileset dir="${outputDir}" includes="*.apk" />
5         </delete>
6     </target>

outputDir是我事先定義好的變數:

1 <property name=”outputDir” value=”../output”/>

2,載入渠道資訊,並使用ant的 foreach功能實現批量打包;

1 <target name="myPackChannels">
2   <foreach target="myPackBuild" list="${build.channels}" param="build.channel" delimiter=",">
3   </foreach>
4 </target>

可以看到這裡是從 ${build.channels} 中讀取相關渠道資訊,多渠道中間用,分隔;

build.channels=101,201,301

3,將當前的AndroidMenifest.xml複製到備份目錄;

1 <target name="myBackupManifest">
2   <delete file="${build}/${manifest}" />
3   <copy file="${manifest}" tofile="${build}/${manifest}" overwrite="true"/>
4 </target>

4,修改當前的AndroidMenifest.xml裡面的內容,比如channel值;

 1     <target name="myPrepareBuildinfo" depends="myLoadBuildInfo">
 2         <replaceregexp flags="g" byline="true" encoding="UTF-8">
 3             <regexp pattern='android:versionCode="(.*)"' />
 4             <substitution expression='android:versionCode="${buildVersionCode}"' />
 5             <fileset dir="" includes="${manifest}" />
 6         </replaceregexp>
 7         <replaceregexp flags="g" byline="true" encoding="UTF-8">
 8             <regexp pattern='android:versionName="(.*)"' />
 9             <substitution expression='android:versionName="${buildVersionName}"' />
10             <fileset dir="" includes="${manifest}" />
11         </replaceregexp>
12         <replaceregexp flags="g" byline="true" encoding="UTF-8">
13             <regexp pattern='android:value="@string/APP_CHANNEL"'/>
14             <substitution expression='android:value="${build.channel}"'/>
15             <fileset dir="" includes="${manifest}" />
16         </replaceregexp>
17     </target>

我這裡執行了修改versionName,versionCode和APP_CHANNEL這三個值。

5,執行release動作;

6,針對4生成的unsigned apk 用自己的簽名檔案簽名;

 1 <!-- 簽名 -->
 2      <target name="mySign">
 3         <mkdir dir="${outputDir}"/>
 4         <java jar="${signjar}" fork="true" failonerror="true" maxmemory="128m">
 5              <arg value="-w"/>
 6              <arg value="${key_pem}"/>
 7              <arg value="${key_pk8}"/>
 8              <arg value="${binDir}/${build.name}-release-unsigned.apk"/>
 9              <arg value="${binDir}/${build.name}-release-signed.apk"/>
10          <classpath>
11            <pathelement location="${signjar}"/>
12          </classpath>
13         </java>
14         
15         <property name="outName" value="${outputDir}/${build.name}-${buildVersionName}-${buildVersionCode}-${build.channel}-${build.timestamp}-${buildNumber}"/>
16         
17         
18         <zipalign-helper in.package="${binDir}/${build.name}-release-unsigned.apk"
19                         out.package="${outName}.apk" />
20         <copy file="${mapping}" tofile="${outName}-mapping.txt"  overwrite="true"/>
21     </target>

7,repeat  step3,4,5;(這就是動作2 foreach的執行)

8,恢復之前備份的AndroidMenifest.xml到當前目錄;

1 <target name="myRestoreManifest">
2   <copy file="${build}/${manifest}" tofile="${manifest}" overwrite="true"/>
3   <delete file="${build}/${manifest}" />
4 </target>

最後,整理一下要執行的步驟:

1     <target name=".output" depends="myClean, myBackupManifest, myLoadBuildInfo, myPackChannels, myRestoreManifest,myUpdateBuilderNumber">
2     </target>

so,在你的build.xml所在的目錄,執行ant .output 即可,大功告成!

相關文章