Включение R8 требует явного правила для сохранения всего пакета приложения - PullRequest
0 голосов
/ 13 марта 2020

Мы явно отключили R8, используя директиву

android.enableR8=false.

Но когда я убираю эту директиву из моего gradle.properties, я обнаруживаю, что R8 удаляет множество спецификаций приложения c классов.

Единственный способ, которым я могу успешно скомпилировать и запустить приложение, это включить следующую инструкцию в мой config / proguard / proguard-project.txt

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

Мой gradle.properties выглядит следующим образом:

kotlin.incremental.usePreciseJavaTracking=true
android.useAndroidX=true
android.enableJetifier=true
android.uniquePackageNames=true

В документе Google (https://developer.android.com/studio/build/shrink-code) нет упоминания о том, что мне нужно явно иметь директиву keep.

1 Ответ

1 голос
/ 16 марта 2020

Каждый раз, когда вы используете усадку (R8 или ProGuard), она будет использовать предоставленные правила хранения для определения возможных точек входа в программу. Эти точки входа включают любое отражение, используемое в приложении. Android Studio имеет установленные правила хранения по умолчанию (сгенерированные getDefaultProguardFile('proguard-android-optimize.txt')), которые вместе с правилами, сгенерированными aapt2, будут работать для многих приложений. Однако, если приложение использует отражение, выходящее за рамки этих правил, потребуются дополнительные правила. Консервативное правило, которое вы используете (сохраняя все в пакете приложений и вложенных пакетах), может работать для большинства приложений, но в итоге вы получите больше, чем требуется.

Вы можете добавить -printconfiguration <some file> к своему proguard-rules.pro чтобы увидеть все правила, которые фактически переданы в R8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...