2011-11-15 60 views
1

我以前可以按照指導here設置並運行Proguard作爲構建的一部分,沒有任何問題。但是,由於更新到最新版本的ADT工具,我遇到了麻煩。我遇到的第一個問題是:Android上的Proguard Broken?

BUILD FAILED 
/home/myhome/projects/myapp/add-proguard-release.xml:14: 
/home/myhome/projects/myapp/${out.classes.dir} does not exist. 

所以我最終不得不在任何local.properties或project.properties手動定義$ {} out.classes.dir。不是世界末日,但有點痛苦。

第二個更嚴重的問題是與外部罐子有關。我在一個外部的罐子裏有一個小班。當應用程序的設備,應用程序崩潰上啓動:

11-15 18:35:30.090: E/AndroidRuntime(28258): java.lang.NoClassDefFoundError: com.mysoftware.informaltimeprovider.InformalTimeProvider 
11-15 18:35:30.090: E/AndroidRuntime(28258): at com.mysoftware.pagemonitor.PrintableTimeProvider.getInformalTime(PrintableTimeProvider.java:14) 

努力創造InformalTimeProvider的實例時,它崩潰,而是由logcat的輸出判斷,這個類是不混亂,所以我不知道爲什麼有問題。

有在編譯過程中的警告:

[proguard] Copying resources from program jar [/home/myhome/projects/pagemonitor/libs/InformalTimeProvider.jar] 
[proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [InformalTimeProvider.jar:META-INF/MANIFEST.MF]) 

這雖然只是一個警告 - 我不希望崩潰。

任何幫助感激地收到。

巴里

+0

你能告訴我你是如何手動重新劃分的? /home/myhome/projects/myapp/${out.classes.dir}不存在。 – sheetal

+0

我現在無法檢查,但我有一種感覺放棄了對特定項目的proguard :-( – barry

回答

1

Proguard的最小化的應用程序大多不工作外的開箱。在大多數情況下,您必須手動指定需要保留的其他類。

在你的情況我會通過增加配置行

-keep class com.mysoftware.informaltimeprovider.InformalTimeProvider 

這,這個類是必需的,不能刪除明確告訴ProGuard的開始。如果事後您的應用程序錯過了另一個課程,請告訴proguard以保留它。

一步一步,您將接近完整的工作應用程序。我知道這種嘗試錯誤的方法並不好,但優化Java應用程序並不是那麼簡單,它可以完全自動化。特別是通過Strings和其他與運行時相關的技巧加載類與proguard相沖突。

+0

感謝羅伯特,我會玩這個。任何想法,如果明顯的警告是任何擔心的事情? – barry

+0

發生這種情況是因爲每個庫都有它自己的MANIFEST,如果你把所有的庫合併成一個proguard不知道該怎麼做,Proguard會保持它遇到的firt MANIFEST,所以確保你自己的JAR文件包含你想保留的MANIFEST是輸入jar列表中的第一個。 – Robert

+0

感謝Robert。幾個問題,如何決定他們想要保留哪個清單?還有,輸入jar列表在哪裏?感謝您的幫助。 – barry