2017-01-10 18 views
2

私のプロジェクトではandroid-support-library-v7を使用していますが、私はproguradを使用してコードを最小限に抑え、難読化したいと思います。 問題は、私はProGuardのを使用している場合、私はこのようなエラーを取得していることである:アンドロイドサポートライブラリの推奨されるプロゴア設定は何ですか?

FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{org.example.project/org.example.project.ActivityMain}: android.view.InflateException: Binary XML file line #12: Error inflating class android.support.v7.preference.PreferenceCategory 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 
    at android.app.ActivityThread.access$700(ActivityThread.java:140) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4921) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 
    at dalvik.system.NativeStart.main(Native Method) Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class android.support.v7.preference.PreferenceCategory 
    at android.support.v7.preference.g.a(Unknown Source) 
    at android.support.v7.preference.g.a(Unknown Source) 
    at android.support.v7.preference.g.a(Unknown Source) 
    at android.support.v7.preference.g.a(Unknown Source) 
    at android.support.v7.preference.g.a(Unknown Source) 
    at android.support.v7.preference.h.a(Unknown Source) 
    at android.support.v7.preference.h.b(Unknown Source) 
    at org.exampple.project.ActivityMain.onCreate(Unknown Source) 
    at android.app.Activity.performCreate(Activity.java:5206) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 
    ... 11 more Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet] 
    at java.lang.Class.getConstructorOrMethod(Class.java:460) 
    at java.lang.Class.getConstructor(Class.java:431) 
    ... 22 more 

PreferenceCategoryは私のあるpreferences.xmlファイルで使用されていると私はそれが反射を介してアクセスされると思います。このメソッド(またはクラス)が縮小時にコード内で参照されていない場合は、おそらくProguardによってこのメソッドが削除されます。たとえそうでなくても、それは確かにその名前を難読化する。 通常の方法でGoogleには、この件に関するドキュメントはまったくありません。

したがって、良好な縮小と良好な難読化を達成するための最適な設定は何ですか。 は、スタックオーバーフロー上のいくつかの同様の質問がありますが、彼らはに煮詰める:クリアリーが縮小して難読化の目的に反し

-keep class android.support.v7.** { *; } 

設定をランダムに推測しようとすると、試行錯誤してみると非常に時間がかかります。

答えて

5

サポートライブラリはconsumerProguardFiles機能を使用して、Gradleを使用している場合は適切なProGuardを自動的にインクルードします。つまり、手動で何かを含める必要はありません。

(AAR内proguard.txtファイルに格納されている)preferences-v7ためProGuardのファイルを見てみると、それは次の行が含まれます。

それはあなたが(として不足していると言う正確な方法をカバーしてい
# Preference objects are inflated via reflection 
-keep public class android.support.v7.preference.Preference { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 
-keep public class * extends android.support.v7.preference.Preference { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

を間接的にPreferenceを延長する)。すべてのGradle依存関係を使用していることを確認してください。

+0

ありがとうございます。私はgradleを使用していません。したがって、私にとってはそれほど簡単ではありません。 Upvoted。 –

+0

@ user6694745 - サポートライブラリをアップグレードするたびに、引き上げるすべてのAARのすべてのproguard.txtファイルからルールを手動で抽出する必要があります。 Gradleを使用することを強く推奨します。 – ianhanniballake

-1

人気のあるライブラリーのproguardルールを持つGithubのprojectをチェックしてください。

+1

私はそれを見ました。サポートライブラリに関するいくつかの例は、すべてのパターンを維持することに固執しています。そして、彼らは好みのような他のものを欠場する。したがって、不完全であり、最適ではない。 –

関連する問題