365連休

にわかのandroidとかの開発メモ。

【解決】RuntimeException: Unable to start activity. NullPointerException: Attempt to read from field 'android.graphics.Rect androidx.appcompat.widget.ContentFrameLayout.mDecorPadding' on a null object reference

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追記

 

スタックトレース Android 13

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)

 

スタックトレース Android 12

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ライブラリで以前から発生している問題みたいなので、いい加減バグフィックスして欲しいものだ。

 

 

stackoverflow.com

 

issuetracker.google.com