11

私は最新の Android SDK (4.1) を使用しており、Proguard を有効にして署名済みの jar をエクスポートしようとしました。しかし、最適化された APK を逆コンパイルした後、インライン化されると予想していたメソッドがインライン化されていないことに気付きました。

コードが正しく難読化されたため、Proguard が実行されたことはわかっています。これを確認するために、このメソッドをアクティビティに追加しました。

private void testInlining()
{
    mConfig = null;
}

このプライベート メソッドは、私のアクティビティで 1 回だけ呼び出されます。これはプライベートであるため、オプティマイザには、1 回だけ呼び出され、インライン化する必要があることは明らかです。

ドキュメントには、すべての最適化がデフォルトで有効になっており、Proguard の「短い、または 1 回だけ呼び出されるインライン メソッド」と記載されています。

インライン化を有効にするために 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しかし、メソッドが別のメソッドで使用されるメソッドで使用されているという事実が、 in でgetIvConfigのインライン化をどのように防ぐかはわかりません。testInlininggetIvConfig

4

2 に答える 2

17

この最新の 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 (!code/simplification/arithmetic,!code/simplification/cast) のバグを回避するために一部の最適化が無効にされており、古いバージョンの ProGuard のバグを回避するために一部の最適化が無効になっている可能性があります (! field/*,!class/merging/*)。

-whyareyoukeeping不要なクラス/フィールド/メソッドを全体として削除する縮小ステップを参照することに注意してください。削除されないメソッドは、最適化ステップでインライン化される場合があります (明示的に指定されていない限り-keep)。

于 2012-08-25T09:58:13.107 に答える