Как сохранить / исключить конкретный путь к пакету при использовании proguard?


110

Я хочу исключить некоторые пути к файлам из ProGuard. примерcom.myapp.customcomponents

Как я могу это сделать? Я ненавижу ставить флаги -keep для каждого файла пользовательского компонента, который у меня есть в этом каталоге.

Я пробовал следующее, но это не работает:

-keep public class com.myapp.customcomponents.*

Ответы:


242

Вы не указываете, каким образом это не работает. Ваша конфигурация сохраняет имена всех общедоступных классов в указанном пакете:

-keep public class com.myapp.customcomponents.*

Следующая конфигурация сохраняет имена всех общедоступных классов в указанном пакете и его подпакетах:

-keep public class com.myapp.customcomponents.**

Следующая конфигурация сохраняет имена всех общедоступных / защищенных классов / полей / методов в указанном пакете и его подпакетах:

-keep public class com.myapp.customcomponents.** {
  public protected *;
}

7
Двойные звездочки (**) больше не компилируются (Android Studio 4.0)
Даниэль

1
Android Studio 4.x будет отображать такие ошибки, как «Неразрешенное имя класса» и т. Д. Для двойных звездочек (**), но это будет работать должным образом.
Махмудул Хасан Шохаг,

Он исправлен и не будет давать ошибок в следующих выпусках, подробности можно узнать здесь
shadygoneinsane

56

Добавьте следующую строку в конец конфигурации ProGuard:

-keep class com.facebook.** { *; }

Соответственно замените имя пакета, при этом пакет com.facebookбудет исключен из ProGuard.


13
Зачем хранить и не предостерегать от использования вместе
Jongz Puangput

@Jongz Puangput, если я прав - если приложение не использует пакет com.facebook, то при сборке будет показано примечание «конфигурация относится к неизвестному классу ...». -dontwarn отключить эту заметку.
Юра Шинкарев

14
что { *; }значит?
Мухаммад Бабар

15
@MuhammadBabar я имею в виду каждый член, метод, класс в каждой области, короче все!
Омар Эль Дон

1

Многие люди, кажется, рекомендуют -keep class com.myapp.customcomponents.** { *; }как способ исключить путь из обработки. Посмотреть здесь:

  1. исключить пакеты из proguard
  2. Заставить Proguard полностью игнорировать пакет
  3. Предотвращение обфускации каталога proguard

Проблема с этим решением заключается в том, что все еще происходит некоторый уровень обфускации, который может нарушить ваш код. Вы можете увидеть карту в распечатке карты:

java.lang.String toString() -> toString
int getMemoizedSerializedSize() -> getMemoizedSerializedSize
void setMemoizedSerializedSize(int) -> setMemoizedSerializedSize
int getSerializedSize() -> getSerializedSize
boolean equals(java.lang.Object) -> equals
int hashCode() -> hashCode

Решение, которое я выбрал, представляет собой двухэтапный процесс. Во-первых, используйте injarsс фильтром, чтобы выбрать путь к пакету, который я хотел бы обработать. Можно добавить другие пути к пакетам как библиотеки.

-injars       artifacts/in.jar(org/toprocess/**.class)
-outjars      out/processed.jar
-libraryjars  artifacts/in.jar(org/skipped/**.class)
-libraryjars  artifacts/in.jar(org/moreskipped/**.class)

Во-вторых, объедините обработанную банку с исходной, но только те пути, которые были пропущены.

-injars  out/processed.jar
-injars  artifacts/in.jar(org/skipped/**.class)
-injars  artifacts/in.jar(org/moreskipped/**.class)
-outjars out/merged.jar

-dontshrink
-dontoptimize
-dontobfuscate

В результате получается объединенный jar, представляющий собой комбинацию обработанного пути пакета и пропущенных путей. Это упражнение недопустимо, если кто-то может предоставить способ полностью пропустить обработку определенных путей (чего я не нашел).


1

Что сработало для меня с использованием Android Studio 4.0:

-keepclassmembers class com.myapp.customcomponents.* {
    <fields>;
    <init>();
    <methods>;
}

Двойные звездочки (**) в других ответах у меня не работали. Я также пробовал вышеуказанную конфигурацию с R8, работает нормально.


этот ответ, я думаю, самый последний. Спасибо.
Gogo-the-Cat,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.