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

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

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

-сохранить класс com.package.**

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

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

Класс = [ком/пакет/класс]

Метод = [выполнить()V]

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

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

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

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


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


Ответы (3)


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

-libraryjars somelibrary.jar

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

В качестве альтернативы вы можете обработать библиотечный jar как входной 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 в отдельный jar-файл и сделать его зависимостью от jar-файла, который вы предоставляете 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