android 程序打包成apk,如果在是命令行方式,一般都要經過如下步驟:
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
eclipase手動打包生成apk方式,只不過是eclipase代替我們執行了以上命令而已。
eclipse用起來雖然方便,為什麼要使用Ant批量打包Android應用,對於我來說主要有以下兩方面考慮:
1、我們在發布App的時候,可能需要發送到十幾,甚至幾十個不同的分發渠道,比如360手機市場,百度,應用寶等等,我們可能需要對各個渠道的下載量,用戶存留和用戶使用情況等數據進行分析,比如使用百度移動統計,友盟統計等。為了實現統計功能,我們需要在配置文件中添加一個數據元,來標識我們的應用要發布到哪一個渠道上,因此,若使用傳統的方法,我們每發布一個渠道的版本,就需要修改清單文件中的數據元,然後再使用keystore進行簽名和打包。若只有一兩個分發渠道,工作量還是可以接受的,但是若我們的分發渠道打到幾十個的時候,我們如果再手動的進行修改然後簽名打包發布,那工作量就很可觀了。因此,為解決這種需求,我們采用Ant來實現對Android應用的自動打包。
2、我們做產品的時候,肯定需要經常打不同環境的包,比如開發環境,測試環境,生產環境,這個時候你怎麼辦,如果用傳統方法,你打開發環境包你要把你的服務端IP和圖片服務器IP改成開發的,打包,然後打測試的包,你又要改成測試服務器IP和圖片服務器IP,這樣多麻煩,如果你把這服務端IP和圖片服務器IP,配置到一個xml文件裡,用ant打包方式實現自動替換,多方便。
ant 自動打包APK一般有以下兩種方式:
1、使用原生Ant方式,就是把所有的環境變量和打包的起個步驟都配置到build.xml文件裡,這樣可以實現,但是這樣的話也有不方便之處,你如果引用了第三方library(不是第三方jar包),配置起來可能就比較麻煩了,而且跨平台你可能就要修改一些配置了,比如windows下和linux下批處理文件不同等。所以我更推薦第二種方式,本文也主要介紹第二種方式。
2、使用Android SDK Ant方式,Android SDK中提供了包含之前寫過的操作的封裝,只需要使用一條命令android update project生成build.xml ,之後再修改配置文件支持不同特性即可,完全不用寫ant代碼,這些都由Android SDK自動生成。下面我來詳細介紹下此種方式。
以我們現在開發的產品為例:
一:設置JAVA環境變量
這個我就不說啥了,做android開發的配置這個是基礎。
二:配置Android的SDK環境變量
除了需要Java的環境變量,我們還需要配置Android的sdk的位置,名字是ANDROID_HOME,值就是你的android的sdk的位置,比如我的,就如下所示:
二:安裝ant並設置ant環境變量
1、在Ant官網(http://ant.apache.org/bindownload.cgi)下載最新Ant包,在http://sourceforge.net/projects/ant-contrib/files下載Ant擴展包ant-contrib-1.0b3.jar(這個包就是用於循環編譯多個渠道包)。
2、將Ant包解壓到常用開發工具目錄(自行選擇,我的放在D:/Dev目錄下),然後將下載下來的Ant擴展包ant-contrilb拷貝到Ant安裝目錄下的lib文件夾中。
3、設置Ant環境變量:ANT_HOME,變量值指向ant目錄。
4、在環境變量Path裡增加:%ANT_HOME%/bin;%ANT_HOME%/lib;
5、設置好了之後驗證一下。打開CMD 輸入ant -version命令出現下面反饋,說明ant 安裝成功
三、配置打包項目
我的項目文件目錄如下:
1、生成build.xml文件
打開cmd並進入到epeiwang這個項目目錄下 使用android update project -n epeiwang -p . 命令(注意-n表示項目的名稱,-p參數後面有個點 表示當前目錄)。
執行這個命令後,會在項目中自動生成build.xml和local.properties文件。
build.xml文件內容如下,並注意紅色部門標識的代碼。這兩個文件是需要用戶自己創建的,並存放在當前項目目錄下。
2、在epeiwangyxhd項目目錄下創建ant.properties和custom_rules.xml文件。ant.properties文件定義一些變量例如keystore密碼,apk存放目錄等;而custom_rules.xml這個文件就是用戶自定義的編譯規則文件。代碼分別如下:
A、ant.properties文件內容如下:
#keystore文件存放目錄
key.store=./epeiwang_keystore
#keystore別名
key.alias=epeiwang_keystore
#keystore密碼
key.store.password=xxxxxxx
#組織密碼
key.alias.password=xxxxxxxx
#如果還沒有生成keystore證書,可以使用下面命令在項目目錄下生成一個test.keystore證書文件
#generate test.keystore
#keytool -genkey -alias test.keystore -keyalg RSA -validity 20000 -keystore test.keystore
#apk.dir表示存放最終生成apk的目錄
apk.dir=./apk
#定義項目名稱
app.name=epeiwang
#渠道號,多個渠道號用逗號分隔,每個渠道號不要使用違規字符例如/:等,因為渠道號會在打包的時候放在apk的文件名中,所以包含#違規字符將無法生成最終的apk,哥就是被這個細節給坑了一個下午。這裡定義了兩個渠道號myapp-12345和BAI-3s322d
market_channels=epeiwang,baidu,91
#測試環境服務器配置
test.server.url=192.168.1.10/epeiwang
test.server.image.url=192.168.1.9
test.epeiwang.url=192.168.1.10
#生產環境服務器配置
rel.server.url=111.111.111.222/epeiwang
rel.server.image.url=111.111.111.229
rel.epeiwang.url=www.epeiwang.com
#測試環境標識 給apk命名的時候用
test.tag.name=test
#生產環境標識 給apk命名的時候用
release.tag.name=release
B、custom_rules.xml文件內容如下:
我的服務器IP配置hostconfig.xml文件內容為:
1111.1111.1111.1/epeiwang
1111.1111.1111.1
www.epeiwang.com
四、打包
1、如果項目中沒有引入第三方工程library,那麼經過以上環節,就把整個項目Ant打包配置好了,進入CMD,在項目目錄下使用antdeployrel命令,自動打生產環境的包,使用 antdeploytest,自動打測試環境的包。
2、如果項目中引入了第三方工程library,比如我的項目,引入三個第三方工程:
如果執行打包命令,那麼會報錯,這是因為那個library 還不支持ant自動編譯,我們需要先讓它也支持(注意:第三方工程要設置為Lib:
project->properties->Android->Library->Is Library 這個勾選上)。
進入到library項目所在的目錄,輸入命令 android update lib-project -p ./ (注意是 lib-project);
執行完之後,你會發現第三方工程目錄下多了build.xml文件和local.properties文件。然後你在執行打包命令就可以成功打包了。
五:總結
1、build.xml和local.properties可以用命令生成,custom_rules.xml和ant.properties可以收藏起來,任何項目中都可以用。
2、ant腳本中還可以加入自動從SVN下載最新版本源碼和打包之後通過ftp自動上傳到服務器供下載,還可以加入定時打包功能。
3、一些異常情況的解決辦法:
異常一:
BUILD FAILED
D:\Android\sdk\tools\ant\build.xml:601: The following error occurred while executing this line:
D:\Android\sdk\tools\ant\build.xml:653: The following error occurred while executing this line:
D:\Android\sdk\tools\ant\build.xml:698: null returned: 1
解決辦法:自己項目的build.xml文件中加入:
異常二:
BUILD FAILED
D:\ProjectDemo\build.xml:83: Cannot find D:\ProjectDemo\android-sdk-windows\tools\ant\build.xml imported from D:\ProjectDemo\build.xml
解決辦法:修改local.projects,必須是雙斜槓
sdk.dir=D:\\android-sdk-windows
異常三:
[aapt] D:\ProjectDemo\res\layout\activity_main.xml:2: error: Error: String types not allowed (at 'layout_width' with value 'match_parent').
[aapt] D:\ProjectDemo\res\layout\activity_main.xml:2: error: Error: String types not allowed (at 'layout_height' with value 'match_parent').
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
Total time: 1 second
解決辦法:當前Andorid版本不支持match_parent屬性值,match_parent是Android 8以後開始支持的屬性值,修改AndroidManifest中
最少也要大於8。不過也可以把match_parent改為FILL_PARENT