clearという名前のメソッドをもつViewModelのサブクラスをdalvikvm上で見つけられない人へ
年末、android-ktxをプロジェクトに入れようとして思わぬところで躓いたのでメモしておく。現象としては、Android 5.0以上が動いているエミュレータでは問題ないのに、4.4のエミュレータではアプリが起動するときにクラッシュしてしまうというもので、LogCatには特定のViewModel
のサブクラスをロードするときにClassNotFoundException
が発生した旨のスタックトレースが出ていた。
以下、手短に:
- 前提知識
- dalvikvmではpackage-privateなメソッドがパッケージ外からoverrideされてしまう(https://issuetracker.google.com/issues/36980050)。
- Javaではpackage-privateなメソッドと、そのサブクラスのメソッドとが同じ名前であった場合、それぞれ別のメソッドという扱いになる。
- ARTではこの不具合は修正されている様子。
- viewmodel 2.1.0-alpha01でpackage-privateな
final void clear()
というメソッドがViewModel
に追加された(https://android.googlesource.com/platform/frameworks/support/+/cc482665dae9b47b09bc818f39fbb01c36cf0d75%5E%21/#F5)- fragment-ktx 1.1.0-alpha03の依存関係で入ってきた模様。
- dalvikvmではpackage-privateなメソッドがパッケージ外からoverrideされてしまう(https://issuetracker.google.com/issues/36980050)。
- クラッシュする理屈:
clear()
という名前のメソッドを持つViewModel
のサブクラスは、dalvikvm上では親クラスのViewModel.clear()
をoverrideすることになるが、ViewModel.clear()
はfinal
なのでoverrideできない*1。これによってViewModel
のサブクラスは仮想マシンに読み込まれず、クラスが見つからない系のランタイムエラーが発生する。 - 対応
- サブクラスのclearメソッドの名前を変えました…
- こういうのはAOSPに報告すべき?
2018年に見たアニメ
毎年恒例のやつを今年もやります。タイトルの並び順は50音順です。カッコ[ ]
つきのものは録画したけどまだ見てないというやつです。必ず見るのでいつかは外れると思います。
冬クール
ヴァイオレット・エヴァーガーデンとよりもいを見て毎週泣くおじさんと化したクールだった。
- カードキャプターさくら クリアカード編 (2018)
- 斉木楠雄のΨ難 第2期
- スロウスタート
- 宇宙よりも遠い場所
- ダーリン・イン・ザ・フランキス
- だがしかし2
- たくのみ。
- 覇穹 封神演義
- ヴァイオレット・エヴァーガーデン
- ハクメイとミコチ
- Fate/EXTRA Last Encore
- ポプテピピック
- ゆるキャン△
- りゅうおうのおしごと!
春クール
ウマ娘さんはアニメはものすごくよかったのでもっと頑張ってはやくゲームをリリースしてほしい。「スポ根ものいいやん」となったきっかけ。
- あまんちゅ!~あどばんす~
- 宇宙戦艦ティラミス
- ウマ娘 プリティーダービー
- 銀河英雄伝説 Die Neue These 邂逅
- ゴールデンカムイ
- 重神機パンドーラ
- STEINS;GATE 0
- ソードアート・オンライン オルタナティブ ガンゲイル・オンライン
- 多田くんは恋をしない
- ひそねとまそたん
- ヒナまつり
- 僕のヒーローアカデミア(第3期)
- ルパン三世 PART5
- 若おかみは小学生!
夏クール
はねバドで試合中に顔つきが変わるやつ、僕は宝塚システムと勝手に呼んでいた。最終回のカタルシスは比類なきものだったと思います。ハ行のアニメ大杉。
- アイドルマスター シンデレラガールズ劇場 3rd SEASON
- アンゴルモア元寇合戦記
- すのはら荘の管理人さん
- ちおちゃんの通学路
- 中間管理録トネガワ
- 天狼 Sirius the Jaeger
- 進撃の巨人 Season3
- ハイスコアガール
- バキ 最凶死刑囚編
- はたらく細胞
- BANANA FISH
- はねバド!
- はるかなレシーブ
- ヤマノススメ サードシーズン
秋クール
グリッドマンは男の子が好きなやつで完全に満たされていたのでとてもよかった。ひそまそ、JOJO、リリスパは個人的にぺろぺろ三部作(三部作ではない)と呼んでいる。ア行のアニメ大杉。
- アイドルマスター SideM 理由あってMini!
- あかねさす少女
- アニマエール!
- 色づく世界の明日から
- INGRESS
- うちのメイドがウザすぎる!
- 宇宙戦艦ティラミスⅡ
- SSSS.GRIDMAN
- ガイコツ書店員 本田さん
- からくりサーカス
- ゴールデンカムイ(第二期)
- ゴブリンスレイヤー
- ジョジョの奇妙な冒険 黄金の風
- ゾンビランドサガ
- DOUBLE DECKER! ダグ&キリル
- やがて君になる
- RELEASE THE SPYCE
劇場版
リズも若おかみもどちらも衝撃だったと思う。どの作品も全体的に美術が素晴らしく、よく動き、そして泣けた。
- さよならの朝に約束の花をかざろう
- 劇場版 のんのんびより ばけーしょん
- ペンギン・ハイウェイ
- リズと青い鳥
- 若おかみは小学生!
RobolectricでRecyclerView.smoothScrollToPosition()を呼ぶとテストが進まなくなる(未解決)
ViewPager
の代わりにRecyclerView
を使ってチュートリアルの紙芝居を実装したのだが、進むボタンをN回押してサインアップへ進む画面に行くテストがいつまで経っても終了しない現象が起きた。諸事情によりprintデバッグを使って二分探索的にどこで止まっているかを調べたところ、どうもDatabindingでRecyclerView.smoothScrollToPosition()
を呼んでいるところが怪しいということになりぐぐった結果、次のissueを発見した。
私の環境ではRobolectricは4.0.2だが、issueが出たのがだいたい1年前で、他の人が4.1-SNAPSHOTでも起きていると言っているので根が深そう。EspressoのswipeLeft()
を使ってみたがこれもハングした。しかし、RecyclerViewActions.scrollToPosition()
を使うとページを送ってやることはできた。ただ、この方法ではスクロール位置がコールバックに渡って来ないので、「ページ番号が変わっているか」みたいなことはチェックできないかもしれない。
結局、いい回避策が思いつかなかったので棚上げしてしまった。アニメーションが絡むとなんかうまくいかないのかなとか、スクロールした量(xとかy方向の移動量)を計算できないのかなとかいろいろ想像してみるけど全然わからない。知っている人がいたら教えて欲しい。できれば直してくれるとありがたい。
以下は本件とは関係ないけどいい本なのでみなさん買ってください。