關於批量打包,無需多言,這是每一個國內Android開發者必須面對的一個問題。android
下面,我就以開源項目「知乎小報」爲例,詳細說明如何使用ANT實現批量打渠道包。git
下載ANTgithub
請前往 http://ant.apache.org 下載。apache
配置環境變量數組
設置環境變量後,在命令行下測試ant命令,若是出現如下內容,則說明配置成功:app
cundongdeMacBook-Pro:~ cundong$ ant Buildfile: build.xml does not exist! Build failed
ant-contrib-1.0b3.jar下載測試
因爲ant自己不支持迭代,所以咱們須要用到一個第三方的庫 ant-contrib來實現迭代功能。ui
下載ant-contrib,並將ant-contrib-1.0b3.jar文件拷貝至ANT安裝目錄。this
下載地址:http://ant-contrib.sourceforge.net/spa
先介紹一下iZhihuPaper的工程依賴狀況。
iZhihuPaper 依賴 actionbarpulltorefresh.extras.actionbarsherlock、Crouton、PhotoView
actionbarpulltorefresh.extras.actionbarsherlock 依賴 ActionBarPullToRefresh
ActionBarPullToRefresh 依賴 actionbarsherlock、SmoothProgressBar
Crouton、actionbarsherlock 依賴 SupportLib
PhotoView、SmoothProgressBar、SupportLib 無任何依賴
咱們須要爲iZhihuPaper工程和他直接或者間接引用的全部工程(一共7個)都生成local.properties、build.xml文件。
命令格式:
android update project --target {target版本} --name {工程名字} --path {工程目錄}
依次執行如下命令:
1.
android update project --target android-20 --name SupportLib --path /Users/cundong/Documents/github/SupportLib
2.
android update project --target android-20 --name PhotoView --path /Users/cundong/Documents/github/PhotoView
3.
android update project --target android-20 --name SmoothProgressBar --path /Users/cundong/Documents/github/SmoothProgressBar
4.
android update project --target android-20 --name Crouton --path /Users/cundong/Documents/github/Crouton
5.
android update project --target android-20 --name actionbarsherlock --path /Users/cundong/Documents/github/actionbarsherlock
6.
android update project --target android-20 --name ActionBarPullToRefresh --path /Users/cundong/Documents/github/ActionBarPullToRefresh
7.
android update project --target android-20 --name actionbarpulltorefresh.extras.actionbarsherlock --path /Users/cundong/Documents/github/actionbarpulltorefresh.extras.actionbarsherlock
8.
android update project --target android-20 --name iZhihuPaper --path /Users/cundong/Documents/github/iZhihuPaper
BUILD SCUUCESS 若是執行命令後,出現以下所示:
cundongdeMacBook-Pro:~ cundong$ android update project --target android-20 --name SupportLib --path /Users/cundong/Documents/github/SupportLib Updated project.properties Updated project.properties Added file /Users/cundong/Documents/github/SupportLib/build.xml Updated file /Users/cundong/Documents/github/SupportLib/proguard-project.txt It seems that there are sub-projects. If you want to update them please use the --subprojects parameter.
則說明執行成功。
常見BUILD FAILED問題
若是執行後,出現以下提示:
BUILD FAILED /Users/cundong/Documents/github/iZhihuPaper/build.xml:44: The following error occurred while executing this line: /Users/cundong/Documents/github/iZhihuPaper/build.xml:59: The following error occurred while executing this line: /Applications/adt-bundle-mac-x86_64/sdk/tools/ant/build.xml:470: Invalid file: /Users/cundong/Documents/github/SmoothProgressBar/build.xml
則說明它所依賴的工程缺乏project.properties、project.properties文件,請先參照步驟1,爲其依賴的工程生成project.properties、project.properties文件。
若是遇到如下問題:
BUILD FAILED /Applications/adt-bundle-mac-x86_64-20140624/sdk/tools/ant/build.xml:601: The following error occurred while executing this line: /Applications/adt-bundle-mac-x86_64-20140624/sdk/tools/ant/build.xml:653: The following error occurred while executing this line: /Applications/adt-bundle-mac-x86_64-20140624/sdk/tools/ant/build.xml:698: null returned: 1
則須要手動刪除該工程的gen、bin目錄。
配置local.properties文件,增長ant.dir、target.dir:
sdk.dir=/Applications/adt-bundle-mac-x86_64/sdk ant.dir=/Applications/apache-ant-1.9.4 target.dir=/Users/cundong/Documents/ZhihuPaperRelease
ant.dir爲ant安裝目錄,target.dir爲批量打包的apk存儲目錄。
詳細例子可參考:ZhihuPaper/local.properties
1.將簽名文件(*.keystore)拷貝到工程的目錄。
2.在根目錄下新建ant.properties文件。
key.store=android.keystore key.alias=android key.store.password=Cundong123456!@# key.alias.password=Cundong123456!@# market_channels=Wandoujia,360 app_name=ZhihuPaper app_version=2.1
說明: key.store爲簽名文件; key.alias爲簽名文件別名; key.store.password、key.alias.password爲密碼; market_channels爲咱們須要生成的全部渠道列表,使用「,」分開;app_name爲生成apk的文件名; app_version爲生成apk的版本號;
詳細例子可參考:ZhihuPaper/ant.properties
爲了實現批量打出多個渠道包,咱們必須手動對剛剛生成的build.xml文件進行修改。
引入ant.properties文件。
<property file="ant.properties" />
支持循環執行
<!-- 支持循環執行 --> <taskdef resource="net/sf/antcontrib/antcontrib.properties" > <classpath> <pathelement location="${ant.dir}/lib/ant-contrib-1.0b3.jar" /> </classpath> </taskdef> <echo>Run ant-contrib-1.0b3.jar 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> <replaceregexp encoding="utf-8" file="AndroidManifest.xml" flags="s" match='android:name="UMENG_CHANNEL".+android:value="([^"]+)"' replace='android:name="UMENG_CHANNEL" android:value="${channel}"'/> <property name="out.final.file" location="${target.dir}/${app_version}/${app_name} V${app_version}(${channel}).apk" /> <antcall target="clean" /> <antcall target="release" /> </target>
配置後,會讀取ant.properties中market_channels中配置項,獲得一個渠道號數組,對這個數據進行迭代,替換AndroidMainfext.xml文件中的android:name="UMENG_CHANNEL"。
每替換好一個,將輸出到"out.final.file"。
${target.dir},即爲local.properties文件中配置的target.dir=/Users/cundong/Documents/ZhihuPaperRelease ${app_name},即爲ant.properties文件中配置的app_name=ZhihuPaper ${app_version},即爲ant.properties文件中配置的app_version=2.1 ${channel},即爲當前循環的渠道號
請務必保證${target.dir}/${app_version}目錄真是存在而且有寫權限。
當前例子中爲:/Users/cundong/Documents/ZhihuPaperRelease/2.1,若是這麼目錄不存在,則會提示報錯信息。
詳細例子可參考:ZhihuPaper/build.xml
proguard-project.txt,即混淆時的配置文件。
引用的第三方jar包,不要混淆;
本身寫的控件,即須要配置在layout文件中的Widget,不要混淆;
Android的基礎組件,不要混淆。
須要在project.properties中配置:proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
詳細例子可參考: ZhihuPaper/proguard-project.txt
在iZhihuPaper中建立一個批處理文件,Mac爲.sh文件,Window爲.bat文件:
cd /Users/cundong/Documents/github/iZhihuPaper ant deploy pause
調用這個批處理文件,便可進行批量打混淆後的渠道包。