1. 程式人生 > >android ant 自動批量打包——帶有第三方專案library的情況

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就可以了,感謝大家的捧場,希望大家可以多多喜歡。向上吧,少年。