Proguard: Как да не оптимизирате класове от библиотека

Тук имам JavaME проект, в който трябваше да включа дадена библиотека. Използвам Netbeans 6.8, така че току-що добавих библиотеката към проекта. След това класовете на библиотеката се пакетират правилно в получения jar-файл.

Проблемът ми сега е, че класовете на тази библиотека не трябва да се докосват от обфускатора на Proguard. Така че опитах различни опции за запазване:

-запазване на клас com.package.**

Опитах също -keepnames и -keepclassmembers, но Proguard ще спре да казва:

Неочаквана грешка при редактиране на кода:

Клас = [com/package/class]

Метод = [run()V]

Изключение = [java.lang.IllegalArgumentException] (Невалидно отместване на инструкция [1077] в код с дължина [1075])

Грешка: Невалидно отместване на инструкция [1077] в код с дължина [1075]

Има ли начин да кажете на Proguard да игнорира определена библиотека или определени класове?

Благодаря предварително!


person ceefar    schedule 08.07.2010    source източник


Отговори (3)


Ако искате ProGuard да остави библиотека недокосната, трябва да я посочите с -libraryjars вместо -injars:

-libraryjars somelibrary.jar

Неговите класове няма да бъдат включени в изходния буркан, така че все още трябва да добавите библиотечния буркан към пътя на класа на вашето обработено приложение.

Като алтернатива можете да обработите библиотечния буркан като входен буркан, но да запазите неговите класове и членове на клас:

-keep class some.library.** { *; }

Сега неочакваната грешка е нещо различно. Това показва грешка в ProGuard. Трябва да се уверите, че използвате най-новата версия на ProGuard. В противен случай трябва да съобщите за проблем в програмата за проследяване на грешки на ProGuard в Sourceforge.

person Eric Lafortune    schedule 07.08.2011
comment
Доста често срещано изискване е да искате да изградите JAR за разпространение, който включва всички зависимости, но има само частите на приложението, обработени от ProGuard; може би бихте могли да добавите нова опция като inlibraryjars, за да активирате това (и вижте моя отговор, тъй като комбинирането без обработка изобщо все още изхвърля предупреждения, ако се направи като второ преминаване). - person Lawrence Dol; 02.02.2014

След това класовете на библиотеката се пакетират правилно в получения jar-файл.

Ето къде ти е проблемът. След като бъде в буркана, предоставен на Proguard, той ще бъде обработен. Вярвам, че трябва да създавате голям буркан с всички зависимости. Ако е така, изключете вашия JavaME код от този голям буркан и го запазете в отделен буркан. Тогава Proguard няма да го обработи.

В противен случай намерете начин да преместите вашия JavaMe код в отделен буркан и да го направите зависимост от буркана, който предоставяте на Proguard.

person Jérôme Verstrynge    schedule 04.08.2011

Можете да комбинирате вашите JAR файлове в отделен пропуск с ProGuard, като посочите следните опции:

-dontnote **
-dontwarn **
-dontobfuscate
-dontshrink
-dontoptimize

Което има простия ефект на комбиниране на JAR, без изобщо да ги обработва.

Опциите dontnote и dontwarn са за потискане на бележки и предупреждения, които за проста операция на комбиниране са фалшиви (и ще има няколко от тях).

Първото преминаване трябва да изглежда така:

-injars        MyApplication-Unobfuscated.jar
-libraryjars   SomeLibraryJar.jar(!META-INF/**)
-libraryjars   AnotherLibraryJar.jar(!META-INF/**)
-outjars       MyApplication-Obfuscated.jar

// other options.

Второто преминаване трябва да изглежда така:

-injars        MyApplication-Obfuscated.jar
-injars        SomeLibraryJar.jar(!META-INF/**)
-injars        AnotherLibraryJar.jar(!META-INF/**)
-outjars       MyApplication.jar

-dontnote **
-dontwarn **
-dontobfuscate
-dontshrink
-dontoptimize
person Lawrence Dol    schedule 02.02.2014