Status Update
Comments
jb...@google.com <jb...@google.com> #2
Branch: androidx-main
commit 57ca221882695bd6a52549f4d9ea3b812e6fe87c
Author: Simon Schiller <simonschiller@users.noreply.github.com>
Date: Mon Mar 22 16:09:30 2021
[GH] [FragmentStrictMode] Detect <fragment> tag usage
## Proposed Changes
- Detect `<fragment>` tag usage inside XML layouts
## Testing
Test: See `FragmentStrictModeTest#detectFragmentTagUsage`
## Issues Fixed
Fixes: 153738235
This is an imported pull request from
Resolves #141
Github-Pr-Head-Sha: 4ea052596e4341b9f11bcf335e2bc38045a91f19
GitOrigin-RevId: 62e7487aa4874eef6bb556490e193717cf937251
Change-Id: Iae48578e85e4e4897f806d7ade2e2a660adf9479
M fragment/fragment/api/public_plus_experimental_current.txt
M fragment/fragment/api/restricted_current.txt
M fragment/fragment/src/androidTest/java/androidx/fragment/app/strictmode/FragmentStrictModeTest.kt
M fragment/fragment/src/main/java/androidx/fragment/app/FragmentLayoutInflaterFactory.java
M fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.java
A fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.java
il...@gmail.com <il...@gmail.com> #3
Thank you for getting back to me. This exception is super rare (a couple of crashes a month for 1000 DAU), and I have no idea what part of the application may be causing it, especially since it happens after state restoration (new session) I have no appropriate event history in Firebase. All the navigation routines in the app are implemented with a navigation component, with no direct fragment management.
Maybe adding more info to that exception message may help? Maybe we can somehow determine a type of problematic fragment?
il...@gmail.com <il...@gmail.com> #4
Ok, I managed to reproduce the issue in a somewhat strange way.
I created a sample "Bottom Navigation Activity" app from Android Studio Electric Eel | 2022.1.1 Canary 10. I made no modifications to it. I launched it on a physical Pixel 6 Pro. I started to rotate the screen orientation and simultaneously tap on several bottom navigation entries, and this happened:
FATAL EXCEPTION: main
Process: com.example.noinstantiatedfragment, PID: 30345
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.noinstantiatedfragment/com.example.noinstantiatedfragment.MainActivity}: android.view.InflateException: Binary XML file line #32 in com.example.noinstantiatedfragment:layout/activity_main: Binary XML file line #32 in com.example.noinstantiatedfragment:layout/activity_main: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3676)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3813)
at android.app.ActivityThread.handleRelaunchActivityInner(ActivityThread.java:5791)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5682)
at android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItem.java:71)
at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
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:2308)
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:7898)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
Caused by: android.view.InflateException: Binary XML file line #32 in com.example.noinstantiatedfragment:layout/activity_main: Binary XML file line #32 in com.example.noinstantiatedfragment:layout/activity_main: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #32 in com.example.noinstantiatedfragment:layout/activity_main: Error inflating class fragment
Caused by: java.lang.IllegalStateException: No instantiated fragment for (e337ad99-a9f0-4929-a11b-3b52760280ff)
at androidx.fragment.app.FragmentStore.restoreAddedFragments(FragmentStore.java:61)
at androidx.fragment.app.FragmentManager.restoreSaveStateInternal(FragmentManager.java:2535)
at androidx.fragment.app.Fragment.restoreChildFragmentState(Fragment.java:1989)
at androidx.fragment.app.Fragment.onCreate(Fragment.java:1965)
at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.kt:169)
at androidx.fragment.app.Fragment.performCreate(Fragment.java:3090)
at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:257)
at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:142)
at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:136)
at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:248)
at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:227)
at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1073)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1001)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:965)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:1127)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1088)
at android.view.LayoutInflater.inflate(LayoutInflater.java:686)
at android.view.LayoutInflater.inflate(LayoutInflater.java:538)
at com.example.noinstantiatedfragment.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:49)
at com.example.noinstantiatedfragment.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:43)
at com.example.noinstantiatedfragment.MainActivity.onCreate(MainActivity.kt:19)
at android.app.Activity.performCreate(Activity.java:8290)
at android.app.Activity.performCreate(Activity.java:8269)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1384)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3657)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3813)
at android.app.ActivityThread.handleRelaunchActivityInner(ActivityThread.java:5791)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5682)
at android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItem.java:71)
at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
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:2308)
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:7898)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
il...@gmail.com <il...@gmail.com> #5
I managed to get it on screen recording :)
jb...@google.com <jb...@google.com> #6
The video you uploaded is not working, can you add the sample app you used and reupload another video?
il...@gmail.com <il...@gmail.com> #7
Sure, I've uploaded it to Google Drive and validated it on several devices. Hopefully, this time, it should play back as intended.
And here's a repo (sample project from Android Studio with no modifications):
il...@google.com <il...@google.com>
ra...@gmail.com <ra...@gmail.com> #8
ap...@google.com <ap...@google.com> #9
Branch: androidx-main
commit c5ff8b06a002ff7fcd89466b885f6ec930148d7f
Author: Jeremy Woods <jbwoods@google.com>
Date: Tue Mar 28 19:33:40 2023
Prevent accidentally removing active fragments
It is possible with saving and restoring state to accidentally make
fragment manager mark an active fragment as inactive.
This results in a failed restore after a config change.
We should only make FragmentStateManagers that are active inactive. This
ensures that active and inactive calls are 1 to 1.
RelNote: "Fixed a bug in FragmentManager where saving and restoring in
the same frame could cause a crash."
Test: Added FragmentManagerTest
Bug: 246519668
Change-Id: Ib36aff4a7263e10d7d795b4d8dbd6431d2552e5c
M fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentManagerTest.kt
M fragment/fragment/src/main/java/androidx/fragment/app/FragmentStore.java
jb...@google.com <jb...@google.com> #10
This has been fixed internally and will be available in the Fragment 1.6.0-alpha09
release.
na...@google.com <na...@google.com> #11
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.fragment:fragment:1.6.0-alpha09
Description
Component used: Navigation Version used: 2.6.0-alpha01 Devices/Android versions reproduced on: Galaxy S21 5G
Hello! It seems like some users are facing very rare crashes with the following stack trace.
I'm unsure what the right direction would be to investigate and fix it. May it be somehow related to some rare Navigation framework internal issues?