2012-08-24 11 views
10

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

コードが正しく難読化されたため、Proguardが実行されたことがわかりました。これを確認するので、私は私の活動に、このメソッドを追加しました:このプライベートメソッドは、私の活動に一度だけ呼び出され

private void testInlining() 
{ 
    mConfig = null; 
} 

、それはプライベートなので、それが唯一と呼ばれるオプティマイザに非常に明白でなければなりませんかつてそれはインライン化されるべきだということです。

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

インライン化を有効にするためにProguardに与えなければならない特定のフラグはありますか?

EDIT

マイProGuardの設定ファイルは

を使用した後

-optimizationpasses 5 
-allowaccessmodification 
-overloadaggressively 
-repackageclasses '' 
-dontskipnonpubliclibraryclasses 

EDIT

が含まれています

私はメソッドがインライン化されていない理由を取得:

[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に防止します。

-dontoptimize 
代替最適化設定はわずか数の最適化を無効にします

、以下を参照してください

+0

これを試しましたか? -optimizationpasses http://stackoverflow.com/questions/5068251/android-what-are-the-recommended-configurations-for-proguard?rq=1 – user1154664

+0

の5 もっとあなたが実際にProGuardのを得ることができました任意のメソッド呼び出しをインラインにするには? proguard-android-optimize.txtを使って、intを返す単純なプライベートメソッドを書くと、私はそれが動作するのを見ることができませんでした:http://paste.ofcode.org/hbpzPe4EdAnDGnNqNTE7c3 – brAzzi64

答えて

15

この最近のAndroid SDKは、デフォルトではすべての最適化を無効にし、$ {} sdk.dir /tools/proguard/proguard-android.txtを見ます$ {} 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/cast)のバグを避けるためにいくつかの最適化が無効にされています。 ProGuardの(!フィールド/ * ,!クラス/マージング/ *)。

-whyareyoukeepingは、不要なクラス/フィールド/メソッド全体を削除する縮小ステップを指します。除去されないメソッドは、最適化ステップでインライン化することができます(別途明示的に指定されている場合を除き、-keep)。であなたのモジュールのbuild.gradleファイルで

+0

それは意味があります、私は認識していませんでしたGoogleはデフォルトで最適化を無効にしています。ありがとう、私はそれを修正する場合は、答えをdacceptしようとします。 –

1

、あなたがなります。

buildTypes { 
    release { 
     minifyEnabled true 
     shrinkResources true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), file('proguard-project.txt') 
     signingConfig signingConfigs.release 
    } 
} 

は離れのDalvikの問題を維持しながら-dontoptimize行が含まれていないproguard-android-optimize.txt、とproguard-android.txtを置き換える(エリックLafortuneの回答を参照してください) 。

関連する問題