Android面试题之ActivityManagerService的启动流程

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 本文探讨了Android系统的SystemServer启动过程,包括创建SystemContext、引导服务、启动各类核心服务以及AMS的启动和初始化。AMS负责管理activity、广播队列、provider等,并设置SystemProcess,安装系统Provider。当AMS调用SystemReady时,系统UI准备启动,启动Launcher。文中还对比了init、zygote和system_server进程的角色。最后推荐了两本关于Android内核剖析的书籍:柯元旦教授的《Android内核剖析》和罗升阳的《Android系统源代码情景分析》。关注公众号AntDream获取更多内容。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

SystemServer启动

  1. 创建SystemContex 用于加载系统相关的资源,比如theme,android命名空间下的资源等
  2. 创建引导服务,安装器Installer服务, AMS就属于引导服务,还有电源管理服务PMS
  3. 启动核心服务和其他服务,总共得有80多个以上
  4. AMS启动也分为几个阶段,类似生命周期

AMS启动和初始化

  1. SystemServer通过startService创建Lifecycle对象,
  2. Lifecycle里构造方法里通过new创建AMS
  3. AMS 会创建“android.ui”线程、创建ActiveServices管理activity、创建ActivityStackSupervisor对象管理activity栈
  4. AMS会创建前台广播和后台广播队列、provider的Map等
  5. 电量统计服务、进程相关服务
  6. VrConroller虚拟现实相关
  7. mActivityConroller
  8. RecentTask,最近的任务列表
  9. ClientLifeCycleManager API28之前是没有,用来控制activity的生命周期
  10. watchDog守护进程(继承自Thread是一个线程)
  11. 移除所有的应用进程(AMS刚刚启动),启动电池服务
12.setSystemProcess

mActivityManagerService.setSystemProcess 设置SystemServer,添加了各种服务:

  • permission权限服务、内存服务meminfo、进程统计服务procstats、进程服务processinfo、数据库服务等
  • oomAdj服务,跟杀进程有关
13.安装系统相关的Provider
  • 安装Provider
  • 系统设置相关的监听,字体相关的监听,开发者选项相关监听
  1. 调用WMS的main方法创建和初始化WMS,然后AMS设置WMS,将AMS与WMS关联起来
  2. 和网络相关的服务关联起来
16. AMS调用SystemReady,服务基本启动完成,准备启动系统UI
  • startSystemUi启动系统UI
  • 执行一些列服务的SystemReady方法
  • startHomeActivityLocked方法,启动Launcher

进程对比

  • init进程:没有framework的资源,主要任务是解析init.rc文件,创建各种服务进程
  • zygote进程:会加载一个进程所需要的必要资源,比如preloadClass、VM虚拟机;APP的进程从这里fork出
  • system_server进程:从zygote进程fork出来,创建大量服务,比如AMS等,加载androidFramework所需要的资源,创建context;也有可能会创建其他的进程,有些服务可能是处于单独的进程

参考书

这里介绍几本系统层面的参考书,都是比较有名的
1、柯元旦教授的《Android内核剖析》

《Android内核剖析》是柯元旦教授编著的一本深入解析Android操作系统内核的专著。柯元旦教授是中国计算机领域的知名专家,他在操作系统和内核层面有着丰富的研究和实践经验。这本书针对Android系统,从底层内核到高层应用,提供了全面而深入的解析。

2、罗升阳 的《Android系统源代码情景分析》

《Android系统源代码情景分析》是罗升阳编著的一本详尽解析Android系统源代码的书籍。罗升阳是一位深耕Android系统的专家,他在操作系统和Android平台方面有深厚的技术积累和丰富的从业经验。这本书通过剖析实际的源代码,帮助读者理解Android系统的框架和实现机制。


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
18小时前
|
SQL Java Unix
Android经典面试题之Java中获取时间戳的方式有哪些?有什么区别?
在Java中获取时间戳有多种方式,包括`System.currentTimeMillis()`(毫秒级,适用于日志和计时)、`System.nanoTime()`(纳秒级,高精度计时)、`Instant.now().toEpochMilli()`(毫秒级,ISO-8601标准)和`Instant.now().getEpochSecond()`(秒级)。`Timestamp.valueOf(LocalDateTime.now()).getTime()`适用于数据库操作。选择方法取决于精度、用途和时间起点的需求。
10 3
|
4天前
|
Java Android开发
android 设置系统时间的流程
android 设置系统时间的方法
10 2
|
4天前
|
SQL 安全 Java
Android经典面试题之Kotlin中object关键字实现的是什么类型的单例模式?原理是什么?怎么实现双重检验锁单例模式?
Kotlin 单例模式概览 在 Kotlin 中,`object` 关键字轻松实现单例,提供线程安全的“饿汉式”单例。例如: 要延迟初始化,可使用 `companion object` 和 `lazy` 委托: 对于参数化的线程安全单例,结合 `@Volatile` 和 `synchronized`
15 6
|
5天前
|
Android开发 Kotlin
Android经典面试题之Kotlin中Lambda表达式有哪些用法
Kotlin的Lambda表达式是匿名函数的简洁形式,常用于集合操作和高阶函数。基本语法是`{参数 -> 表达式}`。例如,`{a, b -> a + b}`是一个加法lambda。它们可在`map`、`filter`等函数中使用,也可作为参数传递。单参数时可使用`it`关键字,如`list.map { it * 2 }`。类型推断简化了类型声明。
8 0
|
5天前
|
Android开发 Kotlin
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
**Kotlin中的匿名函数与Lambda表达式概述:** 匿名函数(`fun`关键字,明确返回类型,支持非局部返回)适合复杂逻辑,而Lambda(简洁语法,类型推断)常用于内联操作和高阶函数参数。两者在语法、返回类型和使用场景上有所区别,但都提供无名函数的能力。
7 0
|
6天前
|
XML Android开发 数据格式
Android面试题之DialogFragment中隐藏导航栏
在Android中展示全屏`DialogFragment`并隐藏状态栏和导航栏,可通过设置系统UI标志实现。 记得在布局文件中添加内容,并使用`show()`方法显示`DialogFragment`。
17 2
|
7天前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
22 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
|
2天前
|
开发工具 Android开发 Swift
探索Android与iOS开发的差异与挑战
【7月更文挑战第20天】在移动应用开发的广阔天地中,Android和iOS两大平台如同双子星座,各自闪耀着独特的光芒。本文将深入探讨这两个平台在开发过程中的主要差异,以及开发者面临的技术挑战。我们将从开发环境、编程语言、用户界面设计、性能优化、安全性考量等多个维度展开讨论,旨在为那些即将踏入或已在这片星空下航行的开发者提供一盏明灯。
|
3天前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的对比分析
在移动应用开发的广阔天地中,安卓与iOS两大阵营各自占据着半壁江山。本文将深入探讨这两个平台在开发环境、编程语言、用户界面设计以及性能优化方面的差异,并分析这些差异如何影响最终的用户体验。通过数据支持的案例分析和最新的市场研究,我们将揭示开发者如何在这两个不同的生态系统中做出战略决策,以及这些决策对应用成功的潜在影响。
|
3天前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的对比分析
【7月更文挑战第19天】在移动开发的广阔天地中,安卓与iOS两大阵营各据一方,它们在开发环境、用户界面设计、性能优化等方面展现出独特的魅力与挑战。本文旨在深入探讨这两个平台在技术开发和用户体验上的根本差异,并分析这些差异如何影响开发者的策略和最终用户的选择。通过比较两者的编程语言、工具、框架以及设计理念,我们将揭示各自平台的优势与局限,为开发者提供实用的参考,并为消费者呈现一个更加清晰的平台选择视角。