Android Framework层——App启动过程
1. 关于Android系统的启动
系统的启动过程非常复杂,这里只是简单的了解。 先上谷歌提供的架构分层图?
** 引导程序BootLoader进行初始化Linux内核->启动init进程->init进程fork出zygote进程(处于c++ framework层)->zygote进程fork出system_server进程(处于java framework层) **
-
system_server进程负责启动和管理整个java framwork层包含ActivityManagerService、PackageManagerService、WindowManagerService等服务
service的本质是Binder我们可以看ActivityManagerService的实现,是继承了Binder的子类Stub
public class ActivityManagerService extends IActivityManager.Stub
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback, ActivityManagerGlobalLock {}
- Zygote进程fork出的APP层的第一个进程是Launch进程,就是用户看到的桌面
- 所有的app进程都是由zygote进程fork的
2. APP的启动过程
- 当点击桌面app时,launch进程中的startActvity方法通过binder通信调用system_server进程管理的AMS中的startActivity,而AMS又继续调用ATMS(# ActivityTaskManagerService)的StartActivity方法进行真正的启动.
- system_server进程收到消息后向Zygote进程发送创建进程的请求(通过socket通信)
- Zygote进程fork出app进程,并执行ActivityThread的main方法
源码基于android API 31
public static void main(String[] args) {
//安装sysCall Native与Kernel之间有一层系统调用(SysCall)层
AndroidOs.install();
CloseGuard.setEnabled(false);
Environment.initForCurrentUser();
//获取用户空间的配置文件
final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);
//初始化每个进程(MediaServiceManager,TelphoneServiceManager)
initializeMainlineModules();
//初始化主线程looper
Looper.prepareMainLooper();
long startSeq = 0;
if (args != null) {
for (int i = args.length - 1; i >= 0; --i) {
if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) {
startSeq = Long.parseLong(
args[i].substring(PROC_START_SEQ_IDENT.length()));
}
}
}
//真正的主角
ActivityThread thread = new ActivityThread();
thread.attach(false, startSeq);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
- 从main方法中可以看到创建ActivityThread之后调用了thread.attach(false, startSeq)方法,并同时初始化ApplicationThread用于和AMS通信
- App进程,通过Binder向sytem_server进程发起attachApplication请求,这里实际上就是APP进程通过Binder调用sytem_server进程中AMS的attachApplication方法,AMS的attachApplication方法的作用是将ApplicationThread对象与AMS绑定
- system_server进程在收到attachApplication的请求,进行一些准备工作后,再通过binder IPC向App进程发送handleBindApplication请求(初始化Application并调用onCreate方法)和scheduleLaunchActivity请求(创建启动Activity)
- App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送BIND_APPLICATION和LAUNCH_ACTIVITY消息,这里注意的是AMS和主线程并不直接通信,而是AMS和主线程的内部类ApplicationThread通过Binder通信,ApplicationThread再和主线程通过Handler消息交互。
- 主线程在收到Message后,创建Application并调用onCreate方法,再通过反射机制创建目标Activity,并回调Activity.onCreate()等方法
- 到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染后显示APP主界面
资料分享
这里给大家分享一份腾讯总监整理的这份《Android Framework开发揭秘》总共将近20万字,通过经典Binder、Handler、AMS等面试题解析加深你对Android Framework框架层的理解,今天在这里拿出来分享给大家。
这份《Android Framework开发揭秘》【
100%免费获取
】,需要的朋友可以【点击这里】即可免费获取。
《Android Framework 开发揭秘》
第一章 系统启动流程分析
- 第一节 Android启动概览
- 第二节 init.rc解析
- 第三节 Zygote
- 第四节 面试题
第二章 Binder解析
- 第一节 宏观认识Binder
- 第二节binder的jni方法注册
- 第三节binder驱动
- 第四节 数据结构
- 第五节 启动service_manager
- 第六节获取service_manager
- 第七节 addService流程
- 第八节 Binder面试题全解析
第三章 Handler解析
- 第一节 源码分析
- 第二节 难点问题
- 第三节Handler常问面试题
第四章 AMS 解析
- 第一节 引言
- 第二节 Android架构
- 第三节 通信方式
- 第四节 系统启动系列
- 第五节 AMS
- 第六节 AMS 面试题解析
第五章 WMS解析
- 第一节Activity与Window相关概念
- 第二节 Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析
- 第三节Android窗口管理服务WindowManagerService对窗口的组织方式分析
- 第四节 Android窗口管理服务WindowManagerService对输入法窗口的管理分析
- 第五节 Android窗口管理服务WindowManagerService对壁纸窗口的管理分析…
第六章PKMS Android10.0 源码解读
- 第一节 前言 PKMS 是什么东西?
- 第二节 PKMS 概述信息
- 第三节 PKMS角色位置
- 第四节 PKMS 启动过程分析
- 第五节 APK的扫描
- 第七节 PMS之权限扫描
- 第八节 PackageManagerService大综合笔记
《Android Framework 精编内核解析》
这份《Android Framework 精编内核解析》内容涵盖:深入解析 Binde、深入解析 Handler 消息机制、Dalvik VM 进程系统、深入解析 WMS、PackageMS 启动五个章节,一共455页。
第一章 深入解析Binder
- Binder系列—开篇
- Binder Driver初探
- Binder Driver再探
- Binder 启动 ServiceManager
- 获取 ServiceManager
- 注册服务 (addService)
- 获取服务 (getService)
- framework 层分析
- 如何使用 Binder
- 如何使用 AIDL
- Binder 总结
- Binder 面试题全解析
第二章深入解析Handler消息机制
- 宏观理论分析与Message源码分析
- MessageQueue的源码分析
- Looper的源码分析
- handler的源码分析
- Handler机制实现原理总结
- Handler面试题全解析
第三章Dalvik VM进程系统
- Android系统启动-综述
- Init篇
- zygote篇
- SystemServer上篇
- SystemServer下篇
第四章深入解析WMS
- WMS概述
- WMS的诞生
第五章PackageMS启动
- PackageMS相关框架类
- PackageMS启动过程
最后
相信这两份资料,一定可以为大家在Framework的学习上提供强有力的帮助和支撑,快人一步成为真正的高级Android开发者。以上内容全都已打包整理好都是免费分享,【点击这里】即可免费获取。