1.你的得物debug包在Android 14变卡了吗?|得物技术
你的debug包在Android 14变卡了吗?|得物技术
一、背景
在使用Android 时,源码突然发现debug包运行变卡顿,物源经过排查发现是得物Android 系统中debug包执行效率降低导致。
二、源码问题排查纪录
使用systrace、物源源码利器dutrace等工具进行常规排查,得物发现CPU空闲,源码主线程无明显阻塞,物源问题出在方法执行耗时。得物
在使用dutrace工具时发现异常现象,源码怀疑与解释执行方式有关。物源分析源码后,得物发现Android 版本使用了switch解释执行方式,源码而Android 、物源分页页面源码版本则使用mterp或nterp,怀疑是解释执行导致卡顿。
尝试修改debuggable属性,测试结果表明,与解释执行方式相关,但不是直接原因。接着怀疑是汇编源码chm下载native方法执行耗时问题,再次排查,发现问题主要出在debuggable属性的影响。
分析AndroidManifest文件和Process类,发现debuggable属性影响了runtimeFlags,导致系统启动时加载了额外的flag,这可能是问题源头。
尝试通过hook系统进程参数,迷你世界辅助源码发现移除DEBUG_JAVA_DEBUGGABLE后,debug包运行流畅,而加上此标志后,所有应用变卡,确认问题是由于DEBUG_JAVA_DEBUGGABLE导致的。
继续分析后发现,DeoptimizeBootImage方法将bootImage中的genromfs.c源码AOT代码转换为java可调试,导致方法执行切换到switch解释执行,这是问题的关键。
进一步分析发现,即使hook了CanRuntimeUseNterp方法,方法执行依然切换到switch解释执行,因此确认是bootImage中的方法在Android 中执行效率低下的问题。
验证问题为系统层面的问题,并通过社区反馈和补全问题报告,等待官方修复。
三、临时解决
尝试在等待修复的同时,通过修改代码逻辑,使用UpdateEntrypointsForDebuggable方法,根据规则重新设置方法执行方式,以绕过问题,结果发现流畅度提高。
进一步思考发现,虽然问题解决,但仍有部分卡顿现象,分析后决定在调用UpdateEntrypointsForDebuggable前将RuntimeDebugState设置为非debugable状态,调用后恢复为debugable状态,最终实现了流畅的debug包体验。
四、最后
在后续的分析中,发现高通工程师已确认Google将在Android 中修复此问题,对于海外版本的Android 设备,Google计划通过com.android.artapex模块更新解决。国内用户则需等待手机厂家主动合入修复。
总结,通过上述方法,临时解决了debug包在Android 中的卡顿问题,并提供了相关代码示例供其他开发者参考。