skia 库Skia 库是一个外部库,代码位于 external/skia/下面,生成的库名称是 libskia.so。Skia 库负责 2 维图形的绘制,绘制的结果最终一般以位图的形式存放在存的一块缓冲区中。我们可以从它里面几个比较重要的类来了解它到底完成什么功能。使用 SkCanvas,可以将绘制(drawing)结果保存到一个设备如位图(bitmap)中,这些绘制操作包含一系列几何图形的绘制,如绘制点、线、矩形、多边形、椭圆和圆弧等几何图形。Canvas.cpp 调用了 skia 库的 API,有的调用仅仅是对 SkCanvas 的简单包裹。绘制的状态(State)封装在 Paint 类中,如绘制的线条粗细、线条颜色、区域如何填充、线条形状等。SkBitmap 是光栅位图,它包含高度和宽度两个整数以与格式(配置 config 规定),也可以通过 getAddr()猎取存储实际像素(pixel)块的地址。一副图形可以通过它的像素位图来保存,也可以通过保存它的绘制过程通过 SkPicture 保存起来,然后写到文件里,最后通过绘制过程恢复图形。另外,skia 也包括将 YUV 格式转变为 Jpg 的编码,见 YuvToJpegEncoder.cpp。Java 部分通过 JNI 调用 Skia 关系如下,包括但不限于下图中的四个类。库 libsurfaceflinger_client.so库 libsurfaceflinger_client.so 到应用程序中,也到 server 侧(主要因为 layer state管理和存控制块等类),因此,其大多数类运行在应用程序所在进程空间中,它通过 Binder与与进程 sufaceflinger 进行交互。它的代码位于 frameworks/base/libs/surfaceflinger_client 下面,SurfaceComposerClient/SurfaceControl如 JNI 层章节所述,在创建 SurfaceSession(Java)时,会创建SurfaceComposerClient 对象,并将 SurfaceComposerClient 对象指针保存到SurfaceSession(Java)的 mClient 中。我们来看下创建 SurfaceComposerClient 对象时还发生了什么?SurfaceComposerClient 继承自 RefBase,所以在第一次初始化时,会执行其重载的 onFirstRef。在 onFirstRef 中,会猎取 Composer Service,也就是SurfaceFlinger 在 client 侧的 binder—-ISurfaceComposer,接着使用它建立 client connection 连接(实际上是分配一个用于两侧通讯的共享存块),猎取ISurfaceComposerClient,最后创建 layer_state_t,保存窗口状态,用于两侧的窗口状态通讯。SurfaceComposerClient 可以加入到列表中由 Composer 来维护。SurfaceControl...