fresh digitable

セミコロンたちが躍動する おいらのコードを 皆さんに 見せたいね

R8でコードシュリンクしつつInstrumentation Testをやる

いろいろハマってしんどかったので雑にまとめておく。

github.com

ことの顛末

  • Instrumentation Testのテストが全然動かない。テストがないとか言われる
  • LogcatをみるとDaggerTestAppComponentDaggerAppComponentにキャストできませんとか言われている。そらそうよ
  • ちょっと書き換えると今度はkotlin.reflect.KProperty0がないとか言ってくる。なんでや
  • キャストするコードは書いていない。明にキャストしたり、安全キャスト(as?)をやったりしてみるがなぜかDaggerAppComponentにキャストされようとしてクラッシュする。Kotlinバイトコードデコンパイルしてみても特に変なところはない。dexにする段階で何か変わってしまったのか?と思ってapkファイルの中のバイトコードを確認すると、check-castという命令が追加されており、ここでDaggerAppComponent型かどうかのチェックがされていた。
  • R8の最適化が効いたのかな?と思って最適化させない命令(-dontoptimize)を付けると今度はkotlin.reflect.KProperty0が無いといわれる。またか。だがdexのバイトコードにはcheck-castがなくなっていた。
  • そうかそれならってことで今度は-keepkotlin.reflect以下のクラスを残すことにした。すると今度は別のクラスが無いという話になったので、一応効いているということが分かった。ないといわれたクラスを片っ端からkeepで残すことにしていったらテストが動くようになった。

敗因

  • R8の最適化が効いてたのが分からなかった
  • テスト用のアプリにクラスが足りないのかと思って(MockKを足したりしたので)いろいろ足してみたけど効果が無くて、本当はテスト対象側にそのクラスが無いといけなかった様子
  • 最初はDaggerの方を疑っていたが結果的に関係なかった
  • testSharedディレクトリを追加したあたりが悪かったのかと思って指定を付けたり外したりしてみていたけど結果的に関係なかった(ちょっとずつ変更しながら動きを見ていればよかった)
  • コードシュリンクしないとビルドできない(かといってMultidexにするほどでもない)