android ant 自動批量打包——帶有第三方專案library的情況
如果你每次打包都需要不斷地手動打包,通過不斷地複製貼上,當你打幾百個包的情況下,我相信你一定會瘋掉的,當然,這種事情在我們程式設計師看來,都是可以解決的事情,因為,我們的工作就是讓本來繁瑣的工作變得簡單一點。今天我們就需要簡單地介紹一下ant批量打包的問題吧。
網上看到的資料各有千秋吧,現在是時候做一個總結,站在各位大神的肩膀上我們才能夠看得更加遠。
首先你應該去官網上面下載apache-ant的最新版,我這邊使用了一個apache-ant-1.9.4,這是當前的最新版的,現在附上下載連結——可以去我的資源上面去下載,下載連結為:http://download.csdn.net/detail/litianpeng1991/8396457
下載好了之後,我們開始配置環境 變數,下面是配置過程:
這是我的ant的路徑:
配置環境變數:
配置好了之後我們可以去cmd下面驗證一下:
如果出現上面的情況,說明ant已經配置成功了,接下來我們為了可以實現批量(迴圈)打包,必須要實用一個jar包——ant-contrib-1.0b3.jar
下載好了之後大家一定要將字尾名從zip改為jar,然後將這個jar包拷貝到apche-ant-1.9.4/lib/資料夾下面
接下來就輪到我們project進場了。
1、首先我們進入project的目錄下,輸入命令,命令格式如下:
android update project --name <project_name> --target <target_ID>--path <path_to_your_project>
2、我們將第三方jar包可以直接放在libs資料夾下面,android在編譯打包的時候可以自動將這些jar加進去的,但是我們也要考慮到一種情況的,就是android project是支援引用第三方專案library的,就是第三方library是以project的形式存在的,這時候我們應該怎麼辦呢?
下面介紹解決的辦法:(下面的命令都要在一直的 專案目錄下,千萬別進錯了目錄)
android project --name 專案名 -p ./ --subprojects
這時候肯定會出現一個問題的:
Error:The project either has no target set or the target is invalid,
Please provide a --target to the "android.bat update" command.
這是因為我們的第三方專案library其實也是需要進行ant設定的,
這時候我們進行第三方專案的目錄下:執行如下命令
android update 第三方專案名 -p ./
執行完這個之後,我們第三方專案目錄下應該多了兩個檔案build.xml和local.properties兩個檔案
然後我們再進行原來的專案目錄下執行原來的命令,但是如果還會出現上面紅色標記的問題,此時也可以執行 下面的命令:
android update project -p . -t android-15 -s(其中這個android-15是可以隨便寫的,寫你自己有的target)
這時候我們會發現我們的專案名下面也會有兩個新生成的檔案,分別是build.xml和local.properties
build.xml內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project
name="<span style="background-color: rgb(255, 0, 0);">專案名</span>"
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" />
<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>
local.properties檔案內容如下:
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
# location of the SDK. This is only used by Ant
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=D:\\android_developer\\androidSDK\\sdk
這時候我們開始編寫custom_rules.xml——這是我們新建的一個xml檔案,下面的紅色部分,要將我們上面下載的jar包放到libs中去
<?xml version="1.0" encoding="UTF-8"?>
<!-- 渠道包打包指令碼 ant deploy -->
<project name="custom_rules" >
<!-- 引用支援迴圈的jar包ant-contrib-1.0b3.jar -->
<taskdef resource="net/sf/antcontrib/antcontrib.properties" >
<classpath>
<span style="color:#ff0000;"><pathelement location="libs/ant-contrib-1.0b3.jar" /></span>
</classpath>
</taskdef>
<!-- 迴圈打包,target名為deploy,構建的時候必須選擇deploy -->
<target name="deploy" >
<!-- 進來的時候先clean一下專案 -->
<antcall target="clean" />
<!-- for迴圈內容傳進來的引數為market_channels,以","為分隔構建list,迴圈讀取list,並將讀取到的字串以引數channel傳進modify_manifest中 -->
<foreach
delimiter=","
list="${market_channels}"
param="channel"
target="modify_manifest" >
</foreach>
</target>
<target name="modify_manifest" >
<!-- 按正則匹配獲取渠道名字,賦給channelname -->
<propertyregex
input="${channel}"
override="true"
property="channelname"
regexp="(.*):"
select="\1" />
<!-- 按正則匹配獲取渠道號碼,賦給channelkey -->
<propertyregex
input="${channel}"
override="true"
property="channelkey"
regexp=":(.*)"
select="\1" />
<!-- 將AndroidManifest.xml中的android:name="channelname"替換成為android:name="${channelname}",這裡的${channelname}是我們上面正則匹配出來的內容 -->
<replaceregexp
byline="true"
encoding="utf-8"
file="AndroidManifest.xml"
match="android:name="channelname""
replace="android:name="${channelname}"" />
<!-- 將AndroidManifest.xml中的android:value="channelkey"替換成為android:value="${channelkey}" -->
<replaceregexp
byline="true"
encoding="utf-8"
file="AndroidManifest.xml"
match="android:value="channelkey""
replace="android:value="${channelkey}"" />
<!-- 用release打包 -->
<antcall target="release" />
<!-- 拷貝渠道包到指定目錄下,out.absolute.dir在自帶的build.xml中定義了,為bin目錄,如果要修改,可以在local.properties中新增一行out.absolute.dir=指定目錄 -->
<copy
file="${out.absolute.dir}/${ant.project.name}-release.apk"
tofile="${out.absolute.dir}/out/${ant.project.name}-v${version}-${channelkey}.apk" />
<!-- 打包完一個渠道包後把渠道名和渠道號替換回原來格式,這樣可以進行下一次替換,AndroidManifest.xml裡所有匹配的東西都會被替換 -->
<replaceregexp
byline="true"
encoding="utf-8"
file="AndroidManifest.xml"
match="android:name="${channelname}""
replace="android:name="channelname"" />
<replaceregexp
byline="true"
encoding="utf-8"
file="AndroidManifest.xml"
match="android:value="${channelkey}""
replace="android:value="channelkey"" />
</target>
</project>
接下來還需要新建一個ant.properties配置檔案:
key.store=key.store路徑
key.store.password=密碼
key.alias=寫上你的alias
key.alias.password=密碼
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
market_channels=UMENG_CHANNEL:3000,UMENG_CHANNEL:3001,UMENG_CHANNEL:3002
version=1.1.2
寫完這個 之後,我們還需要更改AndroidManifest.xml中一處:
<meta-data android:name="channelname" android:value="channelkey"/>
記住,讓這個在一行之中,連空格都要控制好,因為匹配中已經寫好了相關的配置。
接下來大家可以運行了,但是如果執行中出現了——因為很多警告導致錯誤的,
那麼大家可以看一看,是不是自己寫了混淆檔案,不能講剛剛加入的jar 包混淆,
如果還是出現問題,那麼直接新增上忽略warnings就可以了,感謝大家的捧場,希望大家可以多多喜歡。向上吧,少年。