Android Framework
Android 是由 Google 开发的一种移动操作系统,广泛应用于智能手机、平板电脑、智能电视、智能手表、VR 设备等移动设备和嵌入式系统中。它是基于 Linux 内核的开源操作系统,允许开发者自由定制和开发应用程序。
并且Android 版本每年不断更新和升级,截止2023年,已推出 Android 13 正式版,每个版本都引入了新的功能和改进。同时,Android 生态系统非常庞大,吸引了大量开发者和厂商参与,使得 Android 成为全球智能手机市场的主导操作系统。由于其开放性和多样性,Android 为开发者和用户提供了丰富的选择和自由度,成为全球最受欢迎的移动操作系统之一。
本人从事 Android Framework 方面的开发,对 Framework 相关的知识及组件比较了解,所以本博客涉及的 Android 内容主要讲解 Framework 方面的知识多一些(特别是AMS对四大组件的管理、WindowManager及Input相关模块),同时也会涉及一些 APP 开发、Native 层、 Linux 内核及系统编译方面的内容。接下来是按不同模块对相关知识点的梳理,之后会不间断更新。
(1) Android 架构相关
| 架构及编译 | 简述 |
|---|---|
| Android系统架构 | 从内核驱动到应用级APP |
| AOSP-下载并编译源码 | 如何从Google中下载源码并编译,最后从模拟器启动 |
| Android编译命令与原理 | 常用的编译源码的命令及相关模块 |
| Android系统分区 | 传统分区结构、A/B分区结构以及SSI分区结构 |
| Android.bp语法 | Android.bp文件的基本语法及示例 |
| make全编译执行过程 | make编译的执行过程及相关文件分析 |
(2) 通信方式
| Binder通信 | 简述 |
|---|---|
| Binder-原理介绍 | Binder通信的大致过程 |
| Binder-深入源码 | 通过代码理解Binder的实现,了解其Native和Framework架构 |
| Binder-Native层代码实践 | 基于Native层来开发一个Binder进程间通信的应用实例 |
| Binder-Framework层代码实践 | 基于Framework层提供的接口实现一个Binder进程间通信的应用实例 |
| Binder-异常处理机制 | 了解跨进程的异常传输原理 |
| Message机制 | 简述 |
|---|---|
| 消息机制原理 | Android消息机制的作用、成员及实现方式 |
| 消息机制主要类 | Hanler、Looper、Message类及其使用方式 |
| 异步消息与同步屏障 | 什么是异步消息?如何使用?同步屏障原理以及它们的应用 |
(3) Android 日志架构与ADB
| 文章 | 简述 |
|---|---|
| ADB安装&原理 | 在Linux或Windows平台安装ADB,以及ADB工作原理 |
| ADB命令执行流程 | 终端输入一个ADB命令,在Android设备上的执行过程 |
| Android日志架构&解析 | Android的日志架构,以及如何解析日志 |
| Logcat命令使用方法 | adb logcat命令的使用方式与常用参数 |
| trace文件分析 | 分析ANR时,如何看懂输出的堆栈文件 |
(4) Android 四大组件系列
AMS 概述 — ActivityManagerService 的作用概述及启动流程
| Activity 系列 | 简述 |
|---|---|
| Activity 概述 | Activity相关类以及与启动Activity相关的概念说明 |
| Activity 生命周期 | 常见的Activity切换场景下,输出的关键日志 |
| Activity-onCreate() 过程 | Activity创建过程的代码讲解 |
| Activity-onRestart() 过程 | Activity执行onRestart()过程的代码讲解 |
| Activity-onDestroy() 过程 | Activity执行onDestroy()过程的代码讲解 |
| Broadcast 系列 | 简述 |
|---|---|
| Broadcast-概述 | 广播的常用概念及相关联说明 |
| Broadcast-Receiver注册过程 | 广播接收器在系统端的注册过程 |
| Broadcast-发送与处理过程 | 用户发送广播后,广播接收器时如何接收到广播的 |
| ContentProvider系列 | 简述 |
|---|---|
| ContentProvider-概述 | ContentProvider的作用、架构及常用类 |
| ContentProvider-发布过程 | ContentProvider伴随进程启动时的发布过程 |
| ContentProvider-访问过程 | 客户端访问ContentProvider数据时的调用过程及流程图 |
| ContentProvider-权限检查过程 | ContentProvider的各类权限的检测过程 |
| ContentProvider-getType(uri)调用过程 | getType(uri)方法的调用过程 |
| FileProvider-概述 | FileProvider的简单介绍及相关类 |
| FileProvider-访问过程 | 客户端访问FileProvider的过程 |
| FileProvider-权限检查过程 | 不同权限的客户端访问FileProvider的过程及结果 |
| Service系列 | 简述 |
|---|---|
| Service-概述 | Service相关概念及系统类介绍 |
| Service-生命周期 | startService()与bindService()的常见生命周期与相关注意事项 |
| Service-启动过程 | Service启动过程的详细代码讲解 |
| Android进程系列 | 简述 |
|---|---|
| Android进程概述 | Android进程管理架构、状态、级别等介绍 |
| Android进程启动过程 | Android进程的启动过程,包括system端、Zygote和APP端 |
| 四大组件拉起进程过程-待更新 | 四大组件如何拉起进程 |
(5) 稳定性系列
| 稳定性 | 简述 |
|---|---|
| ANR机制概述 | 为什么需要ANR机制?以及ANR的原理 |
| Input ANR原理 | 输入无响应的产生及处理过程 |
| Broadcast ANR原理 | 广播超时引发及处理过程 |
| Service ANR原理 | Service响应超时的产生及处理过程 |
| Provider 超时 | Provider发布超时过程 |
| Android内存泄漏原因&检测工具 | 什么是内存泄漏?如何检测内存泄漏?以及检测工具的使用方式 |
| Android常见内存泄漏总结 | 常见内存泄漏的原因、使用场景、相关案例以及解决方法 |
| Watchdog原理 | Watchdog的作用及原理 |
(6) WindowManager
| WindowManager模块 | 简述 |
|---|---|
| Window概述 | Activity、Window和View的区别,以及Window相关类的作用 |
| WMS启动过程 | 开机时WindowManagerService的创建及初始化关键过程 |
| 窗口层级概述 | 如何查看窗口层级?窗口层级如何调整? |
| Window层级树构建 | Android的窗口层级以及层级树的构建过程 |
| Window-创建到显示过程1 | Activity的创建过程中,Window类随Activity的创建过程 |
| Window-创建到显示过程2-待上传 | Window的Measure、Layout和Draw的过程 |
| Window-移除过程-待上传 | Window的消失过程 |
(7) Input模块
| Input模块 | 简述 |
|---|---|
| Input概述 | 了解Input事件的大致处理过程以及相关模块 |
| Input-底层事件分发概述-研究中 | 设备节点、事件类型等,触摸事件的底层数据结构 |
| InputReader-研究中 | InputReader根据设备类别解码输入事件,转换成事件(Event)后传给InputDispatcher |
| InputDispatcher-待上传 | 将InputReader传送过来的Events分发给合适的窗口,并监控ANR |
| APP事件分发流程 | 获取到Input事件后如何分发到APP中响应事件 |
(8) Framework其它相关模块
| PackageManager模块 | 简述 |
|---|---|
| PackageManagerService 概述 | PKMS模块的作用以及启动过程 |
| PackageManagerService 安装APK过程 | 安装APK的过程中,PKMS模块如何工作 |
| PackageManagerService 解析Intent-待更新 | 系统收到一个Intent请求后,PKMS如何解析该请求并找到目标组件 |
| 其它-待更新 | 简述 |
|---|---|
| SurfaceFlinger-概述 | SurfaceFlinger的作用,启动流程以及其它相关流程 |
| SystemUI | 锁屏、通知栏、状态栏等 |
| Settings | AOSP的Settings架构:SettingsIntelligence、SettingsProvider、Settings |
| Hook技术 |
设计模式
设计模式原则及分类 — 设计模式的六大原则及23种设计模式简介
设计模式是在软件开发过程中针对常见问题和场景提供的一种解决方案。它们是经过多年实践和总结得出的最佳实践,可以帮助开发人员解决复杂的设计问题,提高代码的可重用性、可维护性和灵活性。
以下是每种设计模式的简单说明,部分设计模式在日常工作中使用或遇到过多次,相关总结见具体文章,其它未总结的设计模式后续会陆续更新。
(1) 创建型模式
主要关注对象的创建过程,用于解决对象的实例化过程中可能存在的问题。
| 创建型模式 | 说明 |
|---|---|
| 工厂模式 Factory Method Pattern |
定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 |
| 工厂模式 Abstract Factory Pattern |
提供一个创建一系列相关或者相互依赖的接口,而无需指定它们具体的类。 |
| 建造者模式 Builder Pattern |
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 |
| 原型模式 Prototype Pattern |
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 |
| 单例模式 Singleton Pattern |
保证一个类仅有一个实例,并提供一个访问它的全局访问点。 |
(2) 结构型模式
主要关注对象之间的组合和关联关系,用于解决类和对象的组织方式和结构问题。
| 模式 | 说明 |
|---|---|
| 适配器模式 Adapter Pattern |
将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 |
| 桥接模式 Bridge Pattern |
将抽象部分与实际部分分离,使它们都可以独立的变化。 |
| 组合模式 Composite Pattern |
将对象组合成树形结构以表示“部分–整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。 |
| 装饰者模式 Decorator Pattern |
动态的给一个对象添加一些额外的职责。就增加功能来说,此模式比生成子类更为灵活。 |
| 外观模式 Facade Pattern |
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 |
| 享元模式 Flyweight Pattern |
以共享的方式高效的支持大量的细粒度的对象。 |
| 代理模式 Proxy Pattern |
为其他对象提供一种代理以控制对这个对象的访问。 |
(3) 行为型模式
主要关注对象之间的通信和交互方式,用于解决对象之间的合作和协作问题。
| 模式 | 说明 |
|---|---|
| 策略模式 Strategy Pattern |
定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响算法的客户。 |
| 模版模式 Template Pattern |
定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特点步骤。 |
| 观察者模式 Observer Pattern |
多个对象间存在一对多的关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其它对象的行为。 |
| 状态模式 State Pattern |
允许一个对象在其内部状态发生改变时改变其行为能力。 |
| 备忘录模式 Memento Pattern |
在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后回复它。 |
| 访问者模式 Visitor Pattern |
在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象。 |
| 职责链模式 Chain of Responsibility Pattern |
在该模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。 |
| 命令模式 Command Pattern |
将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 |
| 解释器模式 Interpreter Pattern |
描述了如何为简单的语言定义一个语法,如何在该语言中表示一个句子,以及如何解释这些句子。 |
| 迭代器模式 Iterator Pattern |
提供了一种方法顺序来访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 |
| 中介者模式 Mediator Pattern |
定义一个中介对象来封装系列对象之间的交互。终结者使各个对象不需要显示的相互调用 ,从而使其耦合性松散,而且可以独立的改变他们之间的交互。 |
| 备忘录模式 Memento Pattern |
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 |
Git使用
| Git | 简述 |
|---|---|
| Git 概述 | Git分布式版本控制系统的简单介绍,以及.git文件夹下相关文件的作用 |
| git config 命令 | 配置Git版本控制系统的配置选项。Git配置包括全局配置和仓库配置两种类型。 |
| git add 命令 | 用于将工作目录中的文件或修改添加到Git的暂存区(Staging Area) |
| git branch 命令 | 用于查看、创建、删除和管理Git仓库中的分支 |
| git checkout 命令 | 用于切换分支或还原工作目录中的文件到指定的状态 |
| git commit 命令 | 将暂存区(执行add后)文件提交到本地仓库,提交必须要有注释 |
| git fetch 命令 | 将远程仓库拉取到本地仓库 |
| git merge 命令 | 将一个分支的内容合并到当前分支中 |
| git pull 命令 | 从远程仓库拉取(下载)最新的代码并合并到当前分支,相当于:git fetch && git merge |
| git push 命令 | 将本地的代码推送(上传)到远程仓库,将本地分支的更新发送到远程代码库中。 |
| git rebase 命令 | 将一个分支的修改(提交)移动到另一个分支的最新状态上 |
| git remote 命令 | 用于管理与远程仓库的连接,可以查看、添加、重命名、删除以及设置远程仓库的连接 |
| git reset 命令 | 回退或重置到之前的状态,根据不同的分区有不同的参数 |