複数プロジェクトでProGuardが何かうまくいかないのでJARを入れるもおかしい作りのものを入れたのでJARのエクスポートを行ったらなんとかうまくいった

id:yellow_73:20120817の続きだったりしてます。

ライブラリプロジェクト(ライセンスライブラリとダウンロードライブラリ)とアプリケーションプロジェクトを作って、アプリケーションプロジェクトから Properties - Android でライブラリを読み込むようにしています。
ここでProGuardを使って、かなりはまった。
まず、ライブラリプロジェクトの R$strings が見つからんとかなんとかいう警告がいっぱい出て、警告のくせに止まる。いろいろ見ていくと、proguard-project.txtで "-dontwarn" を指定すると良いらしい。確かに…いや消えない。

クラスを指定した "-dontwarn (名前空間).*" とかやると警告が収まった。不思議な感じがしたが、まあこれでいいや。インストール、実行すると、今度は、ContentProviderを継承したクラスが見つからんとか言われる。

proguard-project.txt で "-keep class (クラス名)" とやってやると、そのクラスについては難読化を避けるのでNotFoundは出ないはず。なのに見つからない。散々迷って、なんとなくライブラリクラスの bin フォルダから JARファイルを持ってきてやったらOKみたい。…と思ったが、今度は ライブラリプロジェクトの R$strings が見つからん、と実行時エラー。

これはまずい、styles とか他のリソースもあるってのに…。で、jarをzipにサフィックスを変えて開いてみた(jarは要はzip)ら、リソースの類が全く入ってない。

ということは、JARファイルの生成がおかしいのか、と思いGoogleさんに尋ねたところ、プロジェクトに対して JAR をエクスポートすれば良いとのこと。この際 AndroidManifest.xml を混ぜない、という記述が複数見つかる。

えー、srcとかも入れて大丈夫なのー? しかもjar内部の配置が何かおかしくなるんですけどー。大丈夫なのー? と思ってとりあえずエクスポートして取り込んでみると…ちゃんと読んでくれるんだね、いやーそう思ったよーと手のひら返していました。

これでProGuardにかけてやると、万事OKでした。

あと、本当にProGuardにかかっているかを簡易的に調べるには proguard フォルダの中のテキストファイルが実はログなので、ざっくり削除してから apk をエクスポートすればOKです。混乱してProGuardがかかっているのかそうでないかが分からんようになったものでして。

まとめ

ライセンスライブラリとダウンロードライブラリはJARにエクスポートするといいと思うよ。