WebView android.view.InflateException on Lollipop
こんにちは、tkyです。
久々にWebViewで落ちた案件です。Lollipop(5.0)です。悲しみです。
手元にLollipopがないので実機で発生するかわからないのですが、Emulatorで発生するものです。
もしかしたらPlay Storeからandroid system webveiwのバージョンを上げるだけでも回避できる可能性は十分にあります。
E/AndroidRuntime: FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.your.packagename.UsingWebViewActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class android.webkit.WebView at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
ぐぐると大体以下のような対策的なのが出てくるのですが、こんな事やっていなくても動いておりまして、はい。
override fun applyOverrideConfiguration(overrideConfiguration: Configuration?) { if (Build.VERSION.SDK_INT in 21..25) { return } super.applyOverrideConfiguration(overrideConfiguration) }
この辺のstack overflowとissue見ると 1.0.2
では動いてるが、 1.1.0
で DayNight
系の機能実装のときにデグレったみたいでした。
一応この問題は 1.2.0-alpha02
で対応されているようで、Gradleを更新したらたしかにLollipop WebViewで落ちなくなりました。
implementation 'androidx.appcompat:appcompat:1.2.0-alpha02'
※この時Android Studioのリリースノートには 1.2.0-alpha01
までしか載っていなくてちょっとハマりました 🐥
そのAppCompat、バージョン上がってないですか?
動いていた時、appcompat1.0.2使っていたのですが(古)、問題が起こってたときもGradleは変えていませんでした。
+--- androidx.appcompat:appcompat:1.0.2
とある時期からなぜか1.1.0に依存更新されていたのです。
+--- androidx.appcompat:appcompat:1.0.2 -> 1.1.0
materialの更新で依存バージョンが上がっていた
+--- com.google.android.material:material:1.2.0-alpha04
| +--- androidx.appcompat:appcompat:1.1.0 (*)
僕の場合はMaterialの更新でたまたまappcompatのバージョンが上がって、デグレっていました。
どう回避するかはアプリ次第かと思われます。1.2.0-alpha02
のバージョンアップも多少リスクはあると思うので、プログラムで回避するのも一つの正解かと思われます。
implementation 'androidx.appcompat:appcompat:1.2.0-alpha02'
WebView使っているアプリを開発されている皆様は今一度AppCompatのバージョンとLollipopでの動作確認してみるとよいかもしれません!
以上です!
(追記)プログラムで回避する場合
ActivityにapplyOverrideConfigurationを実装してUI_MODE_NIGHT_MASKを除外するか
override fun applyOverrideConfiguration(overrideConfiguration: Configuration) { if (Build.VERSION.SDK_INT in Build.VERSION_CODES.LOLLIPOP..Build.VERSION_CODES.N_MR1) { overrideConfiguration.uiMode = overrideConfiguration.uiMode and Configuration.UI_MODE_NIGHT_MASK.inv() } super.applyOverrideConfiguration(overrideConfiguration) }
AndroidManufest.xmlに uiMode
のconfigurationChangedを付与するか
<activity android:name=".UsingWebViewActivity" android:configChanges="uiMode" />
どちらかかなと思いました。バージョン上げるのにリスクある場合や、影響範囲を限りなく少なくしたい場合はプログラムで回避することも視野に入れて良いと思っています。