Android Framework层——App启动过程浅析

1. 关于Android系统的启动

系统的启动过程非常复杂,这里只是简单的了解。 先上谷歌提供的架构分层图⬇

Android Framework层——App启动过程浅析_第1张图片

** 引导程序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 开发揭秘》

第一章 系统启动流程分析
第一节 Android启动概览
第二节 init.rc解析
第三节 Zygote
第四节 面试题Android Framework层——App启动过程浅析_第2张图片

第二章 Binder解析
第一节 宏观认识Binder
第二节binder的jni方法注册
第三节binder驱动
第四节 数据结构
第五节 启动service_manager
第六节获取service_manager
第七节 addService流程
第八节 Binder面试题全解析
Android Framework层——App启动过程浅析_第3张图片

第三章 Handler解析
第一节 源码分析
第二节 难点问题
第三节Handler常问面试题
第四章 AMS 解析
第一节 引言
第二节 Android架构
第三节 通信方式
第四节 系统启动系列
第五节 AMS
第六节 AMS 面试题解析
Android Framework层——App启动过程浅析_第4张图片

第五章 WMS解析
第一节Activity与Window相关概念
第二节 Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析
第三节Android窗口管理服务WindowManagerService对窗口的组织方式分析
第四节 Android窗口管理服务WindowManagerService对输入法窗口的管理分析
第五节 Android窗口管理服务WindowManagerService对壁纸窗口的管理分析…
第六章PKMS Android10.0 源码解读
第一节 前言 PKMS 是什么东西?
第二节 PKMS 概述信息
第三节 PKMS角色位置
第四节 PKMS 启动过程分析
第五节 APK的扫描
第七节 PMS之权限扫描
第八节 PackageManagerService大综合笔记Android Framework层——App启动过程浅析_第5张图片

《Android Framework 精编内核解析》

这份《Android Framework 精编内核解析》内容涵盖:深入解析 Binde、深入解析 Handler 消息机制、Dalvik VM 进程系统、深入解析 WMS、PackageMS 启动五个章节,一共455页。

《Android Framework开发揭秘》以及《Android Framework 精编内核解析》资料免费获取,扫一扫下方二维码添加助理小姐姐微信即可免费获取↓↓↓

第一章 深入解析Binder

  • Binder系列—开篇
  • Binder Driver初探
  • Binder Driver再探
  • Binder 启动 ServiceManager
  • 获取 ServiceManager
  • 注册服务 (addService)
  • 获取服务 (getService)
  • framework 层分析
  • 如何使用 Binder
  • 如何使用 AIDL
  • Binder 总结
  • Binder 面试题全解析

Android Framework层——App启动过程浅析_第6张图片

第二章深入解析Handler消息机制

  • 宏观理论分析与Message源码分析
  • MessageQueue的源码分析
  • Looper的源码分析
  • handler的源码分析
  • Handler机制实现原理总结
  • Handler面试题全解析

Android Framework层——App启动过程浅析_第7张图片

第三章Dalvik VM进程系统

  • Android系统启动-综述
  • Init篇
  • zygote篇
  • SystemServer上篇
  • SystemServer下篇

Android Framework层——App启动过程浅析_第8张图片

第四章深入解析WMS

  • WMS概述
  • WMS的诞生

Android Framework层——App启动过程浅析_第9张图片

第五章PackageMS启动

  • PackageMS相关框架类
  • PackageMS启动过程

Android Framework层——App启动过程浅析_第10张图片

相信这两份资料,一定可以为大家在Framework的学习上提供强有力的帮助和支撑,快人一步成为真正的高级Android开发者。以上内容全都已打包整理好都是免费分享,扫一扫下方二维码添加助理小姐姐微信即可免费获取↓↓↓
请添加图片描述

你可能感兴趣的:(Android,移动开发,Framework,android,面试,移动开发,程序人生,framework)