Proguard - неразрешенные ссылки на членов класса программы
Я пытаюсь запутать приложение для Android, но получаю следующую ошибку:
[2012-04-15 19:55:51 - TmtAndroid] Proguard returned with error code 1. See console
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.ClassPathElement: can't find referenced method 'org.apache.tools.ant.Project getProject()' in class proguard.ant.ClassPathElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.ClassPathElement: can't find referenced method 'boolean isReference()' in class proguard.ant.ClassPathElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.ClassPathElement: can't find referenced method 'java.lang.Object getCheckedRef(java.lang.Class,java.lang.String)' in class proguard.ant.ClassPathElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.ClassPathElement: can't find referenced method 'java.lang.String[] list()' in class proguard.ant.ClassPathElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.ClassPathElement: can't find referenced method 'void setLocation(java.io.File)' in class proguard.ant.ClassPathElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.ClassSpecificationElement: can't find referenced method 'boolean isReference()' in class proguard.ant.ClassSpecificationElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.ClassSpecificationElement: can't find referenced method 'java.lang.Object getCheckedRef(java.lang.Class,java.lang.String)' in class proguard.ant.ClassSpecificationElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.ConfigurationElement: can't find referenced method 'boolean isReference()' in class proguard.ant.ConfigurationElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.ConfigurationElement: can't find referenced method 'java.lang.Object getCheckedRef(java.lang.Class,java.lang.String)' in class proguard.ant.ConfigurationElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.ConfigurationTask: can't find referenced method 'org.apache.tools.ant.Project getProject()' in class proguard.ant.ConfigurationTask
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.FilterElement: can't find referenced method 'boolean isReference()' in class proguard.ant.FilterElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.FilterElement: can't find referenced method 'java.lang.Object getCheckedRef(java.lang.Class,java.lang.String)' in class proguard.ant.FilterElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.KeepSpecificationElement: can't find referenced method 'boolean isReference()' in class proguard.ant.KeepSpecificationElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.KeepSpecificationElement: can't find referenced method 'java.lang.Object getCheckedRef(java.lang.Class,java.lang.String)' in class proguard.ant.KeepSpecificationElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.MemberSpecificationElement: can't find referenced method 'boolean isReference()' in class proguard.ant.MemberSpecificationElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.MemberSpecificationElement: can't find referenced method 'java.lang.Object getCheckedRef(java.lang.Class,java.lang.String)' in class proguard.ant.MemberSpecificationElement
[2012-04-15 19:55:51 - TmtAndroid] Warning: proguard.ant.ProGuardTask: can't find referenced method 'org.apache.tools.ant.Project getProject()' in class proguard.ant.ProGuardTask
[2012-04-15 19:55:51 - TmtAndroid] You should check if you need to specify additional program jars.
[2012-04-15 19:55:51 - TmtAndroid] Warning: there were 17 unresolved references to program class members.
[2012-04-15 19:55:51 - TmtAndroid] Your input classes appear to be inconsistent.
[2012-04-15 19:55:51 - TmtAndroid] You may need to recompile them and try again.
[2012-04-15 19:55:51 - TmtAndroid] Alternatively, you may have to specify the option
[2012-04-15 19:55:51 - TmtAndroid] '-dontskipnonpubliclibraryclassmembers'.
[2012-04-15 19:55:51 - TmtAndroid] java.io.IOException: Please correct the above warnings first.
[2012-04-15 19:55:51 - TmtAndroid] at proguard.Initializer.execute(Initializer.java:321)
[2012-04-15 19:55:51 - TmtAndroid] at proguard.ProGuard.initialize(ProGuard.java:211)
[2012-04-15 19:55:51 - TmtAndroid] at proguard.ProGuard.execute(ProGuard.java:86)
[2012-04-15 19:55:51 - TmtAndroid] at proguard.ProGuard.main(ProGuard.java:492)
Когда я добавлю
-dontwarn proguard.ant.**
в proguard.cfg, apk экспортируется, но после установки на телефоне происходит сбой, поэтому в данном случае это не решение...
Что я должен сделать, чтобы устранить эти предупреждения? Это мое первое общение с Proguard...
Спасибо
1 ответ
Мой общий подход при работе с Proguard - начать с очень маленького .pro
файл, в котором все включено, и затем начинайте отключать различные параметры запутывания / оптимизации / сжатия до тех пор, пока полученный файл не будет работать правильно.
Так что я бы предложил пройтись по странице примеров Proguard и попробовать различные -keep
а также dontXXX
варианты, которые они предлагают.
Кроме того, использует ли ваше приложение (или инфраструктура Android) собственные методы, сериализацию, отражение, методы обратного вызова, аннотации и т. Д.? В документации примеров приведены параметры, которые необходимо передать Proguard, чтобы убедиться, что манипулирование байт-кодом Proguard не нарушает эти функции.
Например, я не очень знаком с платформой Android, но полагаю, что она использует какой-то тип XML-инфраструктуры, которая объясняет, как загружать / использовать определенные вами классы Java. Если это так, и у вас есть Proguard, чтобы скрыть имена классов или пакетов, платформа XML больше не сможет найти эти классы.