Eclipse下Ant自動打包,混淆和簽名

如有轉載,請聲明出處:http://blog.csdn.net/zhongkejingwang/article/details/37914219

爲什麼要寫這篇博客,因爲我被這個東西折磨了兩天,網上說的好多都有問題,最坑爹的就是版本不同導致的錯誤。下面分享一下我總結出來的快捷的ant打包方式以及遇到的一些問題和解決方法(在windows環境下)。

ant打包有什麼好處?

在eclipse中當我們的android項目需要打包出來的時候,往往是手動打包,如果有簽名文件則需要輸密碼,選擇輸出目錄等等操作,很麻煩。打包一個apk還好,當需要打包多個apk的時候,比如發佈應用時需要打包各個平臺的渠道包,幾十上百個渠道號,一旦有改動或者版本升級時需要重新打包的時候,手動打包就不是很好的方式了。這時候可以用ant自動打包。ant打包出來的apk和我們手動打包出來的是一樣的,它只不過是自動執行已經寫好的打包命令而已。OK,下面講一下如何使用ant進行打包,待會兒我會演示我遇到的打包失敗的情況和解決方式。第一次寫博客,有點囉嗦......

配置ANDROID_HOME環境變量

很簡單的ant打包我們只需要利用eclipse自帶的ant插件即可實現,首先配置ANDROID_HOME,右鍵 計算機->屬性->高級->環境變量,如下圖,在“系統變量”下新建一個變量,變量名爲ANDROID_HOME,變量值爲android_sdk的存放目錄

然後,在系統變量中的Path變量裏最前面添加“%ANDROID_HOME%/tools;”;如下圖(注意有個後面有個分號)

好了,確定配置完畢,這樣完了之後我們就可以在cmd窗口中執行android命令了,如果顯示android不是系統命令,那麼檢查自己在配置ANDROID_HOME過程中出了什麼問題吧,其實咱們執行的android命令就是tools目錄下的android.bat,所以纔在Path中添加tools的路徑。

ant打包

前面我們已經配置好ANDROID_HOME了,下面我們進入cmd,並進入需要ant打包的工程根目錄,執行命令“android update project -p ./”,參數p表示路徑,用./表示當前路徑,執行結果如下圖:

然後我們在eclipse中刷新項目,可以看到多了以下兩個文件
building.xml和local.properties

我們先不要看裏面是什麼,現在我們已經可以使用ant進行打包了,在build.xml文件上右鍵->運行方式,由於是第一次執行ant構建,我們選擇第二個“ant 構建”配置執行的選項target

這裏我選的release,這些target都是sdk自帶的ant寫好的,在“xxx\android-sdk\tools\ant\build.xml”中有定義

執行順序可以自己調整,“help”可以在目標中把勾去掉。點擊運行,開始打包。如果最後打包成功了,恭喜你,你的軟件版本沒有問題,可以跳過下面的問題。我在使用ant的時候遇到下面兩個問題導致最後打包失敗。
注意:ant 構建前先clean一下!

問題1


構建失敗
D:\Program Files\Android\android-sdk\tools\ant\build.xml:397: The Android Ant-based build system requires Ant 1.8.0 or later. Current version is 1.7.1

這個很容易解決,下載ant1.8以上就可以了,遇到這個問題的小夥伴們可以點擊這裏下載提取碼:66b4。我上傳的ant壓縮包。csdn資源上傳審覈真特麼噁心,我只能放在360雲盤了。
下完之後解壓即可,這裏我解壓到E盤,"E:\Ant",然後在eclipse中配置ant目錄,窗口->首選項->Ant,選擇“運行時”
如下圖點擊Ant主目錄選擇"E:\Ant"

確定後再按照前面講的執行“ant 構建”,如果成功打包,說明沒有其他問題了。

問題2

[dx] UNEXPECTED TOP-LEVEL EXCEPTION:
          [dx] java.nio.BufferOverflowException
          [dx] at java.nio.Buffer.nextPutIndex(Buffer.java:501)
          [dx] at java.nio.HeapByteBuffer.putShort(HeapByteBuffer.java:296)
          [dx] at com.android.dex.Dex$Section.writeShort(Dex.java:818)
          [dx] at com.android.dex.Dex$Section.writeTypeList(Dex.java:870)
          [dx] at com.android.dx.merge.DexMerger$3.write(DexMerger.java:437)
          [dx] at com.android.dx.merge.DexMerger$3.write(DexMerger.java:423)
          [dx] at com.android.dx.merge.DexMerger$IdMerger.mergeUnsorted(DexMerger.java:317)
          [dx] at com.android.dx.merge.DexMerger.mergeTypeLists(DexMerger.java:423)
          [dx] at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:163)
          [dx] at com.android.dx.merge.DexMerger.merge(DexMerger.java:187)
          [dx] at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
          [dx] at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
          [dx] at com.android.dx.command.dexer.Main.run(Main.java:230)
          [dx] at com.android.dx.command.dexer.Main.main(Main.java:199)
          [dx] at com.android.dx.command.Main.main(Main.java:103)
這個問題是由於sdk的build-tools版本導致的,我在19.x版本上都遇到這個問題,更新到20或者刪掉19改用18問題解決。如果sdk Manager更新不了可以到網上直接下載最新的sdt把build-tools目錄拷貝到當前sdk的build-tools中即可,如果安裝了低版本的可以直接把19版本刪掉。

以上就是我遇到的兩個問題和解決方法。
如果打包成功,刷新bin目錄會發現有未簽名的apk:“xxx-release-unsigned.apk”,下面我們要爲ant配置簽名文件和混淆文件。

加入混淆和簽名

數字簽名大家都知道怎麼一回事兒了,混淆代碼就是將編譯好的.class中的類名映射成一些看不出確切意義的字母,防止被反編譯。我們在ant的配置文件中添加參數名和參數值。那我們就要看自動生成的build.xml裏寫的是什麼東西了。
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" />

    <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" />

    <import file="${sdk.dir}/tools/ant/build.xml" />

</project>

build.xml裏面就這麼短的代碼,其實,核心部分就是最後的“<import file="${sdk.dir}/tools/ant/build.xml" />”我們執行的release就是在/tools/ant/build.xml中定義的,那我們自己的東西要寫在哪裏呢?看這兩句“<property file="local.properties" />”和“<property file="ant.properties" />”,local.properties已經給我們生成了,ant.properties沒有生成,如果你需要也可以新建一個,那麼我們的配置就寫在local.properties中。如果不知道怎麼創建數字簽名文件,我就再囉嗦一會兒,手動導出apk的時候提示選擇一個keystore,這時候可以選擇Create new keystore,存放目錄放在當前工程根目錄下,填完後先導出一個apk,之後就可以看到工程下有個.keystore文件了。接下來我們就可以配置ant打包選項了。下面來看local.properties的內容:
#下面這句是自動生成的
sdk.dir=D:\\Program Files\\Android\\android-sdk
#數字簽名文件
key.store=jingchen.keystore
#別名alias
key.alias=jingchen
#數字簽名的密碼
key.store.password=111111
#alias的密碼
key.alias.password=111111
#這裏設置混淆代碼,在當前項目的proguard-project.txt中編寫混淆規則
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

上面註釋都寫着。好了,到這裏我們的ant帶簽名和代碼混淆的自動打包搞定了!
注意:ant 構建前先clean一下!這個也可以寫到配置文件裏,下一篇文章會講到。在下一篇文章中,我將會講到如何批量多渠道打包!




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章