【目次】
0.概要
1.読んだ(参考にした)サイト
2.ProGuard構成メモ
3.気になったオプション
4.学んだこと
【0.概要】
今まで、ProGuardとか良く分からんかった(と言うか、読む&調べるのが面倒だった)ので、
特に、アプリリリース時にも設定してなかったんだけど。
必要に迫られたので、少しだけ真面目にググって見たよ。
【1.読んだ(参考にした)サイト】
ProGuardの構成、全体像など参考になった
・Androidとセキュリティ:プログラム難読化ツール - ProGuard
※「ProGuardの概要」項目が参考になった
GUIで使う方法
・ProGuardによるライブラリとしてのJARの難読化(1)
・ProGuardによるライブラリとしてのJARの難読化(2)
マニュアルを日本語翻訳してくれてありがたや~
・ProGuardマニュアル (1) はじめに/利用方法
・ProGuardマニュアル (2) 入力/出力オプション
・ProGuardマニュアル (3) 保全オプション
・ProGuardマニュアル(4) ダウンサイジング・オプション
・ProGuardマニュアル(5) 最適化オプション
・ProGuardマニュアル(6) 難読化オプション
まだ、読み途中!!
その他、実際の設定値など
【2.ProGuard構成メモ】
ProGuardは、jar/war/zip/ディレクトリなどを入力として、次の4つのステップを経て、最終的にjar/war/zip/ディレクトリへ処理結果を出力します。
- 圧縮ステップ(shrink)
- 最適化ステップ(optimize)
- 難読化ステップ(obfuscate)
- 前検証ステップ(preverify)
圧縮ステップでは、プログラム中の利用されていないクラスやメソッド等を取り除きます。このステップは再帰的に処理されるので、全てのクラス・メソッドが対象となります。
最適化ステップでは、エントリポイントではないクラスやメソッドをprivate/static/final属性に変換、使われていないパラメータは削除され、一部のメソッドはインライン化されます。
難読化ステップでは、エントリポイントではないクラスやメソッドの名前を変更します。エントリポイントとなるクラスやメソッドは、オリジナルの名前でアクセスできるようにするために変更されません。
前検証ステップでは、実行時・ロード時のバイトコードの検証負荷を減らすために、あらかじめ型情報を調査し、その情報をクラスファイル内に添付します。Android(Java6)では使用しません。
開発したプログラムは外部から提供されるライブラリを使用することがありますが、これらはProGuardの処理の対象外となります。
【3.気になったオプション】
-printusage [filename]
入力クラスファイルに含まれる使用されなくなったコード(dead code)を一覧します。一覧は、標準出力もしくはfilenameとして与えられたファイルに出力されます。例えば、アプリケーション内で使用されなくなっているコードを一覧することができます。ダウンサイジング過程にのみ有効なオプションです。
-whyareyoukeeping class_specification
指定されたクラスとクラス・メンバーがどのような理由で削除されずにおかれることになったか、詳細を出力します。このオプションは、指定された要素がなぜ出力クラスファイルに含まれているのかを疑問に思った際に便利です。一般的に、いくつもの理由が考えられます。このオプションは、指定されたクラスとクラス・メンバーのそれぞれについて、(訳者:-keep系オプションにより)保全するよう指定されている要素もしくはエントリーポイントとつながるくメソッド呼び出し連鎖の、最短のものを出力します。現在の実装では、この出力される最短のメソッド呼び出し連鎖は、循環推論──それらは実際のダウンサイジング処理過程には反映されません──を含むことがあります。-verboseオプションが指定される場合、-whyareyoukeepingオプションによる出力には完全なフィールドとメソッドのシグネチャが含まれることになります。
-optimizationpasses n
最適化の処理を何回実施するか指定します。デフォルトでは、最適化は1回だけ実施されます。複数回実施することで処理結果の向上を期待できます。最適化を実施しても変化がない場合、最適化処理は終了します。最適化処理においてのみ有効なオプションです。
-printmapping [filename]
名前変更の対象となったクラスとクラス・メンバーの新旧の名前の対照表を出力するよう、指定します。この対照表データは標準出力もしくはfilenameとして与えられたファイルに対して出力されます。例えば、後々の漸進的難読化(incremental obfuscation*1)のため、あるいは処理済みのコードのスタックトレース情報を理解するため、といった目的が考えられます。このオプションは難読化処理に対してのみ有効です。
-dontusemixedcaseclassnames
難読化処理中に大文字小文字を混ぜた名前を生成しないように指定します。デフォルトでは、難読化されたクラス名は、大文字と小文字を含んでいます。完全に仕様に準拠した、実行可能なjarファイルが生成されます。しかし例えばこのjarファイルが大文字小文字を区別しないファイルシステム(例えば、Windowsです)を採用するプラットフォーム上で解凍されたとき、解凍ツールは似た名前(訳者:大文字小文字を区別しないと同じ字面になってしまう名前)のファイルで別のファイルを上書きしてしまうでしょう。解凍された段階で、コードは自動消滅してしまうのです。実際にWindows上で解凍する必要があるのであれば、このオプションによって、ProGuardの挙動を切り替えることができます。このとき結果的に、難読化したjarファイルのサイズが肥大してしまうことに注意してください。このオプションは難読化処理のときのみ有効です。
【4.学んだこと】
前回の投稿(ProGuardの設定ミスってる事に気がついた><)で、
「難読化しちゃいけないメソッドを難読化してしまった」って書いたけど
正確には、
「 ダウンサイジング、圧縮ステップ(shrink)の段階で、
[android:onClick]関連部分が、
エントリーポイントとして認識されておらず、
除外されてしまっていた 」 かな^^;