1.Android Systrace 基础知识(8)-基于 Choreographer 的源码渲染机制详解
2.Perfettoå·¥å
·ä½¿ç¨ç®ä»
3.Android 基于 Choreographer 的渲染机制详解
4.你的debug包在Android 14变卡了吗?|得物技术
Android Systrace 基础知识(8)-基于 Choreographer 的渲染机制详解
Android Systrace 系列文章的第八篇深入探讨了Choreographer在渲染机制中的关键作用。这个工具旨在帮助开发者更好地理解Android Framework的解析运行流程,尤其是源码与帧绘制和主线程交互的细节。Choreographer的解析主要职责是配合Vsync,为应用提供稳定的源码消息处理时机,确保.6ms(Hz)屏幕刷新时,解析快站平台源码每一帧的源码绘制操作都在正确的时间执行,从而实现流畅的解析用户体验。
在Android的源码早期版本中,没有Vsync机制,解析导致帧率不稳定,源码而引入Vsync后,解析结合TripleBuffer和Choreographer,源码系统通过调整Vsync周期,解析确保了fps的源码稳定帧率。Choreographer在这个过程中充当了桥梁角色,它与MessageQueue、Looper、SurfaceFlinger等紧密协作,确保了App的u盘感染源码稳定运行。
通过Systrace和MethodTrace的分析,我们可以观察到Choreographer的工作流程,例如在滑动桌面场景中,从Vsync到来到开始绘制,Choreographer如何组织和管理这些操作。源码解析部分揭示了Choreographer的初始化过程、FrameHandler的使用,以及如何通过FrameCallback和FrameInfo来记录帧绘制信息。
对于性能监控,Choreographer提供了FrameCallback接口,允许开发者监测App的性能,如TinyDancer就利用了这个接口计算FPS。此外,Choreographer还与APM工具结合,比如BlockCanary和SurfaceFlinger的PageFlip机制,用于深入性能分析。
最后,厂商们也利用Choreographer进行优化,如移动事件响应提前、荒野行动锁头源码后台动画控制、帧绘制策略调整等,以适应不同屏幕刷新率和性能需求。本文通过实例和源码分析,帮助开发者更直观地理解Choreographer在Android渲染机制中的重要角色。
Perfettoå·¥å ·ä½¿ç¨ç®ä»
Perfettoå·¥å ·æ¯Androidä¸ä¸ä»£å ¨æ°çç»ä¸çtraceæ¶éååææ¡æ¶ï¼å¯ä»¥æåå¹³å°åappçtraceä¿¡æ¯ï¼æ¯ç¨æ¥å代systraceçï¼ä½systraceç±äºåå²åå ä¹è¿ä¼ä¸ç´åå¨ï¼å¹¶ä¸Perfettoæåçtraceæ件ä¹å¯ä»¥åæ ·è½¬æ¢æsystraceè§å¾ï¼å¦æä¹ æ¯ç¨systraceçï¼å¯ä»¥ç¨Perfetto UIç"Open with legacy UI"转æ¢æsystraceè§å¾æ¥çï¼Perfettoçå 个主è¦ç¹ç¹å¦ä¸æ示ï¼
å¨è®²å ·ä½çæ¶éæµç¨ä¹åï¼å¯ä»¥å çä¸ä¸å®çæ´ä½æ¡æ¶å¾ï¼å®çè¿ç¨ç»æï¼å ¶ä¸æå 个éè¦çè¿ç¨éè¦è¯´æä¸ä¸ï¼
ææ¶è¿æ²¡æå»ç 究å®çæºç ï¼æ以è¿æ æ³å°ä¸é¢ç两ç§è§å¾ä¸ä¸å¯¹åºèµ·æ¥ï¼è¿éååºå¦ä¸ç§è§å¾ï¼åªæ¯æ³è®©å¤§å®¶å¢å 对è¿ä¸ªå·¥å ·çæ´æ·±ä¸æ¥äºè§£ï¼ä¸é¢è¯´äºé¤äºæ åçtracepointsä¹å¤ï¼Perfettoè¿å¯ä»¥æä¾å¾å¥½çå¯æ©å±æ§ï¼è¿éæ们å çä¸ä¸æ åçtracepointsæåªäºï¼å¦ä¸å¾æ示ï¼ç¸å¯¹äºä»¥åçsystraceæ¥è¯´ï¼æ们åç°Perfettoè¿æ¯å¯ä»¥æä¾ä¸äºå ¶ä»çåè½çï¼ä¾å¦å®å¯ä»¥ç´æ¥æåevent logäºï¼è¿æVirtual memory eventsççã
å¨PixelåPixel2æºåä¸é¢ï¼tracedåtraced_probesè¿ä¸¤ä¸ªè¿ç¨æ¯é»è®¤å¼å¯çï¼ä½æ¯å¨å ¶ä»æºåä¸é¢ï¼å¯è½éè¦æ§è¡å¦ä¸å½ä»¤æä¼å¼å¯è¿ä¸¤ä¸ªè¿ç¨ï¼å¼å¯è¿ä¸¤ä¸ªè¿ç¨ä¹åï¼æè½æ£å¸¸æåtraceä¿¡æ¯ï¼å¼å¯çæ¹å¼ä¹å¾æ¹ä¾¿ï¼åªè¦è®¾ç½®ä¸ä¸ªå±æ§å°±å¯äºã
æ§è¡ä¸é¢çå½ä»¤åï¼å¦æçå°å¦ä¸ç±»ä¼¼çLogï¼é£ä¹å°±è¯´æå¼å¯æåäºï¼ä¹å¯ä»¥ç´æ¥psçæ没æè¿ä¸¤ä¸ªè¿ç¨ã
å¼å¯äºå®æ¤è¿ç¨ä¹åï¼å°±å¯ä»¥æ§è¡perfettoå½ä»¤è¡å·¥å ·äºï¼è¿ä¸ªå½ä»¤è¡çå·¥å ·ç使ç¨æ¹å¼,å ·ä½åæ°çå«ä¹å°±ä¸ä¸ä¸ä»ç»äºï¼ç´æ¥çcomment就好ã
å ¶ä¸ --outæ¯ç¨æ¥æå®traceè¾åºæ件ï¼--config æ¯ç¨æ¥æå®é ç½®çï¼ä¹å°±æ¯åæå¤é¿æ¶é´ï¼é´éå¤ä¹ æå åæ°æ®ååæ件ï¼æååªäºtracepointsççï¼è¿ä¸ªconfigæ件å 容ï¼æ们å¯ä»¥èªå·±æå¨ç¼åï¼ä¹å¯ä»¥ç¨Perfetto UIç½ç«çæï¼å¦å¤å¨Perfettoéé¢é»è®¤éæäºä¸ä¸ªtesté ç½®ï¼ä½ å¯ä»¥ä½¿ç¨å¦ä¸å½ä»¤æåä¸ä¸ªä½¿ç¨test configçtraceæ件ã
æåå®åï¼æ/data/misc/perfetto-traces/traceæ件å 容pullåºæ¥ï¼ç¶å使ç¨Perfetto UIç½ç«æå¼å³å¯ï¼å¦ä¸æ示ï¼
ç®åææ¹ä¾¿çé ç½®æ件çææ¹å¼æ¯ä½¿ç¨ ui.perfetto.dev Perfetto UIæ¥å¸®å©çæï¼ç¹å¼Perfetto UIç"Record new trace"ä¹åï¼ä½ ä¼çå°æå¾å¤çé ç½®çé¢ï¼å¦ä»¥ä¸å 个å¾æ示ï¼
Android 基于 Choreographer 的渲染机制详解
Photo by Peter Thomas on Unsplash
本文深入探讨了 Android 开发者可能不常接触,但在框架渲染流程中至关重要的 Choreographer 类。我们将从引入背景、简介、源码解析、与核心组件的关系以及手机厂商优化思路等方面进行详述,旨在帮助开发者深入了解程序每一帧运行的原理,以及提升对关键组件如 Message、Handler、Looper、MessageQueue、Measure、Layout、Draw 的php财务模块源码理解。
了解 Choreographer 有助于开发者掌握渲染机制的核心,从而优化应用性能。Choreographer 在渲染链路中作为连接器,确保 App 以稳定的帧率运行,减少帧率波动带来的不适感。通过结合 Systrace 和 MethodTrace 工具,开发者能更直观地理解这一机制。
在演进过程中,引入了 Vsync、TripleBuffer 和 Choreographer 机制,以提供稳定的帧率输出,使得软件层和硬件层同步工作。Choreographer 的引入,配合 Vsync 信号周期调整,控制了每一帧的绘制操作时机,确保 App 在 Hz 刷新率下稳定运行。
Choreographer 承担着渲染流程中的重要角色,通过与 SurfaceFlinger、Vsync 和 TripleBuffer 的中枢箱体指标源码协同工作,确保了以 fps 的帧率稳定输出画面。这一机制不仅提高了用户体验,还为开发者提供了优化应用性能的途径。
Choreographer 的初始化、单例初始化、构造函数等核心部分,以及 FrameHandler、Choreographer 初始化链等细节,均涉及到关键的代码逻辑和流程。通过源码解析,我们能深入理解 Choreographer 如何在 Android 主线程中组织和管理每一帧的绘制过程。
Choreographer 处理一帧的逻辑主要围绕 doFrame 函数展开,包括计算掉帧、记录帧绘制信息、执行回调等关键步骤。通过 Systrace 观察这一流程,可以清晰地了解 Choreographer 如何组织和优化每一帧的渲染。
Choreographer 与 APM(应用性能监控)工具相结合,提供了丰富的性能监控接口,如 FrameCallback 和 FrameInfo,帮助开发者监控和优化应用性能。此外,Choreographer 还与 MessageQueue 和 Looper 等核心组件紧密关联,通过自定义 MessageLogging 等特性,增强了性能监控和优化能力。
针对移动事件优化、后台动画优化、帧绘制优化、应用启动优化以及高帧率优化,手机厂商通过修改源码,实现了对 Choreographer 的定制化增强,提高了系统性能和用户体验。这些优化策略展示了 Choreographer 在现代移动设备中的重要作用。
总之,Choreographer 是 Android 渲染链路中的关键组件,它通过稳定的帧率输出、优化的渲染流程以及与核心组件的高效协同,为开发者提供了强大的工具,以提升应用性能和用户体验。深入理解 Choreographer,将有助于开发者在实际应用中实现性能优化,实现更流畅、高效的移动应用。
你的debug包在Android 变卡了吗?|得物技术
一、背景
在使用Android 时,突然发现debug包运行变卡顿,经过排查发现是Android 系统中debug包执行效率降低导致。
二、问题排查纪录
使用systrace、dutrace等工具进行常规排查,发现CPU空闲,主线程无明显阻塞,问题出在方法执行耗时。
在使用dutrace工具时发现异常现象,怀疑与解释执行方式有关。分析源码后,发现Android 版本使用了switch解释执行方式,而Android 、版本则使用mterp或nterp,怀疑是解释执行导致卡顿。
尝试修改debuggable属性,测试结果表明,与解释执行方式相关,但不是直接原因。接着怀疑是native方法执行耗时问题,再次排查,发现问题主要出在debuggable属性的影响。
分析AndroidManifest文件和Process类,发现debuggable属性影响了runtimeFlags,导致系统启动时加载了额外的flag,这可能是问题源头。
尝试通过hook系统进程参数,发现移除DEBUG_JAVA_DEBUGGABLE后,debug包运行流畅,而加上此标志后,所有应用变卡,确认问题是由于DEBUG_JAVA_DEBUGGABLE导致的。
继续分析后发现,DeoptimizeBootImage方法将bootImage中的AOT代码转换为java可调试,导致方法执行切换到switch解释执行,这是问题的关键。
进一步分析发现,即使hook了CanRuntimeUseNterp方法,方法执行依然切换到switch解释执行,因此确认是bootImage中的方法在Android 中执行效率低下的问题。
验证问题为系统层面的问题,并通过社区反馈和补全问题报告,等待官方修复。
三、临时解决
尝试在等待修复的同时,通过修改代码逻辑,使用UpdateEntrypointsForDebuggable方法,根据规则重新设置方法执行方式,以绕过问题,结果发现流畅度提高。
进一步思考发现,虽然问题解决,但仍有部分卡顿现象,分析后决定在调用UpdateEntrypointsForDebuggable前将RuntimeDebugState设置为非debugable状态,调用后恢复为debugable状态,最终实现了流畅的debug包体验。
四、最后
在后续的分析中,发现高通工程师已确认Google将在Android 中修复此问题,对于海外版本的Android 设备,Google计划通过com.android.artapex模块更新解决。国内用户则需等待手机厂家主动合入修复。
总结,通过上述方法,临时解决了debug包在Android 中的卡顿问题,并提供了相关代码示例供其他开发者参考。