PlayConsoleリリース前レポートでアクティビティ起動時にクラッシュしたことが報告された。
エミュレータでも手持ちのテストデバイスでもリリースをインストールした実機でも再現しない。
2024/1/15追記
一般のインストールユーザにおいても一定数で同様のクラッシュが発生したため、この例外は必ず修正する必要がある。
ユーザを人柱にしてはいけません。
なお、発生条件は不明。
関連ライブラリ
- androidx.appcompat:appcompat:1.6.1
- androidx.appcompat:appcompat-resources:1.6.1
PlayConsole リリース前レポート
テストの際に 1 台のデバイスで検出されました。
Generic Small Desktop (x86) (仮想) 1366x768 Android 12L(SDK 32) - x86_64 en_US
※別なアプリでも同様にクラッシュしていたが、テストデバイスは異なっていた。
※※テストデバイスはアプリ毎に自動でいくつか選ばれるらしい。
スタックトレース概要
java.lang.RuntimeException: Unable to start activity ComponentInfo{アプリパッケージ/アクティビティクラス}: java.lang.NullPointerException: Attempt to read from field 'android.graphics.Rect androidx.appcompat.widget.ContentFrameLayout.mDecorPadding' on a null object reference
Exception java.lang.RuntimeException: Unable to start activity ComponentInfo{アプリパッケージ/アクティビティクラス}: java.lang.NullPointerException: Attempt to read from field 'android.graphics.Rect androidx.appcompat.widget.ContentFrameLayout.mDecorPadding' on a null object reference at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3707) at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3864) at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2253) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loopOnce (Looper.java:201) at android.os.Looper.loop (Looper.java:288) at android.app.ActivityThread.main (ActivityThread.java:7870) at java.lang.reflect.Method.invoke at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1003) Caused by java.lang.NullPointerException: Attempt to read from field 'android.graphics.Rect androidx.appcompat.widget.ContentFrameLayout.mDecorPadding' on a null object reference at androidx.appcompat.widget.ContentFrameLayout.setDecorPadding (ContentFrameLayout.java:469) at androidx.appcompat.app.AppCompatDelegateImpl.applyFixedSizeWindow (AppCompatDelegateImpl.java:469) at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor (AppCompatDelegateImpl.java:469) at androidx.appcompat.app.AppCompatDelegateImpl.setContentView (AppCompatDelegateImpl.java:2) at androidx.appcompat.app.AppCompatActivity.setContentView (AppCompatActivity.java:2) at android.app.Activity.performCreate (Activity.java:8074) at android.app.Activity.performCreate (Activity.java:8054) at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1341) at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3688)
人柱クラッシュログ 2024/1/15追記
Exception java.lang.RuntimeException: at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3761) at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3909) at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:101) at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2412) at android.os.Handler.dispatchMessage (Handler.java:111) at android.os.Looper.loopOnce (Looper.java:238) at android.os.Looper.loop (Looper.java:357) at android.app.ActivityThread.main (ActivityThread.java:8149) at java.lang.reflect.Method.invoke at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:957) Caused by java.lang.RuntimeException: Window couldn't find content container view at com.android.internal.policy.PhoneWindow.generateLayout (PhoneWindow.java:2753) at com.android.internal.policy.PhoneWindow.installDecor (PhoneWindow.java:2818) at com.android.internal.policy.PhoneWindow.getDecorView (PhoneWindow.java:2219) at androidx.appcompat.app.AppCompatActivity.a0 (AppCompatActivity.java:5) at androidx.appcompat.app.AppCompatActivity.setContentView (AppCompatActivity.java:1) at android.app.Activity.performCreate (Activity.java:8575) at android.app.Activity.performCreate (Activity.java:8554) at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1419) at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3742)
Exception java.lang.RuntimeException: at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3636) at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3793) at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2211) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loopOnce (Looper.java:201) at android.os.Looper.loop (Looper.java:288) at android.app.ActivityThread.main (ActivityThread.java:7879) at java.lang.reflect.Method.invoke at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1009) Caused by java.lang.IllegalArgumentException: ID does not reference a View inside this Activity at android.app.Activity.requireViewById (Activity.java:3427) at androidx.core.app.ActivityCompat$Api28Impl.requireViewById (ActivityCompat.java:1) at androidx.core.app.ActivityCompat.requireViewById (ActivityCompat.java:1) at androidx.navigation.Navigation.findNavController (Navigation.kt:1) at android.app.Activity.performCreate (Activity.java:8051) at android.app.Activity.performCreate (Activity.java:8031) at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1330) at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3609)
仮想デバイスによるリリース前テストであったsetDecorPaddingも実機で発生したが省略する。
クラッシュは上記の3パターンのいずれかであった。
解決策
下記サイトを参考に継承したActivityのonCreateでsuper.onCreate(savedInstanceState);コール前にgetWindow().getDecorView();を呼び出した。
public class MyActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { getWindow().getDecorView(); //おまじないを追加! super.onCreate(savedInstanceState); : : } }
するとリリース前レポートにクラッシュは記録されなくなったため、解決したとみなす。
つか、いったいどういう理屈でエラーが発生して、なぜ、getDecorViewの事前呼び出しで解決するのかは全く分からない。
appcompatライブラリで以前から発生している問題みたいなので、いい加減バグフィックスして欲しいものだ。