Proguard: Как не оптимизировать классы из библиотеки - PullRequest
2 голосов
/ 08 июля 2010

У меня есть проект JavaME, в который я должен был включить данную библиотеку.Я использую Netbeans 6.8, поэтому я просто добавил библиотеку в проект.Классы библиотеки затем правильно упакованы в получившийся jar-файл.

Моя проблема сейчас в том, что классы этой библиотеки не должны касаться обфускатора Proguard.Поэтому я пробовал разные опции -keep:

-keep class com.package. **

Я также пробовал -keepnames и -keepclassmembers, но Proguardпрекратит говорить:

Неожиданная ошибка при редактировании кода:

Class = [com / package / class]

Method = [run () V]

Exception = [java.lang.IllegalArgumentException] (недопустимое смещение инструкции [1077] в коде с длиной [1075])

Ошибка: недопустимое смещение инструкции [1077] в коде с длиной [1075]

Есть ли способ сказать Proguard игнорировать определенную библиотеку или определенные классы?

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 07 августа 2011

Если вы хотите, чтобы ProGuard оставил библиотеку нетронутой, вы должны указать ее с -libraryjars вместо -injars:

-libraryjars somelibrary.jar

Его классы не будут включены в выходной jar, поэтому вам все равно придется добавить библиотечный jar в путь классов вашего обработанного приложения.

Кроме того, вы можете обработать библиотечный jar как входной jar, но сохраните его классы и членов класса :

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

Теперь неожиданная ошибка - это нечто иное. Это указывает на ошибку в ProGuard. Вы должны убедиться, что используете последнюю версию ProGuard. В противном случае вы должны сообщить о проблеме на трекере ошибок ProGuard в Sourceforge.

0 голосов
/ 02 февраля 2014

Вы можете объединить ваши JAR-файлы в отдельном проходе с ProGuard, указав следующие параметры:

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

, который имеет простой эффект объединения JAR-файлов без их обработки.

The *Опции 1006 * и 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
0 голосов
/ 04 августа 2011

Классы библиотеки затем правильно упакованы в результирующий jar-файл.

Вот где твоя проблема. Как только он окажется в банке, предоставленной Proguard, он будет обработан. Я полагаю, вы должны создать большую банку со всеми зависимостями. Если это так, исключите свой код JavaME из этого большого jar-файла и сохраните его в отдельном jar-файле. Тогда Proguard не будет обрабатывать его.

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

...