Android Proguard не встроен

Я использую последнюю версию Android SDK (4.1), и я попытался экспортировать подписанную банку с включенной Proguard. Однако после декомпиляции оптимизированного APK я заметил, что методы, которые, как я ожидал, будут встроены, не были.

Я знаю, что Proguard работает, потому что код был правильно запутан. Поэтому, чтобы подтвердить это, я добавил этот метод в свою активность:

private void testInlining() { mConfig = null; } 

Этот частный метод вызывается только один раз в моей активности, и поскольку он является закрытым, для оптимизатора должно быть очень очевидно, что он вызывается только один раз и что он должен быть встроен.

В документации говорится, что все оптимизации включены по умолчанию и что Proguard «Inline-методы, короткие или только вызываемые один раз».

Есть ли специальный флаг, который я должен предоставить Proguard, чтобы включить inlining?

РЕДАКТИРОВАТЬ

Файл конфигурации 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 .

Solutions Collecting From Web of "Android Proguard не встроен"

Этот недавний 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 (! поле / * ,! класс / сращивание / *).

Обратите внимание, что -whyareyoukeeping относится к шагу сокращения, который удаляет ненужные классы / поля / методы в целом. Методы, которые не удаляются, могут быть встроены в этап оптимизации (если явно не указано иное с помощью -keep ).

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