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