Android系统启动与AMS、PMS之间的关系

2024-04-03 07:28

本文主要是介绍Android系统启动与AMS、PMS之间的关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,Android系统启动。

1,首先是上电,bootloader
2,然后是linux,Linux内核启动
3,接着是init进程启动,init主要做两件事情,第一个是启动系统关键服务,第二个是守护关键服务,需要启动的服务会保存在init.rc文件
4,init进程会解析init.rc配置文件,并启动Zygote进程
5,Zygote进程会预加载类和资源,创建ServerSocket,启动SystemServer进程
6,SystemServer进程启动Binder线程池和SystemServerManager,启动引导服务,启动核心服务如PMS,AMS;启动其他服务,如SystemUI,Launcher等。
7,Launcher启动完成后会发出BOOT_COMPELETED开机广播,系统启动完成。

二,AMS与PMS的关系

1,PMS在手机启动时运行一次,AMS在手机运行时一直运行。
2,当我们想要启动一个App时需要PMS和AMS配合才能启动。
3,PMS主要负责
(1)遍历data/app目录
(2)解压APK文件
(3)dom解析xml,android清单文件,获取到activityinfo信息。
4,AMS主要负责
(4)定位到需要打开的Activity,通过反射构建
(5)加载Class内存
(6)实例化对象,展示
5,PMS将所有应用存储到缓存中,AMS直接查询PMS缓存获取解析信息启动,AMS和PMS相互配合,这样每个App都可以快速启动,而不是从头加载启动。

三,PMS的主要流程

1,手机启动时 在SystemServer中去启动PMS
2,PMS去遍历data/app目录,解压apk文件
3,PMS会调用PackageParse去解析清单文件
4,PackageParse会调用parseBaseApplication去解析Application标签
5,parseActivity去解析Activity,返回一个JavaBean的Activity对象
6,再去解析intent_fliter标签,放在ActivityInfo集合
7,以此类推去解析四大组件。
8.所有标签解析完毕后DOM解析完成,所有的信息全部缓存在内存中,放在一个mPackage的列表中,他是一个ArrayMap,key是包名,value是解析的内容。
9,以后要启动一个Activity直接从mPackage中获取信息去启动,不用再从头解析。

四,AMS启动一个app的主要流程

主要分为三大步骤:第一,从Activity到AMS;第二,从AMS到PMS;第三,从AMS到ApplicationThread.
1,无论是Launcher还是应用内部都会先调用startActivity方法去启动应用或Activity,从而通过Binder驱动调用AMS中的startActivity方法。
2,AMS通过层层调用,最后通过getPackageManagerInternalLocked获得PMS对象,再通过PMSInternalImpl获取到ResolveInfo,从ResolveInfo获取到ActivityInfo。
3,AMS拿到ActivityInfo后通过Socket传递信息给Zygote进程,Zygote在收到AMS发来的请求后便会fork出新的子进程,即APP进程。
4,APP通过Binder向AMS发出attachApplication请求。
5,AMS收到请求后,通过Binder方法向APP进程的ApplicationTread线程发送scheduleLaunchActivity请求。
6,ApplicationTread在收到请求后向App进程的主线程通过Handler发送LAUNCH_ACTIVITY消息。
7,主线程在收到Message消息后,通过反射机制创建目标Activity,最终回调Activity的onCreat方法,至此App启动完成。

这篇关于Android系统启动与AMS、PMS之间的关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/872269

相关文章

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin