割とハマったのでメモ。
更新日-2012/03/25
にあるように、ADT17 以降では、既定の難読化設定は SDK のディレクトリにありそれを参照するようになっている。 プロジェクト固有の設定は proguard-project.txt に書くように既定で準備されている。
Android proguard でググって出てくる情報は、大抵は Proguard.cfg として説明されているので、その情報は断片的には使えるだろうが、古い情報として注意して参照したほうがよい。
外部ライブラリを使っている(/libs に jar を入れてる)場合、それらを -libraryjars xxx.jar と列挙しなければならないと 思っていた が不要らしい。
-libraryjars に列挙したら最初の一つしか library jar として認識してくれなくて「なにこれ?」と思ってググったら、
(http://stackoverflow.com/questions/11246842/using-proguard-with-android/11249755#11249755) 回答日-2012/06/28
- ProGuard manual > Troubleshooting > Note: duplicate definition of program/library class
The Android Ant/Eclipse builds already specify -injars/-libraryjars for you. If you specify them again in your configuration, ProGuard notes that they are duplicated. So don't specify -injars/-libraryjars.
libs配下は既定で定義済だから proguard-project.txt の方で再定義しなくてよいらしい。
「ほんとかなぁ」に同意。warning潰すのがデファクトなツールで良いの?
とあるメソッドの引数 Hoge<Piyo> arg
から、 Class#getGenericInterfaces()
で Piyo
を取得していたのだけど、Proguard かけたら、 Hoge<Piyo>
が Hoge
だけになって取れなくなってしまった。
Java のイレイジャ云々か?とも思ったけど、メソッドの引数ならいけるはずだし…
StackOverflow さんによると、
-keepattributes *Annotation*
をつけるといいよ的な事が書いてあるんだけど、うまくいかなかった。
情報が新旧錯綜してる発展途上なツールを苦労して使って、設定も実装に依存するし(自動化できない)、運用時もデバッグしづらいし、この難読化って作業、コスパどうなんすかね? 所詮 Webサービスのフロントエンドである Java プログラムに、そこまで難読化にこだわることはないんじゃないかなーという私見です。