なんかplugin作りが楽しかっただけで、実用するか、ちゃんとメンテするのかかなりあやしいけれど、Android Pluginのソースコードリーディングと、sbt Plugin の勉強も兼ねて、とりあえずつくってみた
https://github.com/xuwei-k/android-plugin/tree/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のライブラリ全部含めてアンドロイドやったらこんなエラーでて失敗する(・ω・`)No expanded opcode for 6313e969 ForkJoinTask.java:1037@000a: invoke-virtual v0:Lsun/misc/Unsafe
2012-03-31 20:54:40 via web
という自体が発生したため、デフォルトでは以下のように、 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 を含むようにしてしまいたい・・・