sbt の Android Scala Plugin を Proguard 使わないように改造してみた

なんかplugin作りが楽しかっただけで、実用するか、ちゃんとメンテするのかかなりあやしいけれど、Android Pluginのソースコードリーディングと、sbt Plugin の勉強も兼ねて、とりあえずつくってみた
https://github.com/xuwei-k/android-plugin/tree/no-proguard

https://github.com/xuwei-k/android-plugin/compare/6f6e4b97419f71a7567a8e06953bae09de9ba4ef...no-proguard

Proguard 関連のコードは大雑把に消したつもりだけれど、まだ必要ない部分残ってると思う

りりろじさんが書いているように
http://d.hatena.ne.jp/lyrical_logical/20120320/1332239789

今のところ android-plugin で scala コードを書く場合は ProGuard を有効にしないといけないので注意が必要です。ここで滅茶苦茶はまりました。無効にしていると、アプリケーション起動時、クラスローダーにクラスが見つからないとごねられます。

自分もこのあたりの設定にかなりハマったし、そもそも Proguard の設定方法がこんな感じで文字列で指定するので

https://github.com/jberkel/android-plugin/blob/0.6.1/src/main/scala/AndroidInstall.scala#L87-96

わかりにくい。かつ、ちゃんと Proguard の挙動をわかってないと、必要な class まで削られてしまって残念なことになったりする・・・。
なので
"べつにapkの容量大きくなってもいいから、Proguard を使わないversionがあってもいいんじゃね?"
と思い立ち、つくったらなんとなくそれなりにできました。

ただ、

という自体が発生したため、デフォルトでは以下のように、 scala/actors 以下と scala/concurrent/forkjoin 以下は強制的に消してます
https://github.com/xuwei-k/android-plugin/blob/5914c95ecaeff1fbddc3c3816b8a4f106304d021/src/main/scala/AndroidInstall.scala#L89

( 調べたら、こんなものとかでてきたが 、色々試行錯誤してもよくわからなかったため。このあたり https://github.com/scala/scala/blob/v2.9.1/src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java#L1049 の呼び出し部分の解析でエラーになってるっぽい )

その他、現状未解決な問題点

  • 2.8系だとdxのタスク成功するのに、2.9系だと(scala-library.jarが大きすぎて?) メモリ足りなくなるェ・・・
  • 他の依存ライブラリが大きすぎても同じくdxのタスクでメモリが・・・
  • (そもそもAndroid Plugin関係なしに) scripted plugin でのテスト実行時に、簡単にメモリ足りなくなるんだけど、どこで設定すればいいんだろうか。*1
  • scala.actors以下のclassに依存しているものはないはずなので、消しても問題ないが、 scala.concurrent.forkjoin は、paralell collection で使っているようなので、結局こんな無理やりなやりかたでは、実行時にclassが見つからないってエラーになる可能性ある。なので、理想としてはとりあえずsun.misc.Unsafeの問題を解決して、全部まるごと scala-library.jar を含むようにしてしまいたい・・・

*1:scripted pluginってたしかプロセスをforkして、リフレクション呼び出しとかしてるから?sbt自体のlauncherで指定したJVMのオプション使ってくれないということ?