tdnki @ ウィキ
Proguardについて
最終更新:
Bot(ページ名リンク)
-
view
Proguardとは
コードを難読化したり、不要なクラスを除外したりする。
http://proguard.sourceforge.net/
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」オプションで指定することによって、無視しても構わない。
-dontwarn extpackage.**