爲何要寫,由於真的能用到,而且若是用的時候不會,還要查不少,第一次估計要搞幾天(2天,可能我比較笨吧)。寫出來分享一下,其實主要是記錄一下,方便之後查閱,固然更但願能幫助到一些須要的人。html
ant打包好處有什麼java
在eclipse中當咱們的android項目須要打包出來的時候,每每是手動打包,若是有簽名文件則須要輸密碼,選擇輸出目錄等等操做,很麻煩。打包一個apk還好,當須要打包多個apk的時候,好比發佈應用時須要打包各個平臺的渠道包,幾十上百個渠道號,一旦有改動或者版本升級時須要從新打包的時候,手動打包就不是很好的方式了。這時候能夠用ant自動打包。android
什麼是渠道號web
android開發後,將項目進行打包,生成apk,這個apk文件能夠放到不一樣的應用市場,如360,應用寶,豌豆莢等。那當發佈到這些應用市場上以後,怎麼統計哪一個市場的下載量比較多,哪一個市場的推廣效果比較好呢?這就須要在開發中植入不一樣的渠道號,對應不一樣的渠道號,打包生成不一樣的apk,而後將它們放到不一樣的市場上。這樣就能夠達到統計不一樣市場的效果了apache
下載ANTless
百度「ant」,到Apache ant 官網,download。而後下載解壓到你的磁盤中。eclipse
而後在環境變量中配置ant的路徑(在cmd中可使用ant命令,這個就不說了)。ui
還有就是還要在環境變量中配置好Android SDK的路徑(可使用adb,andriod等命令就對了,這個也不須要說了,相信你們都已經配置好了)this
ant配置好以後在cmd裏面輸入antspa
Buildfile: build.xml does not exist!
Build failed,說明配置完成。
ANT打包
進入本身的工程目錄,執行命令:「android update project -p ./ 」參數p表示路徑, ./表示當前路徑
執行結果以下
Updated local.properties
No project name specified, using Activity name 'MainActivity'.
If you wish to change it, edit the first line of build.xml.
Added file E:\E\eoeandroid\MyDialog\build.xml
Updated file E:\E\eoeandroid\MyDialog\proguard-project.txt
It seems that there are sub-projects. If you want to update them
please use the --subprojects parameter.
在eclipse中刷新項目,能夠看到多瞭如下兩個文件
build.xml以下
<?xml version="1.0" encoding="UTF-8"?> <project name="MainActivity" default="help"> <property file="local.properties" /> <property file="ant.properties" /> <property environment="env" /> <condition property="sdk.dir" value="${env.ANDROID_HOME}"> <isset property="env.ANDROID_HOME" /> </condition> <loadproperties srcFile="project.properties" /> <!-- quick check on sdk.dir --> <fail message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." unless="sdk.dir" /> <import file="custom_rules.xml" optional="true" /> <!-- 這個很重要 下面講 --> <!-- version-tag: 1 --> <import file="${sdk.dir}/tools/ant/build.xml" /> </project>
custom_rules.xml以下
<?xml version="1.0" encoding="UTF-8"?> <project name="" > <!-- change this !!! set ANDROID_HOME env PATH to SDK HOme --> <property name="keystore" value="android.keystore" /> <property name="keystore.password" value="your password" /> <property name="key.alias" value="android.keystore" /><!-- 這裏折磨了我好久 --> <property name="key.password" value="your password" /> <!-- //////////////////////////////////////////////////////////////////////////////////////// --> <target name="mytest" depends="release" > <echo> signing the unsigned apk to final product apk ... </echo> </target> <!-- build channel macro --> <macrodef name="bc" > <!-- must set channel.name param --> <attribute name="channelName" /> <sequential> <echo message="*** CHANNEL NAME: @{channelName}" /> <!-- replace channel in AndroidManifest.xml --> <replaceregexp byline="true" file="AndroidManifest.xml" match="U0(\d)+" replace="@{channelName}" /> <!-- build apk --> <antcall target="clean" /> <antcall target="release" /> <!-- sign apk --> <sign-release /> <zipalign-release /> <mkdir dir="channels/@{channelName}" /> <move file="bin/${ant.project.name}-release-zipalign.apk" todir="channels/@{channelName}/" /> </sequential> </macrodef> <macrodef name="sign-release" > <sequential> <echo message="signing the unsigned apk to final product apk bin/${ant.project.name}-release-unsigned.apk" /> <echo message="jarsigner -keystore ${keystore} -storepass ${keystore.password} -keypass ${key.password} -signedjar bin/${ant.project.name}-release.apk bin/${ant.project.name}-release-unsigned.apk ${key.alias} " /> <exec executable="jarsigner" > <arg value="-keystore" /> <arg value="${keystore}" /> <arg value="-storepass" /> <arg value="${keystore.password}" /> <!-- 驗證密鑰完整性的口令,建立時創建的 --> <arg value="-keypass" /> <arg value="${key.password}" /> <!-- 專用密鑰的口令,就是key密碼 --> <arg value="-signedjar" /> <arg value="bin/${ant.project.name}-release.apk" /> <!-- 輸出 --> <arg value="bin/${ant.project.name}-release-unsigned.apk" /> <!-- 未簽名的apk --> <arg value="${key.alias}" /> <!-- 別名,建立時創建的 --> </exec> </sequential> </macrodef> <macrodef name="zipalign-release" > <sequential> <echo message="zipalign the signed apk" /> <exec executable="${sdk.dir}/tools/zipalign" > <arg value="-v" /> <arg value="4" /> <arg value="bin/${ant.project.name}-release.apk" /> <!-- signed apk --> <arg value="bin/${ant.project.name}-release-zipalign.apk" /> <!-- zipalign output --> </exec> </sequential> </macrodef> <target name="buildchannels" > <bc channelName="U068"/> </target> </project>
而後在cmd中輸入命令
ant buildchannels
哦對了,再此以前,若是你要生成release版本的, 要準備好你的key(keystore),關於生成keystore的方法,詳情請見個人另外一篇博文:Android生成keystore方法。
而後將生成的android.keystore拷貝到工程根目錄地下就好了。
以後,運行上面的命令吧(ant buildchannels)
關於遇到的問題請見我另外一篇博文: Android簽名問題,jarsigner的問題
OK,這樣問題應該就解決了。
關於build.xml custome_rules.xml的語法
這就不說,這個我也是現學現賣,學了一下,也是稀裏糊塗,只能說如今看懂了。
這個網上有不少資料。
參考資料:
Android打包混淆實戰總結:http://www.eoeandroid.com/thread-538246-1-1.html
簡單的ant打包,修改渠道號:http://www.cnblogs.com/stay/archive/2013/05/27/3102027.html
Android打包流程:http://www.cnblogs.com/0616--ataozhijia/p/3732370.html
Android打包官網:http://developer.android.com/tools/building/index.html
Android build.xml編寫:http://blog.csdn.net/jariwsz/article/details/6728337(這一篇寫的很好)
(貌似混淆的東西還沒加,以後再說吧)