Як зберегти / виключити певний шлях пакета при використанні proguard?


110

Я хочу виключити деякі шляхи до файлу з ProGuard. Прикладcom.myapp.customcomponents

Як я можу це зробити? Я ненавиджу розміщувати -keep прапори для кожного окремого спеціального файлу компонентів у цьому каталозі.

Я спробував таке, але це не працює:

-keep public class com.myapp.customcomponents.*

Відповіді:


241

Ви не вказуєте, яким чином це не працює. Ваша конфігурація зберігає імена всіх загальнодоступних класів у вказаному пакеті:

-keep public class com.myapp.customcomponents.*

Наступна конфігурація зберігає імена всіх відкритих класів у зазначеному пакеті та його підпакеті:

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

Наступна конфігурація зберігає імена всіх відкритих / захищених класів / полів / методів у зазначеному пакеті та його підпакетах:

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

6
Подвійні зірочки (**) більше не збираються (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, тоді при складанні буде показано примітку "конфігурація відноситься до невідомого класу ...". -незастереження відключити цю нотатку.
Юра Шинкарев

14
що { *; }означає?
Мухаммед Бабар

15
@MuhammadBabar я маю на увазі кожного члена, метод, клас у будь-якій області, коротше все!
Омар Ель Дон

1

Здається, багато людей рекомендують -keep class com.myapp.customcomponents.** { *; }як спосіб виключити шлях від обробки. Дивіться тут:

  1. виключити пакети з proguard
  2. Зробіть Proguard повністю ігнорувати пакет
  3. Захистіть каталог від запуску захисника

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

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

В результаті виходить злита банка, яка є поєднанням обробленого шляху пакета та пропущених шляхів. Ця вправа недійсна, якщо хтось може запропонувати спосіб повністю пропустити обробку певних шляхів (чого я не знайшов).


1

Що для мене працювало за допомогою Android Studio 4.0:

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

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


ця відповідь найсучасніша відповідь, я думаю. спасибі.
Гого-кота
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.