Сократите приложение 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

Другие вопросы по тегам