簡體   English   中英

Android Proguard 不內聯

[英]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后者又通過另一種方法使用防止了內聯testInlininggetIvConfig

這個最近的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM