tdnki @ ウィキ

Android > Proguardについて


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。




Proguardとは

コードを難読化したり、不要なクラスを除外したりする。
http://proguard.sourceforge.net/

注意

リフレクションを利用したコードを難読化してしまうと、クラスやメソッドを参照できなくなる可能性があるので、これらの対象となり得る部分は難読化から除外しておくべき。指定方法は後述。

Proguardを有効にする

ProguardはAndroid SDKに最初から含まれているので、パッケージを出力する際にProguardを通すようにするには、default.properties内に「proguard.config=proguard.cfg」と記述するだけでよい。

クラスやメソッドの除外指定

proguard.cfg内に「-keep」オプション等で指定する。具体的な文法は公式サイト参照。
以下はポイント。
  • クラス名はパッケージを含めて記述する。
  • パッケージセパレータを含まない任意のクラス名にマッチするワイルドカードは「*」(下の階層にはマッチしない)。パッケージセパレータを含む任意のクラス名にマッチするワイルドカードは「**」。プリミティブ型、配列を含む任意の型にマッチするワイルドカードは「***」。任意の個数、任意の型にマッチするワイルドカードは「...」。
  • クラスを指定して難読化から除外されるのはクラス名のみ。メソッドやコンストラクタも除外に含めるには、別途記述する必要がある。※要検証
  • メソッドの記述には戻り値、メソッド名、引数の指定が必要。
  • 任意のメソッドを表すワイルドカードは「<methods>」、任意のフィールドを表すワイルドカードは「<fields>」。また、「*」はそのいずれにもマッチする。
  • 任意のコンストラクタを表すワイルドカードは<init>。引数は必要。※要検証
つまり、mypackage以下の全クラスおよびその全メソッド(およびコンストラクタ)を除外する記述はこうなる。※要検証
-keep class mypackage.** {
	<init>(...);
	*;
}

警告を握りつぶす

コード内で参照している先のクラスが見つからない場合、Proguardの処理は失敗してしまう。
アプリケーション内で使用しないことが明らかなクラスやパッケージについては、「-dontwarn」オプションで指定することによって、無視しても構わない。
-dontwarn extpackage.**

更新履歴

取得中です。