1. 程式人生 > >多渠道批量打包

多渠道批量打包

經過一天的奮戰,終於搞定了批量打包,不多說,上程式碼

多渠道就是按照不同的市場進行釋出不同的包,由於要改版本名,所以有的時候要打10多個包,在測試部的人員打一次包久會感覺不好,

先說前提,是運用android sdk進行打包,需要ant,

同時ant核心庫本身不支援遍歷功能,所以需要引入新庫ant-contrib-1.0b3.jar,需要放到ant\lib目錄下,我直接放到當前專案目錄下。

ant-contrib 下載地址: http://sourceforge.net/projects/ant-contrib/

如果出現如下錯誤,說明沒有放置jar檔案
Buildfile: D:\ProjectDemo\build.xml


  [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontri
b.properties. It could not be found.

對現有專案進行編譯

android update project --name ProjectDemo --target 8 --path ./  

生成一下一個檔案

  1. Updated project.properties  
  2. Updated local.properties  
  3. Added file D:\ProjectDemo\build.xml  
  4. Updated file D:\ProjectDemo\proguard.cfg  

首先要在AndroidManifest.xml檔案中加入

  <meta-data android:value="baiduyingyongzhongxin" android:name="CHANNEL"/>
用來表示版本的值

然後再把要替換的值放在配置檔案,可以放在ant.properties, project.properties, local.properties等檔案,當然如果為了打包與這些檔案分離,可以自己建立一個檔案,並匯入,筆者作為測試,放在了ant.properoties檔案中,這裡不推薦

market_channels=anzhuoshichang,jifengshichang,baiduyingyongzhongxin
app_version=1_0_build_0 
上面就是需要打包的版本,是三個市場的,也就是說要打3個包

一下是build.xml檔案中新增的原始碼

       	   <taskdef resource="net/sf/antcontrib/antcontrib.properties" >
        <classpath>
            <!-- <pathelement location="lib/ant-contrib-1.0b3.jar" /> -->
			<pathelement location="./ant-contrib-1.0b3.jar" />
        </classpath>
    </taskdef>

	<echo>Run ant-contrib OK</echo>
    
   <target name="deploy">   
     <foreach target="edit_and_build" list="${market_channels}" param="channel" delimiter=",">   
     </foreach>   
  </target>   
  
  
 <target name="edit_and_build">  
		<echo>Run '${channel}' apk</echo>
	<!--  flags="g" 指定全域性替換,替換所有符合規則的欄位
		byline="false" 確認被替換的時候是一次替換一行還是多行 
		pattern 屬性用來指明正則表示式 -->
		<replaceregexp flags="g" byline="false">  
		    <regexp pattern="android:value="(.*)" android:name="CHANNEL""/>  
		   <!--  substitution expression 中是替換的值,替換的值都定義在相對應的配置檔案中 -->
		    <substitution expression="android:value="${channel}" android:name="CHANNEL"" />
		   <!--  fileset 屬性中的 dir 用來指定被替換檔案所在的目錄
			includes 用來指定要替換哪個檔案。   -->
		    <fileset dir="" includes="AndroidManifest.xml" />  
	    </replaceregexp>  
	    <property name="out.final.file" location="./${channel}.apk" />  
	     
        <antcall target="clean" />
        <antcall target="release" />
是不是感覺頭很大,看不懂,沒關係,學知識就是要循序漸進,

推薦兩篇文章,學習一些怎麼迴圈讀資料,看懂了那兩個,再看筆者這個久容易很多了

http://blog.csdn.net/androiddevelop/article/details/11619635

這裡面有一個地方

<property name="out.final.file" location="./${channel}.apk" />  
筆者親測用out.final.file才能生成不同版本的apk,不知道是不是變數名稱的改變

http://www.cnblogs.com/stay/archive/2013/05/27/3102027.html這篇講了比較多的原由