Как исправить Proguard NoSuchMethodException на Android - PullRequest
3 голосов
/ 30 июня 2011

Я запутал Lite и полные проекты, ссылающиеся на проект библиотеки.Во время выполнения я получаю сообщение об ошибке «NoSuchMethodException myMethod»

Согласно 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, поскольку этобиблиотека, на которую ссылаются.

Что-то мне не хватает?Спасибо.

Ответы [ 2 ]

5 голосов
/ 30 июня 2011

Я считаю, что отладка ProGuard - это чёрная магия, вам может понадобиться проверить, что параметры keep действительно выполняют то, для чего они предназначены.

Я использовал созданный мной метод проб:

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 {
    *;
}
0 голосов
/ 01 июля 2011

В дополнение к решению Джереми начать с сохранения целого класса, для меня конкретным решением было добавить «java.lang» перед аргументами String.

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