1.Android 14 HWUI 源码研究 View Canvas RenderThread ViewRootImpl skia
2.skia发展历史
3.Android开发——Skia引擎图像处理技术;为何在Android中占重要地位?
Android 14 HWUI 源码研究 View Canvas RenderThread ViewRootImpl skia
HUWUI是Android系统中负责应用可视化元素绘制的核心组件,其架构主要在C++层实现,从Java层接收View绘制信息,通过唯一的渲染线程使用skia技术完成渲染任务。整体上,从应用程序到UI线程,push sdk 源码再到渲染线程,形成了清晰的层级关系。
HUWUI的构建主要包括三个核心类,它们分别是:RecordingCanvas、Canvas、RenderNode、RenderProxy、RenderThread、CanvasContext、源码俱乐部IRenderPipeline。在Java层,主要涉及两类Canvas,RecordingCanvas用于记录绘制指令,Canvas则是直接用于渲染。RecordingCanvas在构造时创建,而Canvas在调用时创建。这两个类在C++层分别对应SkiaRecordingCanvas和SkiaCanvas,后者直接引用SkCanvas。
在全局循环中,UI线程与渲染线程之间的协同操作至关重要。具体流程包括:新创建Activity后,附着到对应的PhoneWindow,然后调用PhoneWindow的androidrfx源码setContentView方法,将View添加到DecorView作为子节点。接着,DecorView与ViewRootImpl对接,完成View的更新与渲染。整个过程包含了measure、layout和draw等复杂子流程。
渲染线程创建与核心对象紧密关联,主要包括RenderProxy、RenderThread和DrawFrameTask。RenderProxy负责Java层信息的衔接,RenderThread作为进程唯一的渲染线程,持有DrawFrameTask和CanvasContext,完成一帧的绘制任务。指令记录流程的fbxsdk源码核心在于使用C++层的RecordingCanvas将View属性和绘制信息记录到DisplayList中,进而完成指令的渲染。
Surface、ANativeWindow、EGLSurface的创建流程在ViewRootImpl的performTraversals函数中初始化。ReliableSurface的封装和EGL与Skia环境的创建主要在RenderThread的requireGlContext函数中实现。从源码分析,这一过程通常在三个地方调用。
View树与RenderNode树之间的协作关系明确,一个Application进程对应多个Activity,每个Activity与一个PhoneWindow绑定,PhoneWindow持有DecorView,DecorView对应一个ViewRootImpl,而ViewRootImpl与ThreadedRender模块对接。ThreadedRender与C++层的迭代源码RenderProxy一一对应,RenderProxy持有关键对象,如RenderThread、CanvasContext、DrawFrameTask等。RenderThread是单例模式,进程唯一,负责一帧绘制的逻辑。
在RenderPipeline模块中,关键操作包括makeCurrent、draw和swapBuffers。Native Canvas在这一过程中扮演了桥梁角色,接收Java API调用,而RecordingCanvas完成Op记录,最终DisplayListData存储这些Op。
skia的核心资源主要在三个使用场景中发挥作用,具体细节需深入分析,这些资源对于实现高效、稳定的渲染效果至关重要。
skia发展历史
自年Google购入Skia以来,这个项目一直保持着相对低调的姿态。转折点发生在年初,Skia的GL相关源代码首次公开,它成为了Google Android平台的关键图形引擎。随后,Google Chrome浏览器也接纳了Skia的技术,使其在浏览器渲染中发挥重要作用。随着Android和Chrome开源计划(Android的开源版本称为Chromium)的展开,Skia的原始源代码也随之公开,采用的是Apache License v2的许可协议,这与GPLv2有所不同。在Android和Chrome的源代码库中,都包含了对Skia的定制版本,如Chrome项目下的"chrome/trunk/src/skia",这些定制主要针对各自平台的需求,如Android通过Linux Framebuffer接口与系统集成,而Chrome在开发中的Linux版本则使用Gtk+。
值得注意的是,Skia本身并不直接处理底层环境的细节,如Linux Framebuffer或Gtk+的衔接,这就导致了Android和Chrome需要针对其各自的环境需求进行相应的代码修改,以确保系统的兼容性和流畅运行。这些定制版的Skia在各自的项目中扮演了不可或缺的角色,但原始的Skia项目本身并未涉及这些底层整合工作。[1]
Android开发——Skia引擎图像处理技术;为何在Android中占重要地位?
Skia,一款性能出众的2D图像绘制引擎,自年被谷歌收购,成为Android系统的2D渲染核心。它在图形转换、文字渲染、位图渲染方面表现出色,提供开发者友好的API。
在Android开发中,通过JNI调用Skia图形库实现Java 2D作图,Canvas作为2D概念,理解为系统提供的内存区域,实际上它是一套绘图API,真正的内存是Bitmap,Skia提供Bitmap对象。
绘制UI时,通过lock获取surface对应的数据buffer,作为Bitmap内存,unlockandpost通知Surfaceflinger显示。SkBitmap用于设置像素,SkCanvas执行写入操作,SkPaint相当于画笔,设置颜色、字体、文字大小、粗细、渐变等。
Skia还允许使用SkTypeface::CreateFromName创建字体,Skia遍历宏SK_FONT_FILE_PREFIX指定目录下的所有*.ttf字库文件并加载至内存。
简要介绍了Skia在Android开发中的作用,它作为图像渲染核心地位显著。深入学习Skia技术及Flutter进阶知识,可获取Flutter3.0学习手册和Android开发技术进阶资料。
Skia已成Android官方图像渲染引擎,因此Flutter无需内嵌引擎即可获得Skia支持。对于iOS平台,Skia作为渲染引擎替代Core Graphics/Core Animation/Core Text,导致Flutter iOS SDK打包的App包体积相对较大。