2011年1月4日 星期二

【分享】- 如何整合 Eclipse、Android SDK、Proguard、Zipalign,以輸出有程式保護且可上載與發佈到 Android Market 的 APK 檔? PART-3

近日忙昏了頭,好不容易休了個元旦假,想說瞧瞧 Eclipse 與 Android SDK 的組合是否又發生了啥詭異的變化?經過一番更新下載後,果然...... @_@

Eclipse 版本 (Helios 3.6.1)
Android ADT (8.0.1) 版本
Android SDK (2.3 API 9) 版本

Google Android SDK 與 Eclipse ADT 每次在更新後,那個 Ant 的範本內容,總會有讓漁郎頭痛的變化。不是缺了某個參數,就是換了個參數名稱。這次咧!更慘!連 Ant 範本都給換了,還給你加入了 Proguard 整合!不知是該高興還是...... >_<

於是乎,漁郎乾脆整個不用 Ant,讓 Google 好人做到底,試著看看使用它新版 SDK 與 ADT 所提供的 Export Wizard 有啥方便之處?反正漁郎可以省些製作上載 Android Market 的 APK 所需的步驟就行了 (懶人的天性...^_^),以下的說明如果漁郎有搞錯的地方,夥伴們請儘量“凸槽”,好讓漁郎能有所進步... >_<

(1) 將 Android SDK 與 ADT 更新到最新版本 (撰文時為 Android 2.3 API 9 , ADT 8.0.1)。

(2) 漁郎使用的是 Eclipse 之 Helios 3.6.1 版本。

(3) 建立一個新的 Test 專案 (本文範例)。


PS:在此漁郎是以新專案建立的方式為範本說明,舊專案的處理方式則是以將整個舊專案翻新 (建新專案並將所有程式與資源檔複製到新專案中),且改成使用 Eclipse Builder 產生 .apk 檔。如果朋友們要在不更動以 Ant 為主的方式更新您的舊專案時,請使用以下命令列產生出 proguard.cfg 檔: android update project --path <project>,由於漁郎沒再去試著使用 Ant 編譯,所以在此就先不說明 build.xml 內的參數要做啥變化了,爾後當漁郎被雷打到突然想玩時再跟大夥兒分享心得 >_<。

(4) 記得 AndroidManifest.xml 中將 debuggable 改為 false。


(5) 找到並打開專案裡的 proguard.cfg 檔。


(6) 加入在 AndroidManifest.xml 中出現的 activity 名稱 (如有引入 JNI 也需要,
參考:http://developer.android.com/guide/developing/tools/proguard.html)


(7) 找到並打開專案中的 default.properties 檔。


(8) 加入 Enabled the Proguard 所需參數到 default.properties 檔中 (不用理該檔文頭的那些警告,經測試加入 proguard 參數不會被蓋掉)。


(9) 編輯 Android 專案,以產生原始 apk 檔 (在專案上以滑鼠右鍵叫出選單再點選 Build Project)。


(10) 匯出有簽章並經 Proguard 混淆且已 Zipaglin 可上載到 Android Market 的 apk 檔  (在專案上以滑鼠右鍵叫出選單再點選 Android Tools -- Export Signed Application Package...).

選單點選

Project Checks

Keystore selection

Key alias selection

Destination and key/certificate checks (記得加入 .apk 副檔名)

(11) 如匯出 apk 檔成功,Refresh 專案,就可看到在專案底下有個 proguard 目錄,其中有許多關於在經過 Proguard 混淆後的專案參數資料可以參考。




(12) 在你指定的匯出目錄中亦有了可上載至 Android Market 的 .apk 檔 ^__^。



PS1:當使用 Eclipse 中 Android SDK (ADT) 所提供的 Export Wizard 匯出含簽章的 .apk 檔時,ADT就已順便幫你使用 Zipalign 優化過了,因此可將製作出的 .apk 檔上載 Android Market,
參考:http://developer.android.com/guide/developing/tools/zipalign.html

PS2:當漁郎的專案使用到 libs 內自己加入的 .jar 時,在進行 Export 並使用 Proguard 有時會產生一堆 Warning,以致無法順利匯出 .apk 檔,這時在 proguard.cfg 檔內加入參數 -ignorewarning 就解了該問題。有遇到同樣狀況的朋友們不妨試試 ^_^。
參考:http://osdir.com/ml/Android-Developers/2010-12/msg02838.html

一堆 Warning @_@...

13 則留言:

  1. Android SDK (2.3 API 9) 版本 圖放錯了

    回覆刪除
  2. 現在ADT又出到9.0了....

    回覆刪除
  3. 是阿~~ 真的趕不上變化 @@ ... 暈

    回覆刪除
  4. 漁郎大哥請問一下.
    我有個應用程式已經發佈至Market上去了
    但是現在卡在更新問題...
    上傳更新檔後出現這樣一段信息
    (The apk must be signed with the same certificates as the previous version.)
    我的android:versionName & android:versionCode有重設過了只是不知為何不能更新??

    回覆刪除
  5. 喔喔~ 完了!您是不是重新 build 過 Keystore?就那個 android.keystore?同一個程式一定要用同一個 Keystore 喔。漁郎就有慘痛的經驗,那個 GDPW 的 APP 就一直無法更新,只能重新上載一個新 APP ID 的 APP 。跟 android.versionName 與 android.versionCode 是無關的。

    回覆刪除
  6. 以下的連結有些網友討論的參考資料:http://www.google.com/support/forum/p/Android%20Market/thread?tid=6d113154a565b586&hl=en

    回覆刪除
  7. 意思是最初上傳到Market上的.apk檔要留著嗎..?
    Export出更新檔要選(Use existing ketstory)覆蓋至原來的apk檔?

    回覆刪除
  8. Hello~ 振揚,或許您可先參考一下漁郎「創始」的一篇文章,瞭解一下 Google 關於 Android 程式發佈的相關認證機制喔。其產出 android.keystore 的方式(command mode) 相對應於上述 Eclipsec 中 ADT 中的作法,相當於是「Keystore selection」中的 create new keystore... 與「Key alias selection」中的 create new key...。

    回覆刪除
  9. 參考文章:http://www.e68club.com/2010/03/eclipseandroid-sdkproguardant-android_4261.html

    回覆刪除
  10. 如後續需要更新 APK,則是選擇 Use existing ketstory...,並使用原來的 Keystore 檔。

    回覆刪除
  11. 好了,問題已經解決了
    我重新傳了一個新的程式上Market上去測試
    更新時
    保留原始的apk檔然後覆蓋更新後的apk
    呵呵,果然是要用(Use existing ketstory)
    看來我的舊程式要砍掉重練了@@

    謝謝你呀 漁郎大哥^^

    回覆刪除
  12. 派謝~沒事先「警告」你那個 keystore 檔的重要性 >_< ....
    還有,只要是使用原本的 keystore 檔與選擇「Use existing ketstore」所製作出來的 APK 檔都可以覆蓋與更新在 Android Market 上面已經上載的舊 APK 檔,不見得要保留存在 Local(本機電腦)的 APK 檔。「重點」是:一定要留存原本使用在這個 APK 的 keystore 檔,不要刪除或遺失了這個 keystore 檔,不然,會粉慘滴。。。

    回覆刪除