Android本身是支持ant打包項目的,並且SDK中自帶一個build.xml文件。
通過該文件,可以對文件進行編譯、打包、安裝等。並且支持多種方式打包,如debug或者release。
一般的,可以按照如下方法進行操作:
首先創建一個Android工程。
工程創建好後,需要為工程添加ant支持,即創建相應的build.xml文件。
這個文件不需要用戶自己創建,只需要執行如下命令即可:
<sdk>/tools/android update project -p <project> -t <target>
其中:
sdk為sdk的安裝目錄,其下的tools/android是我們要使用的命令。
project為項目目錄。
target為項目所使用的android的target id,也就是項目對應的android的版本。
可以將sdk的tools目錄添加到環境變量 ~/.bashrc 文件中,重啟後生效,以後可以直接使用命令了。
可以通過執行以下命令查看當前sdk中所包含的target以及相應id:
android list targets
比如我android tools已經配置完畢了 所以只需要打以下命令就可以了
android create project -k com.demo -a DemoActivity -t 2 -p .
這裡-k後是包名參數;-a後是項目名稱;-t後是目標項目使用SDK版本的id,-p後是目錄 . 代表全部。
如果是eclipse adt生成的android項目,可以進入到項目目錄,通過如下命令為項目增加ant支持:
android update project -p . -t 2
執行完android update project命令後,會在項目的根目錄下生成相應的ant文件。
主要有build.xml、ant.properties、local.properties三個文件。
如果沒有ant.properties文件,可以自己手動添加。
其中,build.xml文件是進行ant build的主要文件,它引用了其它的文件。
在local.properties文件中定義了sdk.dir屬性,也就是當前使用的sdk的目錄。
在ant.properties文件中,可以定義自己的一些屬性,或者重定義一些屬性。
當然,這兩個屬性文件可有可無,直接定義到build.xml中也沒有關系。
在build.xml中的最後,引用了sdk目錄下的tools/ant/build.xml文件。
這個是sdk默認的build文件,可以將其內容直接拷貝過來,也可以保持當前的引用方式。
項目下的build.xml默認執行的target是help,運行後可以看到相關的幫助信息。
通過幫助信息,可以看到其它可用的target。
一般的,我們需要修改為debug或者release。
修改好之後,再運行build.xml文件,就會執行我們需要的編譯過程了。
build.xml文件的執行方法為:右鍵->Run As->Ant Build。
如果是debug版的話,默認會使用debug方式簽名。
如果是release版的話,需要指定相應的keystore以及私鑰。
否則,最後只能生成一個沒有簽名的apk文件。
設定私鑰庫的方法是,在ant.properties文件中,添加如下內容:
key.store=<keystore>
key.alias=<key>
key.store.password=<keystore pwd>
key.alias.password=<key pwd>
其中:
keystore為私鑰庫文件。
key為簽名需要使用的私鑰。
key.store.password為私鑰庫的密碼。
key.alias.password為私鑰的密碼。
兩個密碼相關的屬性也可以不添加,而只添加私鑰庫及私鑰。
這樣的話,執行時會依次彈出相應的輸入框,提示用戶輸入相應的密碼。
這樣雖然相對繁瑣,但是由於沒有明文指定密碼,對私鑰庫的保護會更好一些。
如果項目引用了第三方庫的話,只需要在項目根目錄創建libs文件夾並將其放入即可。
如果是jar庫,直接放到libs目錄下;如果是so庫,需要放到libs的名為armeabi的子目錄下。
也可以通過設定相應的屬性來指定第三方庫的位置,其默認都是libs文件夾。
jar.libs.dir為jar類型庫所在的目錄。
native.libs.absolute.dir為so類型庫所在的目錄,即armeabi的父目錄。
如果項目包含了jni代碼,希望在打包時自動重新編譯so庫,可以修改build.xml文件。
修改方法為,在引用sdk的build.xml文件之前添加如下target:
<target name="-pre-build" depends="-ndk-build">
</target>
<target name="-ndk-build">
<exec executable="ndk-build" failonerror="true">
<arg value="clean" />
</exec>
<exec executable="ndk-build" failonerror="true" />
</target>
ndk-build為ndk提供的命令,需要將ndk安裝目錄添加到環境變量中,添加方法同sdk/tools。
生成的so默認會放到libs/armeabi目錄下。
使用默認的build.xml打包apk時,已經包含了混淆、簽名、對齊優化等相關過程。
如果是使用release的方式,最後生成的apk文件已經可以直接發布了。
遺留問題:
目前采用這種方法生成的APK,雖然已經被簽名了,但是,安裝時錯誤,提示未簽名。
查看APK包中的簽名文件,不是默認的CERT.*,而是<key>.*。
然後,即使將名稱修改成CERT.*,程序仍然不能正常安裝。
如果導出debug版本,則不會有這個問題。
用ADT插件導出簽名APK,也不會有這個問題。
解決方法:
產生此問題的根本原因是JDK1.7造成的,只有運行Ant使用jre1.7的版本時,才會發生該問題。
可以通過設置運行build.xml文件時使用的jre版本來解決,具體方法是:
選中build.xml->右鍵->Run As->External Tools Configurations,
在右側區域選中JRE標簽頁,可以看到對jre設定有三個選項:
Run in the same JRE as the workspace使用與workspace相同版本的jre。
Execution environment根據相關環境選擇一個jre版本。
Separate JRE使用一個已經安裝的jre的當前版本。
一般項目的jre都會設定為1.7以下的版本,所以建議選擇第一個,使其與項目設定保持一致即可。