2011-06-30 59 views
3

我有混淆Lite和一個完整的項目都引用一個庫項目。在運行時,我得到「NoSuchMethodException myMethod的」錯誤如何解決Android上的proguard NoSuchMethodException

根據http://proguard.sourceforge.net/index.html#/manual/troubleshooting.html我有以下添加到proguard.cfg

-keep class mypackage.MyClass { void myMethod(); } 

我的方法返回一個字符串,並接受3個字符串參數,所以我加入下面的proguard.cfg

-keep public class com.mycompany.appName.MyClass { 
    String myMethod(String, String, String); 
} 

但我仍然得到同樣的錯誤。

假設我正在構建精簡版版本com.mycompany.appName.lite,我假設我不必在添加到proguard.cfg的行中更改程序包名稱,因爲它是引用的庫。

有什麼我失蹤?謝謝。

+0

好的,我找到了解決方案。我不得不添加String參數的「java.lang」infront。 -keep public class com.mycompany.appName.myClass {java.lang.String myMethod(java.lang.String,java.lang.String); } – Dittimon

回答

4

我發現調試ProGuard是黑魔法,你可能需要驗證保持參數是否確實在做他們打算做的。

我用探針法是我創建:

http://code.google.com/p/android-beryl/source/browse/beryl-core/src/org/beryl/diagnostics/Log.java

Log.inspectClass(MyClass.class); 

什麼話,我要做的就是監控傾倒真實出來logcat的類定義。您還可以查看proguard /目錄中的文件來確定發生了什麼。但我覺得這很困難。

你的情況我會先從一個非常寬鬆的事情開始,先把所有事情都做好,然後再努力收緊這個班級。

-keep class com.mycompany.appName.MyClass { 
    *; 
} 
+2

確保你的通配符也是正確的 - 例如,如果你想讓你的上面保持更一般,你可以去保持類com.mycompany.appName。** {*;}。 } –

+0

謝謝CaspNZ,對於那些想要在他們的proguard路徑上使用快捷方式的人來說,這是一個很好的提示。 – tos

+0

@CaspNZ我遇到了同樣的問題,但是-keep class com.mycompany.appName。** {*; }不工作..任何想法爲什麼?看到我的線程:http://stackoverflow.com/questions/20818301/app-crashes-on-production-but-not-in-development/20818347?noredirect=1#comment31218866_20818347 –

0

加入Jeremy的解決方案,開始保留整個類,具體解決方案是添加String參數的「java.lang」infront。

-keep public class com.mycompany.appName.myClass { 
    java.lang.String myMethod(java.lang.String, java.lang.String, java.lang.String); 
}