天天看點

ant實作批量打包android應用

很多的應用中需要加上應用推廣的統計,如果一個一個的去生成不同管道包的應用,效率低不說,還有可能不小心弄錯了分發管道,使用ant可以批量生成應用。

一、添加管道包資訊

       為了統計管道資訊,就不得不在程式的某個地方加入管道的資訊,然後針對不同的管道打不同的包。一般可以在Manifest檔案中加入管道編号,而不直接寫在代碼中。這樣做的好處是,可以針對不同管道,自動化去修改Manifest檔案中的管道編号,然後自動為該管道打包。

Manifest檔案支援Meta Data标簽,建議使用這種自定義标簽。例如下面的檔案片段。

[html]  view plain copy print ?

  1. <meta-data android:value="000000" android:name="CHANNEL"/>  

二、管道包讀取

[java]  view plain copy print ?

  1. public static String getChanel(Context ctx){  
  2.         String CHANNELID="000000";  
  3.         try {  
  4.                ApplicationInfo  ai = ctx.getPackageManager().getApplicationInfo(  
  5.                        ctx.getPackageName(), PackageManager.GET_META_DATA);  
  6.                Object value = ai.metaData.get("");  
  7.                if (value != null) {  
  8.                    CHANNELID= value.toString();  
  9.                }  
  10.            } catch (Exception e) {  
  11.                //  
  12.            }  
  13.         return CHANNELID;  
  14.     }  

三、自動打包實作

         Ant編譯android程式        簡單介紹了使用ant指令打包android程式,實作批量打包需要的加一個類似于for循環的功能即可,在Ant的核心包裡沒有相關的For循環的Task,要下載下傳相應的擴充包。可以使用開源的Ant-contrib包。下載下傳位址:http://ant-contrib.sourceforge.net/  。下載下傳後的解壓得到的jar檔案放到ant的lib目錄。

        在build.xml中增加如下代碼就可以實作批量打包:

[html]  view plain copy print ?

  1. taskdef resource="net/sf/antcontrib/antcontrib.properties">  
  2.   <classpath>  
  3.     <pathelement location="lib/ant-contrib-1.0b3.jar"/>  
  4.   </classpath>  
  5. </taskdef>  
  6.  <target name="deploy">  
  7.    <foreach target="modify_manifest" list="${market_channels}" param="channel" delimiter=",">  
  8.    </foreach>  
  9.  </target>  
  10. <target name="modify_manifest">  
  11.     <replaceregexp flags="g" byline="false">  
  12.     <regexp pattern="android:value="(.*)" android:name="CHANNEL"" />  
  13.     <substitution expression="android:value="${channel}" android:name="CHANNEL"" />  
  14.     <fileset dir="" includes="AndroidManifest.xml" />  
  15.     </replaceregexp>  
  16.     <property name="out.release.file"  
  17.                   location="${out.absolute.dir}/${ant.project.name}_${channel}_${app_version}.apk" />  
  18.     <antcall target="release" />  
  19. </target>  

taskdef 聲明需要放到較前位置,因為if condition也會用到此聲明。

build.properties檔案增加:

taskdef 聲明需要放到較前位置,因為if condition也會用到此聲明。

build.properties檔案增加:

[html]  view plain copy print ?

  1. market_channels=000000,012345   
  2. app_version=1.2.1  

market名稱用逗号分隔

執行ant deploy即可。