使用Ant進行apk多渠道打包

前言:

Ant 是什麼?java

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

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

 

準備工做:

android sdk中默認支持使用ant來執行編譯動做。可是要想使用ant來進行編譯,還須要ant的執行環境。apache

爲了能順利使用ant來編譯,咱們須要以下準備:app

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

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目錄。ui

 

參考:

關於android編譯生成apk的流程,能夠參照http://www.oschina.net/code/snippet_16_6782spa

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

下面主要介紹一下基於已定義好的release,怎麼修改實現本身的build.xml文件。

 

步驟:

首先介紹一下build.xml文件中變量的定義格式以下,後面會用到

  <property name="key_sample" value="value_sample" /> 

 

1,對生成目錄作必要的清除動做,起名爲myClean,這裏我刪除了生成目錄下的全部apk文件。

 

<target name="myClean">
    <mkdir dir="${outputDir}"/>
    <delete verbose="true">
         <fileset dir="${outputDir}" includes="*.apk" />
     </delete>
</target>

 

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

  <property name="outputDir" value="../output"/> 

 

2,加載渠道信息,並使用ant的 foreach功能實現批量打包;

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

能夠看到這裏是從 ${build.channels} 中讀取相關渠道信息,多渠道中間用,分隔;

build.channels=101,201,301

 

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

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

 

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

     <target name="myPrepareBuildinfo" depends="myLoadBuildInfo">
         <replaceregexp flags="g" byline="true" encoding="UTF-8">
             <regexp pattern='android:versionCode="(.*)"' />
             <substitution expression='android:versionCode="${buildVersionCode}"' />
             <fileset dir="" includes="${manifest}" />
         </replaceregexp>
         <replaceregexp flags="g" byline="true" encoding="UTF-8">
             <regexp pattern='android:versionName="(.*)"' />
             <substitution expression='android:versionName="${buildVersionName}"' />
             <fileset dir="" includes="${manifest}" />
         </replaceregexp>
         <replaceregexp flags="g" byline="true" encoding="UTF-8">
             <regexp pattern='android:value="@string/APP_CHANNEL"'/>
             <substitution expression='android:value="${build.channel}"'/>
             <fileset dir="" includes="${manifest}" />
         </replaceregexp>
     </target>

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

 

5,執行release動做;

 

6,針對4生成的unsigned apk 用本身的簽名文件簽名;

      <target name="mySign">
         <mkdir dir="${outputDir}"/>
         <java jar="${signjar}" fork="true" failonerror="true" maxmemory="128m">
              <arg value="-w"/>
              <arg value="${key_pem}"/>
              <arg value="${key_pk8}"/>
              <arg value="${binDir}/${build.name}-release-unsigned.apk"/>
              <arg value="${binDir}/${build.name}-release-signed.apk"/>
          <classpath>
            <pathelement location="${signjar}"/>
          </classpath>
         </java>
         
         <property name="outName" value="${outputDir}/${build.name}-${buildVersionName}-${buildVersionCode}-${build.channel}-${build.timestamp}-${buildNumber}"/>
         
         
         <zipalign-helper in.package="${binDir}/${build.name}-release-signed.apk"
                         out.package="${outName}.apk" />
         <copy file="${mapping}" tofile="${outName}-mapping.txt"  overwrite="true"/>
     </target>

 

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

 

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

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

 

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

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

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

相關文章
相關標籤/搜索