ScalaでAndroidしようと思ってsbtしたらProGuardでClassNotFoundExceptionした話

gen-androidとか適当なAndroidの素のプロジェクトをCloneとか、してScalaが使えるようにsbtプロジェクトとして整形した。MainActivityをjavaからscalaに置き換えてビルドして実行まで問題なしという仮定。

ViewPager / FragmentPagerAdapterとかcom.android.supportパッケージを利用したい場合に、sbtのdependenciesに該当パッケージをインポートすると思う。

build.sbt

libraryDependencies += "com.android.support" % "support-v4" % "22.2.1"

これでsbtのビルドは通る※し、ふつうに実機で実行できそうだけど、この状態でアプリを実行するとRuntimeExceptionで落ちる。具体的にはcom.android.support.v4.view.ViewPagerが見つからないとか出てくる。入れただろうが。

※Android SDK Manager で Android Support Repository をインストールしていないと、Maven型のAndroidリポジトリがローカルに作られず、そもそもsbtがライブラリインポートが出来ずに失敗する。事前にAndroid Support Repositoryをインストールしておく。

原因はProguardだった。AndroidでScalaやろうと思うと、debugでもProGuardで節約しないとDalvikVMの65535名前制約で引っかかるので、ProGuardを使うのが基本だが、そこの設定が抜けていて、support libraryが削除 or 難読化されてしまっていた模様。build.sbtを修正する。

build.sbt

// Set proguard options
proguardOptions in Android ++= Seq(
  "-ignorewarnings",
  "-keep class scala.Dynamic",
  "-keep class com.android.support.**")

-keepしていないと、難読化対象 or 削除対象になってしまうので、まるっとcom.android.supportパッケージをkeepに追加した。なんで使ってるのに削除するんだよという話だが、Layoutのxmlでしか参照していないと、参照を見つけてくれない = バッサリ削除らしい。死。

全部ひっくるめたbuild.sbtが

build.sbt

name := "HogeProject"

scalaVersion := "2.11.6"

libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % "test"

libraryDependencies += "com.android.support" % "support-v4" % "22.2.1"

libraryDependencies += "com.android.support" % "support-v13" % "22.2.1"

// Override the run task with the android:run
run <<= run in Android

// Activate proguard for Scala
proguardScala in Android := true

// Activate proguard for Android
useProguard in Android := true

// Set proguard options
proguardOptions in Android ++= Seq(
 "-ignorewarnings",
 "-keep class scala.Dynamic",
 "-keep class com.android.support.**")

これで問題が解決…かと思ったが。sbtで proguard:clean しておかないとキャッシュを参照してしまって、keepの変更が反映されずに実行時エラーになってしまうので、proguard:cleanしてキャッシュを消しておく。

あとはいつもどおり、android:packageしてandroid:runすればViewPagerが元気に動く。めでたしめでたし。

めでたくない。ProGuardメンテし続けるのこれはかなりめんどうだな…

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中