You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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: 未绑定适配器;跳过布局

求助方向

  1. 从Logcat里的线索(比如WebView目录创建失败、主线程卡顿、隐藏API访问)来看,有没有可能是这些点触发了重载循环?
  2. 我的Fragment事务逻辑有没有Android 10特有的兼容性问题?比如addToBackStack的使用会不会导致Activity重建?
  3. 广告加载和展示会不会和Activity重载有联动?Logcat里看到插页广告展示前后有Activity生命周期的异常提示(handleWindowVisibility: 无对应Activity的token

希望各位大佬能给点排查方向或者解决方案,感激不尽!


内容的提问来源于stack exchange,提问作者Geometry Cognizance

火山引擎 最新活动