Сократите приложение Android, но не запутывайте его
Когда я не минимизирую свое приложение, я достигаю максимального количества методов, и сборка файла dex завершается неудачно. Этого можно избежать, включив minify
в build.gradle
, Недостатком, однако, является то, что теперь код запутывается. Это нормально для сборки Release, но это проблематично для сборки Debug.
Есть ли способ сказать gradle, чтобы минимизировать сборку Debug, но не запутывать ее?
3 ответа
Да, вы можете использовать ProGuard для минимизации отладочных сборок.
Ключ должен использовать -dontobfuscate
опция в конфигурации ProGuard для отладочной сборки.
Используйте этот параметр в build.gradle
:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro',
'proguard-rules-debug.pro'
}
}
Напишите свою конфигурацию выпуска ProGuard в proguard-rules.pro
,
Используйте ту же конфигурацию для выпуска и отладки. Таким образом вы гарантируете, что никакой необходимый код не будет удален. И отладочная минимизация не нарушает сборку.
Добавить дополнительный файл конфигурации ProGuard proguard-rules-debug.pro
для отладочной сборки. Он должен содержать правила, используемые только для отладки. В этом случае добавьте только:
-dontobfuscate
minifyEnabled true
это просто ярлык для:
postprocessing {
removeUnusedCode true
obfuscate true
optimizeCode true
}
Итак, если вы хотите минифицировать, не запутывая, замените minifyEnabled true
с:
postprocessing {
removeUnusedCode true
obfuscate false // <--
optimizeCode true
}
Кроме того, компилятор будет жаловаться, если у вас есть shrinkResources true
, Эквивалентное поле постобработки removeUnusedResources true
т.е.
postprocessing {
removeUnusedCode true
removeUnusedResources true // <--
obfuscate false
optimizeCode true
}
Вопреки другим ответам, useProguard false
не отключает запутывание; это изменяет механизм запутывания с ProGuard на R8.
Технически правильный ответ Томика, но он не поддерживает использование Instant Run для ваших сборок. Как указано в официальном руководстве по сокращению кода:
Включите сжатие кода с помощью Instant Run Если сжатие кода важно для вас при постепенной сборке приложения, попробуйте экспериментальную программу сжатия кода, встроенную в плагин Android для Gradle. Этот шринкер поддерживает Instant Run, в отличие от ProGuard.
Вы можете настроить усадку плагина Android, используя те же файлы конфигурации, что и ProGuard. Однако программа сжатия плагинов Android не запутывает и не оптимизирует ваш код, а только удаляет неиспользуемый код. Поэтому вы должны использовать его только для отладочных сборок и включить ProGuard для ваших сборок релиза, чтобы код вашего релизного APK был запутан и оптимизирован.
Поэтому правильное решение было бы настроить вашу отладочную сборку следующим образом:
android {
buildTypes {
debug {
minifyEnabled true
useProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
Таким образом, код в вашей отладочной сборке не будет оптимизирован и не запутан, но будет сокращен. Это также относится к использованию Instant Run.
Простое решение - добавить minifyEnabled true
а также useProguard false
внутри конфигурации сборки. Но сжатие кода не рекомендуется для отладочных сборок из официальных документов. Имейте в виду, что сжатие кода замедляет время сборки, поэтому по возможности избегайте его использования в отладочной сборке. Ссылка https://developer.android.com/studio/build/shrink-code.html