ticktakclockの日記

技術ポエムを綴ったりします。GitHub idも同じです (@ticktakclock)

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.0DayNight 系の機能実装のときにデグレったみたいでした。

stackoverflow.com

issuetracker.google.com

一応この問題は 1.2.0-alpha02 で対応されているようで、Gradleを更新したらたしかにLollipop WebViewで落ちなくなりました。

implementation 'androidx.appcompat:appcompat:1.2.0-alpha02'

mvnrepository.com

※この時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.xmluiMode のconfigurationChangedを付与するか

        <activity
            android:name=".UsingWebViewActivity"
            android:configChanges="uiMode" />

どちらかかなと思いました。バージョン上げるのにリスクある場合や、影響範囲を限りなく少なくしたい場合はプログラムで回避することも視野に入れて良いと思っています。