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

134 篇文章 7 订阅
12 篇文章 0 订阅

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 开发揭秘》

第一章 系统启动流程分析
第一节 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页。

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

第一章 深入解析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开发者。以上内容全都已打包整理好都是免费分享,扫一扫下方二维码添加助理小姐姐微信即可免费获取↓↓↓
请添加图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值