[英]Android Proguard does not inline
我正在使用最新的 Android SDK (4.1),並嘗試導出啟用了 Proguard 的簽名 jar。 然而,在反編譯優化后的 APK 之后,我注意到我期望被內聯的方法不是。
我知道 Proguard 運行是因為代碼被正確混淆了。 所以為了確認這一點,我將此方法添加到我的活動中:
private void testInlining()
{
mConfig = null;
}
這個私有方法在我的活動中只被調用一次,並且因為它是私有的,所以優化器應該非常清楚它只被調用一次並且應該被內聯。
文檔說默認情況下所有優化都是啟用的,並且 Proguard 是“短的或只調用一次的內聯方法”。
我應該給 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
后者又通過另一種方法使用防止了內聯testInlining
在getIvConfig
。
這個最近的 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 中指定首選配置文件。
您可以通過添加選項-printconfiguration
來驗證 ProGuard 正在使用哪個完整配置。
一些優化已被禁用,以避免舊版本 Dalvik VM 中的錯誤(!code/simplification/arithmetic,!code/simplification/cast),並且一些優化可能已被禁用以避免舊版本 ProGuard 中的錯誤(!字段/*,!class/merging/*)。
請注意, -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 問題(參見 Eric Lafortune 的回答)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.