2016-04-05 5 views
3

私はコードを縮小するためにProguardを使用しています。私の戦略は、それを有効にして、警告に従って、それが何かを残しておくことです。外部の図書館がある場合は、著者が利用可能なProguardの指示に従います。多くの指示には-dontwarnフラグが含まれています。 -dontwarnフラグを無効にすると、警告が表示されます。 -keepフラグを使用してほとんどのクラスを維持している場合、なぜ警告が表示されるのですか? 例:クラスを保持しているにもかかわらずProguardの警告

-keep class javax.** { *; } 

# for butterknife 
-keep class butterknife.** { *; } 
-dontwarn butterknife.internal.** 
-keep class **$$ViewBinder { *; } 

-keepclasseswithmembernames class * { 
    @butterknife.* <fields>; 
} 

-keepclasseswithmembernames class * { 
    @butterknife.* <methods>; 
} 

Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.annotation.processing.AbstractProcessor 
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.annotation.processing.ProcessingEnvironment 
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.lang.model.element.TypeElement 
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.lang.model.element.Element 
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.annotation.processing.Filer 
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.tools.JavaFileObject 
... 

答えて

6

ProGuardにはさまざまな意味があります。この特定のもの:

Warning:A: can't find referenced class B 

はProGuardのクラスAを処理している間、それはクラスBへの参照が発生しましたが、クラスBがソース(-injars class_path)として、またはライブラリ(-libraryjars class_path)として含まれていなかったことを意味します。

最初の注意点は、標準的なAndroidビルドチェーンの場合は、この特定の警告のために、-keepのルールを追加することは役に立ちません。 ProGuardは参照コードを一時的に保持します。

この警告は、いくつかの理由で発生します。多くの場合、ライブラリXは別のライブラリYを使用するコードを含むことができます.XはオプションでYを使用します.Yがクラスパス上に存在する場合のみ、XはYの存在を強制しません。依存関係としてYを追加するか、関連する警告を無視するかのいずれかの警告を取り除きます。

バターナイフの場合は状況が少し異なります。 Butterknifeは注釈処理を使用します。また、ライブラリと注釈プロセッサの両方が1つの依存関係(最新バージョン7.0.1)で含まれています。クラスbutterknife.internal.ButterKnifeProcessorはコンパイルされたクラスにまだ存在しています(作業はすでに終了していますが、Javaコンパイル中に使用されます)。 ProGuardはそれを処理しようとします。 ProGuardは、アノテーション処理中にのみ使用され、ProGuard処理には存在しないため、欠落しているクラスを見つけることができません。 この場合、警告を無視することが本当に必要です。

+0

です。次に、外部ライブラリをコンパイルするときに '-injars'と' -libraryjars'を使用する必要がありますか? – Vas

+0

AndroidプロジェクトにGradleビルドを使用すると、プロジェクトの依存関係に基づいてすべての '-injars'と' -libraryjars'が設定されます。特別なセットアップの必要はありません。 – Tomik

+0

ああ意味します。ありがとう! – Vas

関連する問題