2012-05-11 5 views
8

私はProguardを使用してアプリのコードを難読化したいと考えています。私は最適化が必要ないので、Proguardにクラスやメソッドを取り除く必要はありません。私が望むのは難読です。アプリはいくつかのライブラリプロジェクトを使用しています。Android&Proguard - 難読化する方法はありますが、コードを最適化する方法はありませんか?

私は壁に向かって頭を叩いて、それを起こそうとしていました。私が望むように動作していません。 Proguardの縮小オプションを無効にしたと思っていたとしても、実行時にNoSuchMethodExceptionsがアプリにスローされています。

Proguard JUSTを難読化し、ANYコードを最適化しないための魔法の設定は何ですか?

更新。試行錯誤の結果、NoSuchMethodExceptionsの原因となる難読化プロセス(最適化または縮小ではない)が確認されています。

Proguard.cfg

-dontpreverify 
-repackageclasses '' 
-allowaccessmodification 
-optimizations !code/simplification/arithmetic 
-keepattributes *Annotation* 
-dontshrink 
-keep public class * extends Object 
-keep class com.myapp.** { *; } 
-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class com.myapp.activity.Splash 
-keep public class com.myapp.alarm.AlarmsViewer 
-keep public class com.myapp.activity.About 
-keep public class com.myapp.activity.Base 
-keep public class com.myapp.activity.BaseWithMenu 
-keep public class com.myapp.alarm.Alarm 
-keep public class com.myapp.alarm.AlarmFragment 
-keep public class com.myapp.alarm.AlarmPagerAdapter 
-keep public class com.myapp.alarm.AlarmStore 
-keep public class com.myapp.app.App 
-keep public class com.myapp.preferences.Preferences 
-keep public class com.myapp.preferences.PreferencesStore 

-keep public class * extends android.view.View { 
    public <init>(android.content.Context); 
    public <init>(android.content.Context, android.util.AttributeSet); 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
    public void set*(...); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers class * implements android.os.Parcelable { 
    static android.os.Parcelable$Creator CREATOR; 
} 

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

-keep class android.support.v4.app.** { *; } 
-keep interface android.support.v4.app.** { *; } 
-keep class com.actionbarsherlock.** { *; } 
-keep interface com.actionbarsherlock.** { *; } 

-keepattributes *Annotation* 

-keep public interface com.android.vending.licensing.ILicensingService 

-dontwarn android.support.** 
+0

を維持することが必要なだけでxmlファイルで参照されているメソッドを(ハンドラをクリックしてください)持っています最適化のステップは問題ですか? – for3st

答えて

6

私はしばらく前に同様の問題を抱えていたし、ブルートフォースと運によって私のためにそれを解決しました。私proguard.cfgが似ていますが、私はラインがあります。

-dontshrink 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

を私はこれらの最適化オプションのためのアイデアを得たところから覚えていないことが、彼らは私のために働くように見えます。すべての

-dontoptimize 

を切り替えるキャッチが常にある

(。入力クラスファイルを最適化しないように指定します。デフォルトでは、最適化が有効になっている;。すべてのメソッドは、バイトコード・レベルで最適化されています)

ましたより適切かもしれません。

最後に、私はあなたがいることを知ることができるか、最適化せずに難読化する方法がわからない場合は、明示的に

-keepclassmembers class * extends android.app.Activity { 
    public void myClickHandler(android.view.View); 
} 
+4

私はXMLクリックハンドラを持っていないし、-dontoptimizeと-dontshrinkを指定しても、NoSuchMethodExceptionで爆発する。困った。過剰に設計されたジャンクのProguardの山は何か。 –

+0

申し訳ありません申し訳ありませんあなたのために動作しません。私はあなたに同意する必要があります - マニュアルは非常に難しいです。実際には、ちょうど釣り合いの取れたスイッチでなければなりません。残念ながら、apkは分かりやすいので難読化が必要です。 – NickT

+1

うわー。 ProGuardマニュアル>はじめに>エントリポイント... ProGuardマニュアル>トラブルシューティング>実行時の問題> NoSuchMethodException。 –