最近在一個android項目中遇到了這樣一個需求,對於不一樣的客戶須要不一樣的apk名稱,icon,並對apk進行不一樣的配置。 java
從原理上講,這是比較簡單的,無非是對values/string.xml中相關字段進行修改,將相應的圖標放置到對應的drawble文件夾下等。但這在實現過程當中遇到了一些問題,現記錄下來與諸君共享。咱們知道打包編譯後的apk實質上是一個壓縮包,將apk後綴改爲zip後解壓咱們能夠看到有以下文件: android
咱們能夠看到,android爲了提升文件讀取效率,將values文件夾下的全部xml文件都編譯進了resource.arsc的二進制文件中,若咱們直接對resources.arsc進行修改,將會比較麻煩,故決定採起ant從新編譯的方式來實現。 程序員
apk的編譯過程分爲如下幾個階段: apache
1.用aapt命令生成R.java文件
2.用aidl命令生成相應java文件
3.用javac命令編譯java源文件生成class文件
4.用dx.bat將class文件轉換成classes.dex文件
5.用aapt命令生成資源包文件resources.ap_
6.用apkbuilder.bat打包資源和classes.dex文件,生成unsigned.apk
7.用jarsinger命令對apk認證,生成signed.apk windows
由上述步驟咱們能夠看到,如果手工去實現這些步驟會很是繁瑣,幸虧咱們有ant,能夠幫助咱們方便的來處理這些事情。 測試
瞭解了這些原理,讓咱們來看看是如何使用ant來編譯apk的。 ui
步驟一、 this
下載ant,顧名思義,咱們須要使用ant,下載地址,到官網上下載對應的版本吧個人版本是 spa
Apache Ant(TM) version 1.9.3 命令行
步驟二、
配置ANT_HOME以及PATH,對於這兩個配置相信java程序員必定不陌生了,故名思議,ANT_HOME爲ant的解壓目錄,path爲ANT_HOME/bin。配置好後測試一下,打開cmd,輸入ant -verbose。若出現對應ant版本號,則說明配置成功了。
注:期間我遇到了這個問題
Unable to locate tools.jar. Expected to find it in C:/Program Files/Java/jre/lib/tools.jar
將C:/Program Files/Java/jdk/lib下的tools.jar拷貝到 C:/Program Files/Java/jre/lib下便可解決
步驟三、
使用anroid adt自帶的android.bat對項目工程進行更新。android.bat路徑在對應sdk\tools下,如個人在F:\android\adt\sdk\tools下。
在cmd窗口中敲入以下命令:
#更新項目 android.bat update project --name ATest -t 6 -p f:/test/android/ATest
其中
--name 爲項目名稱
-t android編譯版本
-p 項目路徑
上述命令將會在項目中自動建立相應所需的build.xml等。
若在更新時候出現以下問題:
Error: Target id '16' is not valid. Use 'android.bat list targets' to get the target ids.
則先輸入以下代碼來查詢目前所支持的android編譯版本。
android.bat list targets
步驟四、
相關資源準備。
一、將打包簽名所需store拷貝到項目路徑下
二、在項目的根目錄下建一個ant.properties文件(注:有些系統下使用的是local.properties的文件),輸入以下內容,其中keystore密碼和alias密碼能夠不指定(防泄漏),那麼在命令執行的過程當中會要求你輸入
key.store=release.keystore key.store.password=antPassword key.alias.password=antPassword key.alias=release proguard.config=proguard.cfg
步驟五、
使用ant運行項目。
在cmd命令行輸入
ant release
其中曾經遇到過這個問題,主要是未引入keystore所至,將能夠store拷貝到項目下便可:
BUILD FAILED D:android-sdk-windows\tools\ant\build.xml:650: The following error occurred while executing this line: D:android-sdk-windows\tools\ant\build.xml:691: null returned: 1
若無問題,則會在對應的bin目錄下看到生成好的apk啦。
release: BUILD SUCCESSFUL Total time: 18 seconds