0%

概述

本文参考官网文档,记录一些可以用来做性能优化的工具,主要给出了一些工具的介绍,具体的使用还是需要参考官方文档,以及在实践项目中实际地加以应用,这样才能对工具的使用和性能优化有融会贯通的理解。本文会持续更新,参考官网文档的日期: 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 与上层建立联系,起到了一个承上启下的作用。

阅读全文 »

概述

注:本文基于Android 9源码,为了文章的简洁性,引用源码的地方可能有所删减。

SharedPreference 是 Android 提供的一种简单易用的轻量级存储方式,本质是一个以 key-value 方式保存数据的xml文件,存储路径为: /data/data/$pkg/shared_prefs。但是 SharedPreference 存在着一些缺陷,如存在多进程的安全问题,以及 ANR(即使 apply 也可能会 ANR) 等。目前可供替换的方案有腾讯的第三方库–MMKV,以及官方的 Jetpack DataStore 组件。

阅读全文 »

概述

在入门 Flutter 之前,先来看一下跨平台技术的分类:

  • WebView:主要依赖于WebView,使用前端技术开发,学习成本低,但功能受限,性能体验很差,如小程序。
  • 原生渲染:使用 JavaScript 作为编程语言,通过中间层转化为原生控件来渲染界面,如 React Native, Weex。
  • 绘图引擎渲染:通过调用Skia等绘图引擎进行页面渲染,不依赖于原生控件,如 Flutter, Unity。

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。

阅读全文 »

概述

SPI(Service Provider Interface, 服务提供方接口),服务通常是指一个接口或者一个抽象类,服务提供方是对这个接口或者抽象类的具体实现,由第三方来实现接口提供具体的服务。通过解耦服务与其具体实现类,使得程序的可扩展性大大增强,甚至可插拔。基于服务的注册与发现机制,服务提供者向系统注册服务,服务使用者通过查找发现服务,可以达到服务的提供与使用的分离。

可以将 SPI 应用到 Android 组件化中,很少直接使用 SPI,不过可基于它来扩展其功能,简化使用步骤。

阅读全文 »

概述

Android 图形系统是 Android 中一个非常重要的子系统,它涉及到许多相当复杂的模块,如 SurfaceFlinger, Choreographer, HardWare Composer 等平时开发中基本上不会直接接触的概念。前后基于 Android 10 版本陆陆续续阅读了图形系统各个组成模块的源码,结合网上的一些博客,心中对 Android 的图形系统构成以及各个组件之间的工作流程有了一个整体的理解,这篇文章特意将整个图形系统做一个总结,可能还有所疏漏,后续发现了再接着补全。

阅读全文 »