Android 10正式版应用Fragment循环重载问题求助
Android 10 应用启动后Fragment标签页触发持续重载循环,最终页面空白
大家好,我已经花了整整一个月排查这个问题,实在没头绪才来求助。
问题场景
应用在Android 10以下版本运行完全正常,但在Android 10正式版中,偶尔启动后会陷入持续重载循环,最终页面变成空白。更关键的是没有崩溃日志,这让定位根源变得异常困难。
应用底部有4个Fragment标签页,问题发作时会出现诡异的跳转:比如点击标签3,会直接跳转到标签2,同时触发Activity重载;等标签2加载完成后,又会再次重载Activity,如此循环直到应用彻底卡死。
我翻遍了Logcat也没找到明确的错误指向,下面是我已经尝试过但无效的方案:
已尝试的解决方案
- 在
AndroidManifest.xml中配置android:usesCleartextTraffic="true",针对Nat64前缀问题做了处理 - 调整Fragment事务逻辑,优化Fragment的创建、附加逻辑:
FragmentTransaction FT = getSupportFragmentManager().beginTransaction(); if(fragment == null) { fragment = new Main_F(); FT.addToBackStack(null); FT.add(R.id.RL_id, fragment).commit(); } else { if(fragment.isDetached()) { FT.attach(fragment); } else { // 无操作 } }
- 注释掉了StrictMode相关代码:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);
相关Logcat日志
D/fling_: {"code":"200","msg":[{"response":"success"}] D/numTouch: 82 D/fling_: {"code":"200","msg":[{"response":"success"}] D/numTouch: 83 D/fling_: {"code":"200","msg":[{"response":"success"}] I/WebViewFactory: 加载com.google.android.webview版本85.0.4183.101(代码418310183) I/cr_LibraryLoader: 加载本地库版本号"85.0.4183.101" I/cr_CachingUmaRecorder: 刷新5个直方图中的5个样本 W/InputEventReceiver: 应用输入:主线程分发InputEvent耗时126ms!(MotionEvent: event_seq=1863, seq=2398961, action=ACTION_UP) D/numTouch: 84 E/chromium: [错误:filesystem_posix.cc(62)] 创建目录/data/user/0/com.sp1.fling/cache/WebView/Crashpad失败:无此文件或目录(2) W/com.sp1.fling: 访问隐藏方法Llibcore/io/Memory;->peekLong(JZ)J(灰名单,反射,允许) 访问隐藏方法Llibcore/io/Memory;->pokeLong(JJZ)V(灰名单,反射,允许) 访问隐藏方法Llibcore/io/Memory;->pokeInt(JIZ)V(灰名单,反射,允许) 访问隐藏方法Llibcore/io/Memory;->peekInt(JZ)I(灰名单,反射,允许) 访问隐藏方法Llibcore/io/Memory;->pokeByte(JB)V(灰名单,反射,允许) 访问隐藏方法Llibcore/io/Memory;->peekByte(J)B(灰名单,反射,允许) 访问隐藏方法Llibcore/io/Memory;->pokeByteArray(J[BII)V(灰名单,反射,允许) W/com.sp1.fling: 访问隐藏方法Llibcore/io/Memory;->peekByteArray(J[BII)V(灰名单,反射,允许) 访问隐藏方法Lsun/misc/Unsafe;->getLong(Ljava/lang/Object;J)J(灰名单,核心平台API,反射,允许) 访问隐藏字段Ljava/nio/Buffer;->address:J(灰名单,反射,允许) 访问隐藏方法Lsun/misc/Unsafe;->arrayBaseOffset(Ljava/lang/Class;)I(灰名单,核心平台API,反射,允许) 访问隐藏方法Lsun/misc/Unsafe;->arrayIndexScale(Ljava/lang/Class;)I(灰名单,反射,允许) 访问隐藏方法Lsun/misc/Unsafe;->getInt(Ljava/lang/Object;J)I(灰名单,反射,允许) 访问隐藏方法Lsun/misc/Unsafe;->putInt(Ljava/lang/Object;JI)V(灰名单,反射,允许) 访问隐藏方法Lsun/misc/Unsafe;->getLong(Ljava/lang/Object;J)J(灰名单,核心平台API,反射,允许) 访问隐藏方法Lsun/misc/Unsafe;->putLong(Ljava/lang/Object;JJ)V(灰名单,反射,允许) 访问隐藏方法Lsun/misc/Unsafe;->getObject(Ljava/lang/Object;J)Ljava/lang/Object;(灰名单,反射,允许) 访问隐藏方法Lsun/misc/Unsafe;->putObject(Ljava/lang/Object;JLjava/lang/Object;)V(灰名单,反射,允许) W/com.sp1.fling: 访问隐藏方法Lsun/misc/Unsafe;->putInt(Ljava/lang/Object;JI)V(灰名单,链接,允许) 访问隐藏方法Lsun/misc/Unsafe;->putObject(Ljava/lang/Object;JLjava/lang/Object;)V(灰名单,链接,允许) D/fling_: {"code":"200","msg":[{"response":"success"}] W/Looper: 主线程Looper缓慢:长消息seq=5273 计划时间21:20:04.160 延迟0ms 耗时2017ms 运行16ms h=android.os.Handler c=com.sp1.fling.All_Fragments.Profile_F$2 W/Looper: 主线程Looper缓慢:MotionEvent延迟1968ms(event_seq=1999, action=ACTION_DOWN),原因是1条消息,消息1耗时2017ms(seq=5273 运行16ms h=android.os.Handler c=com.sp1.fling.All_Fragments.Profile_F$2) W/InputEventReceiver: 应用输入:dispatchInputEvent前延迟1968ms(MotionEvent: event_seq=1999, seq=2399195, action=ACTION_DOWN) D/numTouch: 91 W/InputEventReceiver: 应用输入:dispatchInputEvent前延迟1806ms(MotionEvent: event_seq=2006, seq=2399233, action=ACTION_UP) W/Looper: 主线程Looper缓慢:MotionEvent延迟1681ms(event_seq=2010, action=ACTION_DOWN),原因是1条消息,消息1耗时2017ms(seq=5273 运行16ms h=android.os.Handler c=com.sp1.fling.All_Fragments.Profile_F$2) W/InputEventReceiver: 应用输入:dispatchInputEvent前延迟1681ms(MotionEvent: event_seq=2010, seq=2399237, action=ACTION_DOWN) D/numTouch: 92 W/InputEventReceiver: 应用输入:dispatchInputEvent前延迟1533ms(MotionEvent: event_seq=2017, seq=2399269, action=ACTION_UP) I/Choreographer: 跳过61帧!应用可能在主线程执行过多操作 W/Looper: 主线程Looper缓慢:MotionEvent延迟1368ms(event_seq=2021, action=ACTION_DOWN),原因是1条消息,消息1耗时2017ms(seq=5273 运行16ms h=android.os.Handler c=com.sp1.fling.All_Fragments.Profile_F$2) W/InputEventReceiver: 应用输入:dispatchInputEvent前延迟1368ms(MotionEvent: event_seq=2021, seq=2399273, action=ACTION_DOWN) D/numTouch: 93 W/Looper: 主线程Looper缓慢:doFrame延迟2036ms,原因是1条消息,消息1耗时2017ms(seq=5273 运行16ms h=android.os.Handler c=com.sp1.fling.All_Fragments.Profile_F$2) W/InputEventReceiver: 应用输入:dispatchInputEvent前延迟1214ms(MotionEvent: event_seq=2034, seq=2399313, action=ACTION_UP) I/OpenGLRenderer: Davey! 耗时=2059ms; Flags=0, IntendedVsync=147673798631902, Vsync=147675831965276, OldestInputEvent=147674467743000, NewestInputEvent=147674587149000, HandleInputStart=147675835923456, AnimationStart=147675838424863, PerformTraversalsStart=147675838488821, DrawStart=147675845168196, SyncQueued=147675846321217, SyncStart=147675846668144, IssueDrawCommandsStart=147675847019654, SwapBuffers=147675857965956, FrameCompleted=147675858530383, DequeueBufferDuration=196000, QueueBufferDuration=283000, D/fling_: {"code":"200","msg":[{"response":"success"}] D/Main: 插页广告已加载完成,可展示! I/Timeline: Timeline: Activity启动请求时间:147675892 V/FA: 记录用户参与时长,毫秒:29321 V/FA: 连接远程服务 W/ActivityThread: handleWindowVisibility: 无对应Activity的token android.os.BinderProxy@aa951f1 V/FA: Activity已暂停,时间:267761869 D/FA: 记录事件(FE): user_engagement(_e), Bundle[{firebase_event_origin(_o)=auto, engagement_time_msec(_et)=29321, firebase_screen_class(_sc)=MainActivity, firebase_screen_id(_si)=-5671580944013741474}] V/FA: onActivityCreated V/FA: 连接尝试已在进行中 W/com.sp1.fling: 访问隐藏方法Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread;(灰名单,反射,允许) 访问隐藏字段Landroid/app/ActivityThread;->mActivities:Landroid/util/ArrayMap;(灰名单,反射,允许) 访问隐藏字段Landroid/app/ActivityThread$ActivityClientRecord;->paused:Z(灰名单,反射,允许) D/RenderScript HIDL Adaptation: IRenderScriptDevice::getService() D/RenderScript HIDL Adaptation: IRenderScriptDevice::getService()返回0x707c633940,HIDL加载成功 D/FA: 记录事件(FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, firebase_previous_class(_pc)=MainActivity, firebase_previous_id(_pi)=-5671580944013741474, firebase_screen_class(_sc)=AudienceNetworkActivity, firebase_screen_id(_si)=-5671580944013741473}] V/FA: 连接尝试已在进行中 V/FA: 连接尝试已在进行中 Activity已恢复,时间:267762028 E/libc: 访问属性"vendor.debug.rs.verbose"被拒绝 W/com.sp1.fling: type=1400 audit(0.0:458671): avc: 拒绝{读取} 进程名=46414E3A4153594E43202334 文件名为"u:object_r:vendor_default_prop:s0" 设备="tmpfs" ino=21096 安全上下文=u:r:untrusted_app:s0:c158,c257,c512,c768 目标安全上下文=u:object_r:vendor_default_prop:s0 类型=文件 宽容模式=0 E/Main: 插页广告已展示 D/FA: 已连接到远程服务 V/FA: 处理排队的服务任务:4 E/RecyclerView: 未绑定适配器;跳过布局 E/RecyclerView: 未绑定适配器;跳过布局
求助方向
- 从Logcat里的线索(比如WebView目录创建失败、主线程卡顿、隐藏API访问)来看,有没有可能是这些点触发了重载循环?
- 我的Fragment事务逻辑有没有Android 10特有的兼容性问题?比如
addToBackStack的使用会不会导致Activity重建? - 广告加载和展示会不会和Activity重载有联动?Logcat里看到插页广告展示前后有Activity生命周期的异常提示(
handleWindowVisibility: 无对应Activity的token)
希望各位大佬能给点排查方向或者解决方案,感激不尽!
内容的提问来源于stack exchange,提问作者Geometry Cognizance




