继上一篇Android系统启动流程分析之安装应用文章接着分析系统启动应用的过程.

Android系统的启动流程简要分析里已经介绍了SystemServer在main方法里创建了一个线程ServerThread,并调用initAndLoop方法加载各种服务.

ActivityManagerService(Ams)就是在initAndLoop方法里加载的.那么,看下initAndLoop方法里关于AMS的核心代码.

1.context = ActivityManagerService.main(factoryTest);


2.ActivityManagerService.setSystemProcess();


3.ActivityManagerService.installSystemProviders();


4.ActivityManagerService.self().setWindowManager(wm);


5.ActivityManagerService.self().systemReady


一步一步进行分析.

1.context = ActivityManagerService.main(factoryTest);

这行代码是启动ActivityManagerService,获取上下文context,进入AMS的main方法看一下

public static final Context main(int factoryTest) {AThread thr = new AThread();thr.start();synchronized (thr) {while (thr.mService == null) {try {//线程等待activitymanagerservice初始化完成thr.wait();} catch (InterruptedException e) {}}}ActivityManagerService m = thr.mService;mSelf = m;//启动一个主线程ActivityThread at = ActivityThread.systemMain();mSystemThread = at;//获取上下文contextContext context = at.getSystemContext();context.setTheme(android.R.style.Theme_Holo);m.mContext = context;m.mFactoryTest = factoryTest;m.mIntentFirewall = new IntentFirewall(m.new IntentFirewallInterface());//新建一个activity堆栈管理辅助类m.mStackSupervisor = new ActivityStackSupervisor(m, context, thr.mLooper);m.mBatteryStatsService.publish(context);m.mUsageStatsService.publish(context);m.mAppOpsService.publish(context);synchronized (thr) {thr.mReady = true;//activitymanagerservice启动完成thr.notifyAll();}m.startRunning(null, null, null, null);return context;}

1.1

在mian方法里会创建一个线程AThread,AThread用来初始化Looper,AThread等待ActivityManagerService初始化完成后把自己的成员变量mService赋值给ActivityManagerService自身.

1.2 

启动一个主线程ActivityThread,ActivityThread是所有Application运行的主线程,

1.3

获取上下文context,最终是调用ContextImpl的createSystemContext方法返回的,context本质是ContextImpl的实例

1.4

等ActivityManagerService启动完成,调用m.startRunning()方法运行,在startRunning方法内部调用systemReady()方法.做系统准备工作.

public final void startRunning(String pkg, String cls, String action, String data) {synchronized (this) {if (mStartRunning) {return;}mStartRunning = true;mTopComponent = pkg != null && cls != null ? new ComponentName(pkg, cls) : null;//如果传入的action为空那么赋值Intent.ACTION_MAIN给mTopActionmTopAction = action != null ? action : Intent.ACTION_MAIN;mTopData = data;if (!mSystemReady) {return;}}systemReady(null);}

这个mTopAction就是后面要启动第一个Activity,也就是Launcher的Action.

1.4.1

在systemReady方法调用mStackSupervisor.resumeTopActivitiesLocked方法.

public void systemReady(final Runnable goingCallback){............mStackSupervisor.resumeTopActivitiesLocked();......}    

1.4.2

最终经过层层跳转会回到ActivityManagerService的startHomeActivityLocked方法.

boolean startHomeActivityLocked(int userId) {............//获取intent信息Intent intent = getHomeIntent();ActivityInfo aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);if (aInfo != null) {intent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, aInfo.name));// Don't do this if the home app is currently being// instrumented.aInfo = new ActivityInfo(aInfo);aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId);ProcessRecord app = getProcessRecordLocked(aInfo.processName, aInfo.applicationInfo.uid, true);if (app == null || app.instrumentationClass == null) {intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);//启动主程序,也就是LaucnhermStackSupervisor.startHomeActivity(intent, aInfo);}}return true;}

1.4.3

通过getHomeIntent方法获取Intent信息,看下代码

Intent getHomeIntent() {Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);intent.setComponent(mTopComponent);if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {//设置Categoryintent.addCategory(Intent.CATEGORY_HOME);}return intent;}

给intent设置了Category,这个mTopAction就是前面设置的.

那么在这里Intent指定Action为action.MAIN,category为category.HOME.这正是启动Launcher的配置

<intent-filter ><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.HOME" /></intent-filter>

1.4.4

回到1.4.2,调用如下代码启动Launcher

//启动主程序,也就是Laucnher
mStackSupervisor.startHomeActivity(intent, aInfo);

2.ActivityManagerService.setSystemProcess()

这个方法是用来注册一些服务和获取、绑定进程信息的.

public static void setSystemProcess() {try {ActivityManagerService m = mSelf;//注册ActivityManagerServiceServiceManager.addService(Context.ACTIVITY_SERVICE, m, true);//注册进程统计服务ServiceManager.addService(ProcessStats.SERVICE_NAME, m.mProcessStats);//注册内存服务ServiceManager.addService("meminfo", new MemBinder(m));//注册图像处理服务ServiceManager.addService("gfxinfo", new GraphicsBinder(m));//注册数据库服务ServiceManager.addService("dbinfo", new DbBinder(m));//注册cpu服务if (MONITOR_CPU_USAGE) {ServiceManager.addService("cpuinfo", new CpuBinder(m));}//注册权限服务ServiceManager.addService("permission", new PermissionController(m));//获取应用信息ApplicationInfo info = mSelf.mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS);//绑定系统应用信息,mSystemThread.installSystemApplicationInfo(info);synchronized (mSelf) {//获取ProcessRecord实例,ProcessRecord是描述进程信息的ProcessRecord app = mSelf.newProcessRecordLocked(info, info.processName, false);app.persistent = true;app.pid = MY_PID;app.maxAdj = ProcessList.SYSTEM_ADJ;//调用ProcessStatsService开始记录process的状态app.makeActive(mSystemThread.getApplicationThread(), mSelf.mProcessStats);//把进程名,uid,ProcessRecord实例存到mProcessNames数组中mSelf.mProcessNames.put(app.processName, app.uid, app);synchronized (mSelf.mPidsSelfLocked) {mSelf.mPidsSelfLocked.put(app.pid, app);}mSelf.updateLruProcessLocked(app, false, null);mSelf.updateOomAdjLocked();}} catch (PackageManager.NameNotFoundException e) {throw new RuntimeException("Unable to find android system package", e);}}

2.1

在ServiceManager里注册一些服务,AMS、进程统计服务、内存服务、图像处理服务、数据库服务、CPU服务、权限服务

2.2

通过PackageManager获取应用信息

//获取应用信息
ApplicationInfo info = mSelf.mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS);

获取包名为android的apk的信息,对应的就是framework-res.apk.

2.3

调用以下代码将获取到的应用信息绑定到mSystemThread的context上.

mSystemThread.installSystemApplicationInfo(info);

2.4

ActivityManagerService调用newProcessRecordLocked方法创建一个ProcessRecord对象,ProcessRecord纪录了一个进程的信息,这里是指systemServer进程

3.ActivityManagerService.installSystemProviders();

这个方法是启动SettingsProvider的.SettingsProvider相当于系统的一个数据库.

4.ActivityManagerService.self().setWindowManager(wm);

这个方法是用来设置窗口管理器的.

5.ActivityManagerService.self().systemReady

这个方法是用来做系统准备工作的.

ActivityManagerService.self().systemReady(new Runnable() {public void run() {Slog.i(TAG, "Making services ready");try {// 开始监视native是否crashActivityManagerService.self().startObservingNativeCrashes();} catch (Throwable e) {reportWtf("observing native crashes", e);}if (!headless) {//启动SystemUistartSystemUi(contextF);}try {if (mountServiceF != null)mountServiceF.systemReady();} catch (Throwable e) {reportWtf("making Mount Service ready", e);}try {if (batteryF != null)batteryF.systemReady();} catch (Throwable e) {reportWtf("making Battery Service ready", e);}try {if (networkManagementF != null)networkManagementF.systemReady();} catch (Throwable e) {reportWtf("making Network Managment Service ready", e);}............

5.1

开始监视native是否crash

5.2

启动SystemUi

5.3

做各种服务的准备工作,比如挂载管理服务、电脑管理服务、网络连接管理服务.

结束语:按照上述5大步来就可以慢慢理清启动应用的流程了.具体细节你们可以自己去探索.

Android系统启动流程分析之启动应用相关推荐

  1. Android系统启动流程分析之安装应用

    2016六月 21 原 Android系统启动流程分析之安装应用 分类:Android系统源码研究 (295)  (0)  举报  收藏 跟随上一篇博客Android系统的启动流程简要分析继续分析an ...

  2. Android系统启动流程之-----activity启动流程

    前言 对于从事最上层的应用开发者来说,很多人只知道activity的启动是从ActivityThread开始的,并不知道frameworks具体的调用流程.今天我们就从点击launcher图标开始具体 ...

  3. 详解 Android 系统启动流程

    系统启动流程大致分以下五步: Loader(加载引导程序Boot Loader) Kernel(Linux内核层) Native(init进程) Framework(Zygote进程/SystemSe ...

  4. Android 7.0系统启动流程分析

    随着Android版本的升级,aosp项目中的代码也有了些变化,本文基于Android 7.0分析Android系统启动流程.当我们按下电源键后,整个Android设备大体经过了一下过程:  今天我们 ...

  5. Android系统启动流程—— init进程zygote进程SystemServer进程启动流程

    原文地址:https://blog.csdn.net/qq_30993595/article/details/82714409 Android系统启动流程 Android系统启动过程往细了说可以分为5 ...

  6. 从源码解析-Android系统启动流程概述 init进程zygote进程SystemServer进程启动流程

    Android系统启动流程 启动流程 Loader Kernel Native Framework Application init进程 启动 rc文件规则 Actions Commands Serv ...

  7. 【SemiDrive源码分析】【X9芯片启动流程】09 - X9平台系统启动流程分析

    [SemiDrive源码分析][X9芯片启动流程]09 - X9平台系统启动流程分析 一.X9 芯片介绍 二.OSPI1_ONLY boot (0000)启动方式(Nor + eMMC) 2.1 Se ...

  8. Android系统启动流程(四)Launcher进程启动过程解析(附带面试题)

    前面我们分析了init进程,zygote进程,SystemServer进程,本篇的Launcher是系统启动流程的最后一个进程. 1 Launcher概述 Launcher进程是一个系统的应用程序,位 ...

  9. Android系统启动流程(四)Launcher启动过程与系统启动流程

    相关文章 Android系统架构与系统源码目录 Android系统启动流程(一)解析init进程启动过程 Android系统启动流程(二)解析Zygote进程启动过程 Android系统启动流程(三) ...

  10. Android系统启动流程 -- bootloader

    Android系统启动流程 -- bootloader   BootLoader:在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行.可以初始化硬件设备.建立内存空间映射图,从而将系 ...

最新文章

  1. 懒人必备 |通过爬虫 筛选以及查看CSDN 满足相应积分的资源列表 简单好用
  2. 自定义View实现图片的绘制、旋转、缩放
  3. mysql创建数据库时候同时创建表空间_MySQL 创建InnoDB表空间_编程学问网
  4. 给写新疆开放互联网一周纪念
  5. 主流平台应用与游戏的编程语言/工具(图)
  6. 深入浅出VC++串口编程--基于Win32 API
  7. modis数据产品行列号以及数据行列号
  8. java如何制作简单的数组_【数据结构与算法】Java制作一个简单数组类
  9. MATLAB绘图函数plot详解
  10. Java版本中最好用的网易云音乐、qq音乐api请求工具,你还在忙于如何使用java调音乐api?来看下这里的实现
  11. 周奕与共享软件(转)
  12. js 改变匹配到的字符串的颜色 — replace
  13. 产品经理学习笔记2 长尾理论
  14. Zigbee学习(一)架构及入网
  15. 【报告分享】2020年短视频及电商直播趋势报告-飞瓜数据(附下载)
  16. cmd命令行进入D盘的方法
  17. You-get 几乎万能的媒体内容下载工具
  18. 《互联网信贷风险与大数据》读书笔记(六)
  19. Java 计算两个日期相减并转换成月份
  20. C语言对浮点数变量小数点后两位的四舍五入

热门文章

  1. 矩阵的乘法(python、matlab、excel的不同实现方法)
  2. win11任务栏某些情况下不能自动隐藏问题初探
  3. k2p php服务器,网件R6800与斐讯K2P之间的mu-mimo测试
  4. 外媒再掀热议!快看《2019Q3区块链矿业研究报告》外媒怎么说 | TokenInsight
  5. 凯恩帝绝对坐标清零_凯恩帝100T数控车床怎么把加工数量时间清零
  6. 笛卡尔积生成商品SKU
  7. Java实习生的标准是什么
  8. Linux Ruby安装
  9. 箱线图Boxplot-统计学解读
  10. 水声通信中适用的调制技术及分析(FSK、PSK、DPSK)