惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
IT之家
IT之家
博客园 - Franky
博客园_首页
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
博客园 - 三生石上(FineUI控件)
M
MIT News - Artificial intelligence
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
小众软件
小众软件
Jina AI
Jina AI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog RSS Feed

博客园 - 翻滚的咸鱼

Ops权限行为记录源码解析 TaskView方案框架原理 视频解码器问题 常用命令 扫光动效 引导记录 性能优化 View共享动效 常用脚本文件 Launcher 卡片框架多模块集成 Launcher 桌面源码笔记二 Launcher 桌面源码笔记一 氛围灯动态屏保取色方案二 氛围灯动态屏保取色方案一 自定义最近任务管理器 TV RecyclerView 焦点处理笔记 多类型适配器 多屏下字体自动取色 阻尼拉伸方案 图片区域点击处理 RecyclerView设置默认焦点跟多页面焦点抢占 TV RecyclerView 滑动后操作保持落焦在左侧第一个View Fragment翻盖动效 当个View下,使用Drawable入场退场动画
anr问题
翻滚的咸鱼 · 2025-10-11 · via 博客园 - 翻滚的咸鱼

内存信息
adb shell dumpsys meminfo com.test.launcher > d:/dumpsys_mem.txt

** MEMINFO in pid 5560 [com.test.wallpaper] **
                   Pss  Private  Private     Swap      Rss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty    Total     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------   ------
  Native Heap    53378    53284        0        0    56932    91708    55578    29736
  Dalvik Heap    78945    78328        0        0   102588   102485    77909    24576
 Dalvik Other     8741     7016        0        0    28276                           
        Stack     2108     2108        0        0     2124                           
       Ashmem      177        0        0        0      916                           
    Other dev      128        0      124        0      492                           
     .so mmap     4777      592       88        0    60192                           
    .jar mmap     1065        0        0        0    34904                           
    .apk mmap    18763       20    18016        0    20916                           
    .ttf mmap      182        0        0        0     1224                           
    .dex mmap      380        0      380        0      380                           
   Other mmap    10959     6032     4848        0    12472                           
      Unknown      715      680        0        0     1560                           
        TOTAL   180318   148060    23456        0   322976   194193   133487    54312

View Code

Pss是进程实际占用的物理内存大小,Rss是进程在物理内存中实际映射的总大小(包括代码段(.so/.jar)、缓存页等非匿名内存)

另外Offscreen Layers:下如果出现多个无法回收的surfaceview表示有泄露,可以多次进入退出测试,在达到三四个时系统会自动回收一次,如果没回收需要处理泄露问题

image

heapdump.hprof

可以直接拖进AS中

当碰到 ActivityTaskManager: START u0 {flg=0x10000000 cmp=com.test/com.test.activity.TestActivity} from uid 1000 pid -1

发现pid等于-1,由于是taskview启动,所以需要进一步查找pid信息

Line 130094: 09-08 11:47:36.379 1247 3323 E ActivityTaskManager: Starting window is not removed, kill it : com.zeekr.carlauncher3d
Line 130740: 09-08 11:47:36.503 1247 3323 I ActivityManager: Killing 3253:com.test/1000 (adj 0): stop com.test due to from pid 1247
Line 130741: 09-08 11:47:36.503 1247 3323 I am_kill : [0,3253,com.test,0,stop com.test due to from pid 1247]

image

很显然是system_server进程杀死的

不排除人为(使用adb force-stop),adb 执行命令时 的 pid 是0 或者null,所以这里排除adb命令,是系统层调用干掉的

当系统进入高负载状态‌,可能触发系统保护机制‌,进程被杀后内存立马恢复

如果pid是其它进程,就需要排查该进程原因,是否自己异常导致的把其它进程也给同时结束了

比如自己进程crash了,可以看到pid就是自己杀死的

cpu暂用可以直接使用命令查看

adb shell top -p 8971 -u u0_a179

问题:monkey测试18H,test.screensaver发生了18次anr

首先从anr in|am_anr|anr of中找到相关时间点,可以得知anr的发生时间

image

然后根据eventTime找到起始节点,问题是主线程(pid=19698)触摸事件无响应导致

image

看到触发点在42秒,Waited 5000ms,从37秒开始排查应用进程下有无异常

整体看下来,只有一个图片加载的警告,只是警告理论上可以排除,但是不能保证没有关系

image

继续跟进,找到下面日志,可以看出,该警告是加载png图片时抛出

03-06 09:09:38.239 19698 20294 V DiskLruCacheWrapper: Get: Obtained: 1d28ba4768adb441e4bd86b10b4b8e4d68ad885855e5e2c2caceb5685601db36 for for Key: ResourceCacheKey{sourceKey=ObjectKey{object=android.resource://test.screensaver/drawable/mask_right}, signature=com.bumptech.glide.signature.AndroidResourceSignature@17028f, width=600, height=1000, decodedResourceClass=class android.graphics.Bitmap, transformation='com.bumptech.glide.load.resource.bitmap.CenterCrop@dc40790e', options=Options{values={Option{key='com.bumptech.glide.load.resource.bitmap.Downsampler.DownsampleStrategy'}=com.bumptech.glide.load.resource.bitmap.DownsampleStrategy$CenterOutside@7c7c491}}}

03-06 09:09:38.293 19698 20294 V DecodeJob: Retrieved data in 43.594479, load key: EngineKey{model=2131231180, width=600, height=1000, resourceClass=class android.graphics.Bitmap, transcodeClass=class android.graphics.Bitmap, signature=com.bumptech.glide.signature.AndroidResourceSignature@17028f, hashCode=1881417398, transformations={class android.graphics.Bitmap=com.bumptech.glide.load.resource.bitmap.CenterCrop@dc40790e, class android.graphics.drawable.Drawable=com.bumptech.glide.load.resource.bitmap.DrawableTransformation@dc40790e, class com.bumptech.glide.load.resource.gif.GifDrawable=com.bumptech.glide.load.resource.gif.GifDrawableTransformation@dc40790e, class android.graphics.drawable.BitmapDrawable=com.bumptech.glide.load.resource.bitmap.DrawableTransformation@dc40790e}, options=Options{values={Option{key='com.bumptech.glide.load.resource.bitmap.Downsampler.DownsampleStrategy'}=com.bumptech.glide.load.resource.bitmap.DownsampleStrategy$CenterOutside@7c7c491}}}, data: java.nio.DirectByteBuffer[pos=0 lim=134580 cap=134580], cache key: ObjectKey{object=android.resource://test.screensaver/drawable/mask_right}, fetcher: com.bumptech.glide.load.model.ByteBufferFileLoader$ByteBufferFetcher@d4638af, thread: glide-disk-cache-thread-0

得知是本地资源图片,然后看具体代码,发现是使用glide加载,主线程无耗时操作,基本可以排除原因,接下来看其它信息

image

主线程中看到,有四个重要日志,首先排除第一条,只是一个加载提示,接着是两个接口方法打印,这个接口是跨进程调用,所以存在anr的风险

如果跨进程调用api,对方反应很慢,会导致主线程卡住,从代码中得知,该方法是onCreate时调用,并且三方接口已经打印了log反馈,说明正常响应,可以排除

接下来剩下最后一个syncPreviewFontColor,看代码,此方法无耗时操作,只是简单的监听

@Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = super.onCreateView(inflater, container, savedInstanceState);
        syncPreviewFontColor();
        return view;
    }

fun syncPreviewFontColor(screen: ScreenPreviewType) {
        context.display?.displayId?.let {
            syncKey?.let { LiveEventBus.get<String>(it).removeObserver(observer) }
            syncKey = FontColorPickManager.getPreviewObserverId(it, screen)
        }
        LogUtil.d(TAG, "syncPreviewFontColor syncKey=$syncKey")
        observerSyncState()
    }

    private fun observerSyncState() {
        if (!isAttachedToWindow) {
            return
        }
        syncKey?.let {
            LiveEventBus.get<String>(it).removeObserver(observer)
            LiveEventBus.get<String>(it).observeStickyForever(observer)
        }
    }

syncPreviewFontColor

因为是在BaseFragment中的onCreateView方法打印,所以进一步排查,create还执行了什么方法

最后找到是在继承BaseFragment的类中onCreateView下执行了binding.backgroundImg.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.icon_preview_bg_exc))
该图片3200x2000,会导致主线程卡顿

解决方案可以预加载,或者glide异步

【台架】【双屏】前排MTBF测试test.screensaver出现4次anr

从anr文件中发现主线程相关堆栈

Subject: Input dispatching timed out (screensaver-input-monitor2 (server) is not responding. Waited 5000ms for MotionEvent(deviceId=3, eventTime=21745533833000, source=0x00001002, displayId=2, action=DOWN, actionButton=0x00000000, flags=0x00000000, metaState=0x00200000, buttonState=0x00000000, classification=NONE, edgeFlags=0x00000000, xPrecision=1.0, yPrecision=1.0, xCursorPosition=nan, yCursorPosition=nan, pointers=[0: (1551.0, 1014.0)]), policyFlags=0x62000000)

"main" prio=5 tid=1 TimedWaiting
  | group="main" sCount=1 ucsCount=0 flags=1 obj=0x71f530b8 self=0xb400007ad29fd7b0
  | sysTid=3657 nice=-10 cgrp=foreground sched=0/0 handle=0x7c1e6804f8
  | state=S schedstat=( 90562249445 461616992973 844688 ) utm=5729 stm=3326 core=0 HZ=100
  | stack=0x7fee846000-0x7fee848000 stackSize=8188KB
  | held mutexes=
  at java.lang.Object.wait(Native method)
  - waiting on <0x09cb65b2> (a com.google.android.exoplayer2.PlayerMessage)
  at java.lang.Object.wait(Object.java:442)
  at com.google.android.exoplayer2.PlayerMessage.blockUntilDelivered(PlayerMessage.java:359)
  - locked <0x09cb65b2> (a com.google.android.exoplayer2.PlayerMessage)
  at com.google.android.exoplayer2.ExoPlayerImpl.setVideoOutputInternal(ExoPlayerImpl.java:2545)
  at com.google.android.exoplayer2.ExoPlayerImpl.access$1700(ExoPlayerImpl.java:109)
  at com.google.android.exoplayer2.ExoPlayerImpl$ComponentListener.surfaceDestroyed(ExoPlayerImpl.java:2959)
  at android.view.SurfaceView.notifySurfaceDestroyed(SurfaceView.java:1981)
  at android.view.SurfaceView.updateSurface(SurfaceView.java:1157)
  at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:327)
  at android.view.View.dispatchWindowVisibilityChanged(View.java:14988)
  at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1619)
  at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1619)
  at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1619)
  ... repeated 9 times
  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2696)
  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2184)
  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8826)
  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1037)
  at android.view.Choreographer.doCallbacks(Choreographer.java:845)
  at android.view.Choreographer.doFrame(Choreographer.java:780)
  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1022)
  at android.os.Handler.handleCallback(Handler.java:938)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  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(Native method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

anr-log

从堆栈看出,是视频播放器的blockUntilDelivered方法导致anr,在从android log中确认关键信息

Line 145895: 03-10 20:33:44.491  3657  3657 V SurfaceControl: hide sc=Surface(name=Surface(name=3fa0504 InputMethod)/@0xf48d22 - animation-leash of insets_animation)/@0x4d4fce4, mNativeObject: 0xb400007a12a4a8f0
Line 148454: 03-10 20:33:45.015  1672  1802 I wm_destroy_activity: [0,268338759,1277,test.screensaver/.activity.PreviewAllActivity,finish-imm:idle]
Line 148541: 03-10 20:33:45.027  3657  3657 D SurfaceControl: transaction mNativeObject: 0xb400007a12ad33f0 call setRelativeLayer sc: Surface(name=Background for SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0x9e44a99, relativeTo: Surface(name=test.screensaver/test.screensaver.activity.PreviewAllActivity)/@0x44915e, z: -2147483648
Line 148542: 03-10 20:33:45.027  3657  3657 D SurfaceControl: transaction mNativeObject: 0xb400007a12ad33f0 call setRelativeLayer sc: Surface(name=SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0x8ea420c, relativeTo: Surface(name=test.screensaver/test.screensaver.activity.PreviewAllActivity)/@0x44915e, z: -2
Line 148543: 03-10 20:33:45.027  3657  3657 V SurfaceControl: show sc=Surface(name=SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0x8ea420c, transaction nativeObject: 0xb400007a12a32b90
Line 148544: 03-10 20:33:45.027  3657  3657 V SurfaceControl: show sc=Surface(name=Background for SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0x9e44a99, transaction nativeObject: 0xb400007a12ad33f0
Line 171136: 03-10 20:33:45.911  3657  3657 D SurfaceControl: transaction mNativeObject: 0xb400007a12abe030 call setRelativeLayer sc: Surface(name=Background for SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xb44656a, relativeTo: Surface(name=test.screensaver/test.screensaver.activity.PreviewAllActivity)/@0x44915e, z: -2147483648
Line 171145: 03-10 20:33:45.911  3657  3657 D SurfaceControl: transaction mNativeObject: 0xb400007a12abe030 call setRelativeLayer sc: Surface(name=SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xd01aa5b, relativeTo: Surface(name=test.screensaver/test.screensaver.activity.PreviewAllActivity)/@0x44915e, z: -2
Line 171150: 03-10 20:33:45.911  3657  3657 V SurfaceControl: show sc=Surface(name=SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xd01aa5b, transaction nativeObject: 0xb400007a12a309d0
Line 171157: 03-10 20:33:45.911  3657  3657 V SurfaceControl: show sc=Surface(name=Background for SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xb44656a, transaction nativeObject: 0xb400007a12abe030
Line 189154: 03-10 20:33:46.884  3657  3657 D SurfaceControl: transaction mNativeObject: 0xb400007a12acf730 call setRelativeLayer sc: Surface(name=Background for SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xd9bb3d1, relativeTo: Surface(name=test.screensaver/test.screensaver.activity.PreviewAllActivity)/@0x44915e, z: -2147483648
Line 189156: 03-10 20:33:46.884  3657  3657 D SurfaceControl: transaction mNativeObject: 0xb400007a12acf730 call setRelativeLayer sc: Surface(name=SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xbb6e36, relativeTo: Surface(name=test.screensaver/test.screensaver.activity.PreviewAllActivity)/@0x44915e, z: -2
Line 189157: 03-10 20:33:46.884  3657  3657 V SurfaceControl: show sc=Surface(name=SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xbb6e36, transaction nativeObject: 0xb400007a12a42e50
Line 189158: 03-10 20:33:46.884  3657  3657 V SurfaceControl: show sc=Surface(name=Background for SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xd9bb3d1, transaction nativeObject: 0xb400007a12acf730
Line 232548: 03-10 20:33:48.887  3657  3657 I [testScreenSaver]_20260302.f5bb920f_20260302_PlayerManager: onPlayerErrorChanged error -->com.google.android.exoplayer2.ExoPlaybackException: Unexpected runtime error
Line 232549: 03-10 20:33:48.887  3657  3657 I [testScreenSaver]_20260302.f5bb920f_20260302_PreImage: onPlayerErrorChanged error -->com.google.android.exoplayer2.ExoPlaybackException: Unexpected runtime error
Line 232550: 03-10 20:33:48.887  3657  3657 I [testScreenSaver]_20260302.f5bb920f_20260302_PlayerManager: onPlayerError error -->com.google.android.exoplayer2.ExoPlaybackException: Unexpected runtime error
Line 232551: 03-10 20:33:48.887  3657  3657 I [testScreenSaver]_20260302.f5bb920f_20260302_PreImage: onPlayerError error -->com.google.android.exoplayer2.ExoPlaybackException: Unexpected runtime error
Line 232552: 03-10 20:33:48.887  3657  3657 I PlayerManager: ReleasePlayer called 13560731 player com.google.android.exoplayer2.ExoPlayerImpl@b3b5f0c
Line 232552: 03-10 20:33:48.887  3657  3657 I PlayerManager: ReleasePlayer called 13560731 player com.google.android.exoplayer2.ExoPlayerImpl@b3b5f0c
Line 232553: 03-10 20:33:48.887  3657  3657 I ExoPlayerImpl: Release b3b5f0c [ExoPlayerLib/2.18.5] [test_dhu_sa8295, msmnile_gvmq for arm64, Qualcomm, 32] [goog.exo.core, goog.exo.exoplayer, goog.exo.decoder, goog.exo.datasource, goog.exo.extractor]
Line 234605: 03-10 20:33:49.007  3657  3657 I PlayerManager: release called size = 4
Line 235516: 03-10 20:33:49.065  3657  3657 D SurfaceControl: transaction mNativeObject: 0xb400007a12a40db0 call setRelativeLayer sc: Surface(name=Background for SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xf269137, relativeTo: Surface(name=test.screensaver/test.screensaver.activity.PreviewAllActivity)/@0x44915e, z: -2147483648
Line 235517: 03-10 20:33:49.065  3657  3657 D SurfaceControl: transaction mNativeObject: 0xb400007a12a40db0 call setRelativeLayer sc: Surface(name=SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xb34c6a4, relativeTo: Surface(name=test.screensaver/test.screensaver.activity.PreviewAllActivity)/@0x44915e, z: -2
Line 235518: 03-10 20:33:49.066  3657  3657 V SurfaceControl: show sc=Surface(name=SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xb34c6a4, transaction nativeObject: 0xb400007a12a92b30
Line 235519: 03-10 20:33:49.066  3657  3657 V SurfaceControl: show sc=Surface(name=Background for SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xf269137, transaction nativeObject: 0xb400007a12a40db0
Line 252744: 03-10 20:33:49.962  3657  3657 D SurfaceControl: transaction mNativeObject: 0xb400007a12a48df0 call setRelativeLayer sc: Surface(name=Background for SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xd6bc0d, relativeTo: Surface(name=test.screensaver/test.screensaver.activity.PreviewAllActivity)/@0x44915e, z: -2147483648
Line 252745: 03-10 20:33:49.962  3657  3657 D SurfaceControl: transaction mNativeObject: 0xb400007a12a48df0 call setRelativeLayer sc: Surface(name=SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0x7c837c2, relativeTo: Surface(name=test.screensaver/test.screensaver.activity.PreviewAllActivity)/@0x44915e, z: -2
Line 252746: 03-10 20:33:49.962  3657  3657 V SurfaceControl: show sc=Surface(name=SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0x7c837c2, transaction nativeObject: 0xb400007a12a73f90
Line 252747: 03-10 20:33:49.963  3657  3657 V SurfaceControl: show sc=Surface(name=Background for SurfaceView[test.screensaver/test.screensaver.activity.PreviewAllActivity])/@0xd6bc0d, transaction nativeObject: 0xb400007a12a48df0
Line 254237: 03-10 20:33:50.059  1672  1988 I WindowManager: ANR in gesture monitor owned by pid:3657.  Reason: screensaver-input-monitor2 (server) is not responding. Waited 5000ms for MotionEvent(deviceId=3, eventTime=21745533833000, source=0x00001002, displayId=2, action=DOWN, actionButton=0x00000000, flags=0x00000000, metaState=0x00200000, buttonState=0x00000000, classification=NONE, edgeFlags=0x00000000, xPrecision=1.0, yPrecision=1.0, xCursorPosition=nan, yCursorPosition=nan, pointers=[0: (1551.0, 1014.0)]), policyFlags=0x62000000
Line 256033: 03-10 20:33:50.184  1672  1988 I WindowManager: ANR in Window{839eaa u0 test.screensaver/test.screensaver.activity.PsdMainActivity}. Reason:839eaa test.screensaver/test.screensaver.activity.PsdMainActivity (server) is not responding. Waited 5135ms for MotionEvent(deviceId=3, eventTime=21745533833000, source=0x00001002, displayId=2, action=DOWN, actionButton=0x00000000, flags=0x00000000, metaState=0x00200000, buttonState=0x00000000, classification=NONE, edgeFlags=0x00000000, xPrecision=1.0, yPrecision=1.0, xCursorPosition=nan, yCursorPosition=nan, pointers=[0: (1551.0, 1014.0)]), policyFlags=0x62000000

android-log

看到destroy时打印了ReleasePlayer called,执行了clear方法

fun releasePlayer(surfaceView: SurfaceView, listener: Listener) {
        val key = System.identityHashCode(surfaceView).toString()
        val player = playerMutableMap[key]
        Log.i(TAG, "ReleasePlayer called $key player $player")
        if (player != null) {
            player.stop()
            player.clearVideoSurfaceView(surfaceView)
            player.removeListener(innerListener)
            player.removeListener(listener)
            player.release()
            playerMutableMap.remove(key)
            Log.i(TAG, "release called size = ${playerMutableMap.size}")
        }
    }

releasePlayer

可以看到执行链路,clearVideoSurfaceView方法最终会执行到blockUntilDelivered

private void setVideoOutputInternal(@Nullable Object videoOutput) {
    // Note: We don't turn this method into a no-op if the output is being replaced with itself so
    // as to ensure onRenderedFirstFrame callbacks are still called in this case.
    List<PlayerMessage> messages = new ArrayList<>();
    for (Renderer renderer : renderers) {
      if (renderer.getTrackType() == TRACK_TYPE_VIDEO) {
        messages.add(
            createMessageInternal(renderer)
                .setType(MSG_SET_VIDEO_OUTPUT)
                .setPayload(videoOutput)
                .send());
      }
    }
    boolean messageDeliveryTimedOut = false;
    if (this.videoOutput != null && this.videoOutput != videoOutput) {
      // We're replacing an output. Block to ensure that this output will not be accessed by the
      // renderers after this method returns.
      try {
        for (PlayerMessage message : messages) {
          message.blockUntilDelivered(detachSurfaceTimeoutMs);
        }
      } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
      } catch (TimeoutException e) {
        messageDeliveryTimedOut = true;
      }
      if (this.videoOutput == ownedSurface) {
        // We're replacing a surface that we are responsible for releasing.
        ownedSurface.release();
        ownedSurface = null;
      }
    }
    this.videoOutput = videoOutput;
    if (messageDeliveryTimedOut) {
      stopInternal(
          /* reset= */ false,
          ExoPlaybackException.createForUnexpected(
              new ExoTimeoutException(ExoTimeoutException.TIMEOUT_OPERATION_DETACH_SURFACE),
              PlaybackException.ERROR_CODE_TIMEOUT));
    }
  }

View Code

解决方案,需要优化destroy的耗时操作,clear方法不能放到异步,否则会有内存泄露,需要升级exoplayer sdk版本

Monkey持续运行12小时test.screensaver发生ANR【偶现】

Subject: Input dispatching timed out (Application does not have a focused window)

----- pid 3201 at 2026-05-15 03:59:12.777352973+0800 -----
Cmd line: test.screensaver

"main" prio=5 tid=1 Native
  | group="main" sCount=1 ucsCount=0 flags=1 obj=0x71a8c488 self=0xb400006fb0aeebe0
  | sysTid=3201 nice=0 cgrp=top-app sched=0/0 handle=0x70fb2284f8
  | state=S schedstat=( 580490155839 859821617632 3769177 ) utm=36536 stm=21512 core=7 HZ=100
  | stack=0x7fdacde000-0x7fdace0000 stackSize=8188KB
  | held mutexes=
  native: #00 pc 000000000009e498  /apex/com.android.runtime/lib64/bionic/libc.so (__epoll_pwait+8)
  native: #01 pc 0000000000016628  /system/lib64/libutils.so (android::Looper::pollInner(int)+180)
  native: #02 pc 000000000001650c  /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+112)
  native: #03 pc 0000000000157c48  /system/lib64/libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long, int)+44)
  at android.os.MessageQueue.nativePollOnce(Native method)
  at android.os.MessageQueue.next(MessageQueue.java:335)
  at android.os.Looper.loopOnce(Looper.java:161)
  at android.os.Looper.loop(Looper.java:288)
  at android.app.ActivityThread.main(ActivityThread.java:7870)
  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:1008)

trace

可以看到主线程空闲,属于无效trace,在对应android log进一步分析

05-15 03:59:12.309  1666  1828 W InputDispatcher: Waiting because no window has focus but ActivityRecord{5ed73ad u0 test.screen/.activity.PreviewAllActivity t1223} may eventually add a window when it finishes starting up. Will wait for 5000ms
05-15 03:59:12.309  1666 12302 I am_anr  : [0,3201,test.screen,550026821,Input dispatching timed out (Application does not have a focused window)]

05-15 10:51:42.606  1666 12302 E ActivityManager: ANR in com.zeekr.screensaver (test.screensaver/.activity.PreviewAllActivity)
05-15 10:51:42.606  1666 12302 E ActivityManager: PID: 3201
05-15 10:51:42.606  1666 12302 E ActivityManager: Reason: Input dispatching timed out (Application does not have a focused window)
05-15 10:51:42.606  1666 12302 E ActivityManager: Parent: test.screen/.activity.PreviewAllActivity

android-log

image

player为null,不会触发任何耗时操作,并且该activity中stop没有耗时操作,属于应用窗口没有焦点导致系统无法输入

Monkey下导致的系统异常