学Android必看的Framework内核解析干货,及Jetpack架构组件库

核心提示前言对于Android开发,干上几年后,都要进阶,或者直接转行了。如果你还在干Android,想要进阶 对Framework的了解是必不可少的过程,下面就开始进入今天的主题吧。我们知道,对于任何程序语言而言,入口一般都是main函数。那An

前言

对于Android开发,干上几年后,都要进阶,或者直接转行了。如果你还在干Android,想要进阶 对framework的了解是必不可少的过程,下面就开始进入今天的主题吧。

我们知道,对于任何程序语言而言,入口一般都是main函数。

那Android的程序入口在哪呢? 他的main函数是怎么启动起来的呢?

可能熟悉Android的同学,知道一个应用程序的入口在ActivityThread中,那有个问题,ActivityThread中的main函数是何时被谁被调用的呢?

将从本文中找到以上答案,如果已经熟悉了此过程的同学,可以在温习一下。

Android架构

Android 平台的基础是 Linux 内核。Android Runtime 依靠 Linux 内核来执行底层功能,例如线程和低层内存管理等。

而在Android Runtime之上就是我们经常接触的Java API framework层, 如下图是Android的系统架构图

今天的主题不是此架构图的各个部分解释,而是离应用层更近的framework层启动过程分析。

Android framework概述

如果我们这里抛开Android架构图,那狭义的framewrok主要包含哪些内容呢?

按我的理解,可以分为三个部分 服务端,客户端,和依赖Linux底层能力的驱动部分。

服务端

主要是ActivityManagerService, WindowManagerService,PackageM anerService

AMS 主要用于管理所有应用程序的Activity

WMS 管理各个窗口,隐藏,显示等

PMS 用来管理跟踪所有应用APK,安装,解析,控制权限等.

还有用来处理触摸消息的两个类KeyInputQueue和InputDispatchThread,一个用来读消息,一个用来分发消息.

客户端

主要包括ActivityThread,Activity,DecodeView及父类View,PhoneWindow,ViewRootImpl及内部类W等

ActivityThread主要用来和AMS通讯的客户端,Activity是我们编写应用比较熟悉的类

依赖Linux底层能力的驱动

主要是SurfaceFlingger和Binder驱动

每一个窗口都对应一个Surface,SF驱动的作用就是把每一个Surface显示到同一个屏幕上

Binder 内核驱动的作用,就是为上面的服务端和客户端,提供IPC通讯用的。

Zygote

系统中运行的第一个Dalvik虚拟机程序叫作zygote,该名称的意义是“一个卵”,,因为接下来的所有 Dalvik虚拟机进程都是通过这个“卵” 孵化出来的。

zygote进程中包含两个主要模块,分别如下:

Socket服务端。该 Socket服务端用于接收启动新的Dalvik进程的命令。

framework共享类及共享资源。当zygote进程启动后,会装载一些共享的类及资源,其中共享类是在preload-classes文件中被定义,共享资源是在preload-resources中被定义。因为zygote进程用于孵化出其他Dalvik进程,因此,这些类和资源装载后,新的Dalvik进程就不需要再装载这些类和资源了,这也就是所谓的共享。

zygote进程对应的具体程序是app_rocess,该程序存在于system/bin目录下,启动该程序的指令是 在 init.rc中进行配置的。

Zygote 有两个优秀的特点

每fork出的一个进程都是一个Dalvik虚拟机,独立的进程可以防止一个程序的崩溃导致所有程序都崩溃,这种虚拟机类似Java虚拟机,对于程序员来说,可以直接使用Java开发应用

zygote进程预先会装载共享类和共享资源,这些类及资源实际上就是SDK中定义的大部分类和资源。因此,当通过zygote孵化出新的进程后,新的APK进程只需要去装载A PK 自身包含的类和资源即可,这就有效地解决了多个APK共享framework资源的问题。

SystemServer

zygote孵化出的第一个Dalvik进程叫作SystemServer,SystemServer仅仅是该进程的别名,而该进程具体对应的程序依然是app_process,因为SystemServer是从app_process中孵化出来的。

SystemServer中创建了一个Socket客户端,并有AmS负责管理该客户端,之后所有的Dalvik进程都将通过该Socket客户端间接被启动。当需要启动新的APK进程时,AmS中会通过该Socket客户端向 zygote进程的Socket服务端发送一个启动命令,然 后 zygote会孵化出新的进程。 上面提到的服务端,AMS,PMS,WMS等都是在SystemServer中启动的.

Android framework 源头

操作系统的一般启动流程,分为三个步骤

开机通电后,加载bootloader程序

操作系统内核初始化

执行第一个应用程序

Android 系统是基于Linux 内核Kernel,前面Linux bootloader这里不做介绍,直接介绍操作系统内核初始化,在这个时候,它会加载init.rc文件.

一、Jetpack 介绍

1、什么是Jetpack

Google 官方解释:

Jetpack 是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。

Jetpack 是 Google 为解决 Android 开发碎片化,打造成熟健康生态圈提出的战略规划,是 Google 对 Android 未来提出的发展方向,同时它也是众多优秀 Android 组件的集合

2、为何使用 Android Jetpack

遵循最佳做法:Android Jetpack 组件采用最新的设计方法构建,具有向后兼容性,可以减少崩溃和内存泄露。

消除样板代码:Android Jetpack 可以管理各种繁琐的 Activity,以便您可以专注于打造出色的应用。

减少不一致:这些库可在各种 Android 版本和设备中以一致的方式运作,助您降低复杂性。

Jetpack 的优势:

Jetpack 拥有基于生命周期感知的能力,可以减少 NPE 崩溃、内存泄漏,为开发出健壮且流畅的程序提供强力保障;

Jetpack 可以消除大量重复样板式的代码,可以加速 Android 的开发进程,组件可搭配工作,也可单独使用,同时配合 Kotlin 语言特性能够显著提高工作效率;

统一开发模式,抛弃传统的 MVC, MVP;

3、JetPack 的构成

如上图:Jetpack 主要包括 4 个部分,分别是【Architecture:架构】、【UI:界面】、【behavior:行为】和【foundation:基础】。

Architecture,架构组件

目的:帮助开发者设计稳健、可测试且易维护的应用;

Lifecycle:具备宿主生命周期感知能力的组件 特性:持有组件生命周期状态的信息,并且允许其他对象观察此状态;

LiveData:新一代具备生命周期感知能力的数据订阅、分发组件 特性:支持共享资源、支持黏性事件的分发、不再需要手动处理生命周期、确保界面符合数据状态;

ViewModel:具备生命周期感知能力的数据存储组件 特性:页面因配置变更导致的重启,此时数据不丢失;可以实现跨页面的数据共享;

SavedState 架构组件原理解析 特性:因内存不足,电量不足导致页面被回收时可以搭配 ViewModel 实现数据存储与恢复;

Room:轻量级 orm 数据库,本质上是一个 SQLite 抽象层 特性:使用简单,通过注解的方式实现相关功能,编译时自动生成相关实现类

DataBinding:只是一种工具,解决的是 View 和数据之间的双向绑定 特性:支持数据与视图双向绑定、数据绑定空安全、减少模板代码、释放 Activity/Fragment 压力;

Paging: 列表分页组件,可以轻松完成分页预加载以达到无限滑动的效果 特性:巧妙融合 LiveData、提供多种数据源加载方式;不足之处:不支持列表数据增删改,列表添加 HeaderView,FooterView 定位不准确;

Navigation 组件原理分析:端内统一路由组件 特性:能够为 Activity,Fragment,Dialog,FloatWindow 提供统一的路由导航服务,可以传递参数,指定导航动画,还支持深度链接等主要能力;不足:十分依赖 xml 配置文件不利于组件化,模块化

WorkManager:新一代后台任务管理组件,service 能做的事情它都能做 特性:支持周期性任务调度、链式任务调度、丰富的任务约束条件、程序即便退出,依旧能保证任务的执行;

Foundationy,基础组件

目的:提供横向功能,例如向后兼容性、测试、安全、Kotlin 语言支持,并包括多个平台开发的组件;

Android KTX:优化了供 Kotlin 使用的 Jetpack 和 Android 平台 API,帮助开发者以更简洁、更愉悦、更惯用的方式使用 Kotlin 进行 Android 开发;

AppCompat:帮助较低版本的 Android 系统进行兼容;

Auto:开发 Android Auto 应用的组件,提供了适用于所有车辆的标准化界面和用户交互;

检测:从 AndroidStudio 中快速检测基于 Kotlin 或 Java 的代码;

多 Dex 处理:为具有多个 Dex 文件应用提供支持;

安全:安全的读写加密文件和共享偏好设置;

测试:用于单元和运行时界面测试的 Android 测试框架;

TV:构建可让用户在大屏幕上体验沉浸式内容的应用;

Wear OS:开发 Wear 应用的组件;

Behavior,行为组件

目的:帮助开发者的应用与标准 Android 服务相集成;

CameraX:帮助开发简化相机应用的开发工作,提供一致且易于使用的界面,适用于大多数 Android 设备,并可向后兼容至 Android 5.0;

DownloadManager:处理长时间运行的 HTP 下载的系统服务;

媒体和播放:用于媒体播放和路由的向后兼容 API;

通知:提供向后兼容的通知 API,支持 Wear 和 Auto;

权限:用于检查和请求应用权限的兼容性 API;

设置:创建交互式设置,建议使用 AndroidX Preference Library 库将用户可配置设置集成到应用中;

分享操作:可以更轻松地实现友好的用户分享操作;

切片:切片是一种 UI 模板,创建可在应用外部显示应用数据的灵活界面元素;

UI,界面组件

Animation and Transition:该框架包含用于常见效果的内置动画,并允许开发者创建自定义动画和生命周期回调;

Emoji Compatibility:即便用户没有更新 Android 系统也可以获取最新的表情符号;

Fragment:组件化界面的基本单位;

布局:用 XML 中声明 UI 元素或者在代码中实例化 UI 元素;

调色板:从调色板中提取出有用的信息;

注意:

上面的图之前在官网是存在的,现在官网已经找不到此图,只有jetpack架构组件的文档入口;

猜想google官方也是旨在强化Architecture架构组件,因为UI、Behavior、Foundation 这三部分大多是对已有内容的收集整理。

所以接下来的关注点主要是在Architecture 架构部分

二、Jetpack架构组件库

1、应用架构指南

官网推荐应用架构:

在项目中运用到的框架的搭建基本基于改图,运用到的jetpack组件库有ViewModel、LiveData、DataBinding;接下来逐一介绍他们的特性和用法。

2、ViewModel & LiveData

ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。

LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。

 
友情链接
鄂ICP备19019357号-22