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, сохраняя проблемы с дальвиком (см. ответ Эрика Лафорттуна).