Я использую новейший 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
.