「Android/Proguardについて」の編集履歴(バックアップ)一覧はこちら
「Android/Proguardについて」(2011/07/26 (火) 02:41:37) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
#contents
----
***&spanclass(headline){Proguardとは}
コードを難読化したり、不要なクラスを除外したりする。
http://proguard.sourceforge.net/
***&spanclass(headline){注意}
リフレクションを利用したコードを難読化してしまうと、クラスやメソッドを参照できなくなる可能性があるので、これらの対象となり得る部分は難読化から除外しておくべき。指定方法は後述。
***&spanclass(headline){Proguardを有効にする}
ProguardはAndroid SDKに最初から含まれているので、パッケージを出力する際にProguardを通すようにするには、default.properties内に「proguard.config=proguard.cfg」と記述するだけでよい。
***&spanclass(headline){クラスやメソッドの除外指定}
proguard.cfg内に「-keep」オプション等で指定する。具体的な文法は公式サイト参照。
以下はポイント。
-クラス名はパッケージを含めて記述する。
-パッケージセパレータを含まない任意のクラス名にマッチするワイルドカードは「*」(下の階層にはマッチしない)。パッケージセパレータを含む任意のクラス名にマッチするワイルドカードは「**」。プリミティブ型、配列を含む任意の型にマッチするワイルドカードは「***」。任意の個数、任意の型にマッチするワイルドカードは「...」。
-クラスを指定して難読化から除外されるのはクラス名のみ。メソッドやコンストラクタも除外に含めるには、別途記述する必要がある。※要検証
-メソッドの記述には戻り値、メソッド名、引数の指定が必要。
-任意のメソッドを表すワイルドカードは「<methods>」、任意のフィールドを表すワイルドカードは「<fields>」。また、「*」はそのいずれにもマッチする。
-任意のコンストラクタを表すワイルドカードは<init>。引数は必要(※要検証)。
つまり、mypackage以下の全クラスおよびその全メソッド(およびコンストラクタ)を除外する記述はこうなる。(本当か?)
-keep class mypackage.** {
<init>(...);
*;
}
***&spanclass(headline){警告を握りつぶす}
コード内で参照している先のクラスが見つからない場合、Proguardの処理は失敗してしまう。
アプリケーション内で使用しないことが&spanclass(bold){明らかな}クラスやパッケージについては、「-dontwarn」オプションで指定することによって、無視しても構わない。
-dontwarn extpackage.**
#contents
----
***&spanclass(headline){Proguardとは}
コードを難読化したり、不要なクラスを除外したりする。
http://proguard.sourceforge.net/
***&spanclass(headline){注意}
リフレクションを利用したコードを難読化してしまうと、クラスやメソッドを参照できなくなる可能性があるので、これらの対象となり得る部分は難読化から除外しておくべき。指定方法は後述。
***&spanclass(headline){Proguardを有効にする}
ProguardはAndroid SDKに最初から含まれているので、パッケージを出力する際にProguardを通すようにするには、default.properties内に「proguard.config=proguard.cfg」と記述するだけでよい。
***&spanclass(headline){クラスやメソッドの除外指定}
proguard.cfg内に「-keep」オプション等で指定する。具体的な文法は公式サイト参照。
以下はポイント。
-クラス名はパッケージを含めて記述する。
-パッケージセパレータを含まない任意のクラス名にマッチするワイルドカードは「*」(下の階層にはマッチしない)。パッケージセパレータを含む任意のクラス名にマッチするワイルドカードは「**」。プリミティブ型、配列を含む任意の型にマッチするワイルドカードは「***」。任意の個数、任意の型にマッチするワイルドカードは「...」。
-クラスを指定して難読化から除外されるのはクラス名のみ。メソッドやコンストラクタも除外に含めるには、別途記述する必要がある。&spanclass(todo){※要検証}
-メソッドの記述には戻り値、メソッド名、引数の指定が必要。
-任意のメソッドを表すワイルドカードは「<methods>」、任意のフィールドを表すワイルドカードは「<fields>」。また、「*」はそのいずれにもマッチする。
-任意のコンストラクタを表すワイルドカードは<init>。引数は必要。&spanclass(todo){※要検証}
つまり、mypackage以下の全クラスおよびその全メソッド(およびコンストラクタ)を除外する記述はこうなる。&spanclass(todo){※要検証}
-keep class mypackage.** {
<init>(...);
*;
}
***&spanclass(headline){警告を握りつぶす}
コード内で参照している先のクラスが見つからない場合、Proguardの処理は失敗してしまう。
アプリケーション内で使用しないことが&spanclass(bold){明らかな}クラスやパッケージについては、「-dontwarn」オプションで指定することによって、無視しても構わない。
-dontwarn extpackage.**
表示オプション
横に並べて表示:
変化行の前後のみ表示: