Android Proguard не встроен
Я использую новейший Android SDK (4.1), и я попытался экспортировать подписанную банку с включенной Proguard. Однако после декомпиляции оптимизированного APK я заметил, что методы, которые, как я ожидал, были бы вложены, не были.
Я знаю, что Proguard работал, потому что код был правильно запутан. Поэтому, чтобы подтвердить это, я добавил этот метод в свою активность:
private void testInlining()
{
mConfig = null;
}
Этот частный метод вызывается только один раз в моей активности, и поскольку он является закрытым, для оптимизатора должно быть очень очевидно, что он вызывается только один раз и что он должен быть встроен.
В документации говорится, что все оптимизации включены по умолчанию и что Proguard "Inline методы, которые короткие или только вызываются один раз".
Есть ли специальный флаг, который я должен предоставить Proguard для включения встраивания?
ИЗМЕНИТЬ
Файл конфигурации proguard содержит
-optimizationpasses 5
-allowaccessmodification
-overloadaggressively
-repackageclasses ''
-dontskipnonpubliclibraryclasses
ИЗМЕНИТЬ
После использования
-whyareyoukeeping class com.templatecompany.templateappname.EntryPointActivity {*;}
Я получаю причину, почему метод не встроен:
[proguard] com.templatecompany.templateappname.EntryPointActivity: void testInlining() (20:21)
[proguard] is invoked by com.templatecompany.templateappname.EntryPointActivity: com.td.media.ivConnection.IvConfig getIvConfig() (14:15)
[proguard] implements com.td.widget.MainActivity: com.td.media.ivConnection.IvConfig getIvConfig()
[proguard] is invoked by com.td.widget.MainActivity: void onCreate(android.os.Bundle) (140:175)
[proguard] implements android.app.Activity: void onCreate(android.os.Bundle)
[proguard] is a library method.
Но я не уверен, что тот факт, что метод testInlining
используется в методе getIvConfig
, который, в свою очередь, используется другим методом, предотвращает inlining на testInlining
в getIvConfig
.
Ответы
Ответ 1
Этот недавний Android SDK отключает все оптимизации по умолчанию, см. ${sdk.dir}/tools/proguard/proguard-android.txt:
-dontoptimize
Альтернативная оптимизирующая конфигурация отключает несколько оптимизаций, см. ${sdk.dir}/tools/proguard/proguard-android-optimize.txt:
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
Вы можете указать предпочтительный файл конфигурации в project.properties.
Вы можете проверить, какая полная конфигурация ProGuard используется, добавив опцию -printconfiguration
.
Некоторые оптимизации были отключены, чтобы избежать ошибок в старых версиях Dalvik VM (код/упрощение/арифметика, код/упрощение/литье), а некоторые оптимизации могут быть отключены, чтобы избежать ошибок в более старых версиях ProGuard (! Field/*,! class/merging/*).
Обратите внимание, что -whyareyoukeeping
относится к шагу сокращения, который удаляет ненужные классы/поля/методы в целом. Методы, которые не удаляются, могут быть встроены в этап оптимизации (если явно не указано иначе -keep
).
Ответ 2
В вашем модуле build.gradle
вы должны посмотреть:
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), file('proguard-project.txt')
signingConfig signingConfigs.release
}
}
и заменить proguard-android.txt
на proguard-android-optimize.txt
, который не включает строку -dontoptimize
, сохраняя проблемы с дальвиком (см. ответ Эрика Лафорттуна).