概述
本文参考官网文档,记录一些可以用来做性能优化的工具,主要给出了一些工具的介绍,具体的使用还是需要参考官方文档,以及在实践项目中实际地加以应用,这样才能对工具的使用和性能优化有融会贯通的理解。本文会持续更新,参考官网文档的日期: 2020-11-26。
注:本文基于Android 10源码,为了文章的简洁性,引用源码的地方可能有所删减。
在更新 View 时我们常用到 requestLayout 和 invalidate 这两个方法,本文会根据源码分析一下这两个方法的区别和工作逻辑。在开始阅读之前可以先看看 Android-View绘制原理 和 Android-Choreographer工作原理 对 Android View 绘制流程有一个大概的理解。
注:本文基于Android 10源码,为了文章的简洁性,引用源码的地方可能有所删减。
在解析了 Android-SurfaceFlinger启动与工作流程 和 Android-Choreographer工作原理 后,明白了 Vsync 信号是怎么控制 SurfaceFlinger 进行合成 Layer 数据以及 Choreographer 是怎么控制开始绘制流程的,另外 Android-View绘制流程 中贴出了从 Choreographer.postCallback 接收到 Vsync 信号后调用 ViewRootImpl.performTraversals 开始 View 的 measure, layout, draw 流程的代码。接下来还有一个问题就是在 View 开始绘制后,即 View.draw 方法中绘制的数据是怎么流入 SurfaceFlinger 进程进行合成的。这里涉及到 Surface 的工作流程以及 BufferQueue 处理图形缓存区的逻辑,关于 BufferQueue 在后面会分析到与它相关的几个重要方法,不影响 Surface 的流程解析。
注:本文基于Android 10源码,为了文章的简洁性,引用源码的地方可能有所删减。
官方注释: SurfaceFlinger accepts buffers, composes buffers, and sends buffers to the display.The most common consumer of image streams is SurfaceFlinger, the system service that consumes the currently visible surfaces and composites them onto the display using information provided by the Window Manager. SurfaceFlinger is the only service that can modify the content of the display. SurfaceFlinger uses OpenGL and the Hardware Composer to compose a group of surfaces.
SurfaceFlinger 用来管理消费当前可见的 Surface, 所有被渲染的可见 Surface 都会被 SurfaceFlinger 通过 WindowManager 提供的信息合成(使用 OpenGL 和 HardWare Composer)提交到屏幕的后缓冲区,等待屏幕的下一个 Vsync 信号到来,再显示到屏幕上。SufaceFlinger 通过屏幕后缓冲区与屏幕建立联系,同时通过 Surface 与上层建立联系,起到了一个承上启下的作用。
Jetpack DataStore 是一个轻量级数据存储方案,它使用了 Kotlin 协程和 Flow 的特性,目前有两种方式:
注:本文基于Android 9源码,为了文章的简洁性,引用源码的地方可能有所删减。
SharedPreference 是 Android 提供的一种简单易用的轻量级存储方式,本质是一个以 key-value 方式保存数据的xml文件,存储路径为: /data/data/$pkg/shared_prefs
。但是 SharedPreference 存在着一些缺陷,如存在多进程的安全问题,以及 ANR(即使 apply 也可能会 ANR) 等。目前可供替换的方案有腾讯的第三方库–MMKV,以及官方的 Jetpack DataStore 组件。
在入门 Flutter 之前,先来看一下跨平台技术的分类:
Flutter 使用 Skia(被 Google 收购) 作为绘图引擎,Google 旗下很多产品都是用 Skia 绘制的,包括 Android,Android 内置了 Skia 引擎,而 IOS 没有(Flutter 打包会将 Skia 一起打进去)。
Flutter 使用 Dart 作为开发语言,Flutter 环境的配置可见Flutter中文网,其中还有示例工程。
注:本文基于Android 10源码,为了文章的简洁性,引用源码的地方可能有所删减。
今天在掘金上看到一篇解析为什么不能使用 Application Context 显示 Dialog
的文章,看完之后感觉作者忽略了一个很重要的对象–parentWindow,因此讲解的时候无法完整地把源码逻辑串起来。在参考了之前对Android-Window机制原理的解析,重新阅读了源码,决定借助这个问题记录一下关于 Android WMS 在 addWindow 的时候Token验证的逻辑,借此也可以说明为什么不能使用 Application Context 显示 Dialog。