Android核心技术【SystemServer加载AMS】

news2024/11/17 3:33:57

启动流程

  • Init 初始化Linux 层,处理部分服务

    • 挂载和创建系统文件

    • 解析rc文件:

      • rc 文件中有很多action
    • 进入无限循环

      1. 执行action:zygote 进程就在这里启动

        • for循环去解析参数,根据rc 文件中的action 执行相应操作
      2. 检测并重启需要的进程

      3. 接收子进程的SIGCHLD信号,执行响应的方法

        • 防止子进程成为僵尸进程
  • zygote 层:

    • native 部分:

      • 初始化android 运行时环境(ART),因为Java 代码需要运行在虚拟机中;
      • 初始化 JNI ,因为native 层与 Java 层需要通信
      • 执行ZygoteInit.main 方法,进入Java 部分
    • Java 部分:

      • 创建 socket:实现通信
      • 执行预加载:加快进程的启动速度
      • 通过fork 创建 SystemServer 进程
      • 进入循环:等待AMS 的通知,并根据通知创建对应的进程

SystemServer 进程的创建过程

  • 前情提要:

    • 从ZygoteInit.java 中的main 方法。进入forkSystemServer类;此时,属于Zygote 进程
    • 进程实际上是没有native,java之分的;我们常说Zygote 进程在native 层,SystemServer 进程在Java 层,这可看做一种约定。
  • 第一步:参数赋值

    • 通过字符串数组args 进行赋值:包含uid,gid,nice-name(进程名)
  • 第二步:创建子进程,拿到pid

    • 通过Zygote.forkSystemServer 调用fork(),创建子进程并返回pid

SystemServer 进程的执行过程:

  • 前情提要:

    • 业务需求:需要启动SystemServer.main()

    • 代码入口:进入SystemServer 进程

      if(pid == 0){//此时在SystemServer 进程中
           …………
           return handleSystemServerProcess(parsedArgs);
       }
      

      Java

      Copy

    • handleSystemServerProcess() 通过反射启动SystemServer.main()

      • 源码依据:

        • 先是拿到了ClassLoader,接着调用了ZygoteInit.zygoteInit();

启动Binder线程池和SystemServiceManager

并且启动各种系统服务

SystemServer.main() 初始化SystemServer对象,然后调用run()

new SystemServer().run()

SystemServer.run()

//其他代码省略
 createSystemContext();//加载系统资源
 startBootstrapServices(t);//启动引导服务
 startCoreServices(t);//启动核心服务
 startOtherServices(t);//启动其他服务

SystemServer.createSystemContext()

//系统资源加载 
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();//ContextImpl
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
​
final Context systemUiContext = activityThread.getSystemUiContext();
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);

ActivityThread.systemMain()

//ResourcesManager.getInstance()获取资源管理实例
ActivityThread thread = new ActivityThread();
​
thread.attach(true, 0);
return thread;

thread.attach(true, 0);

mInstrumentation = new Instrumentation();
mInstrumentation.basicInit(this);
/**
getSystemContext()单例模式创建ContextImpl对象mSystemContext-->createSystemContext-->创建LoadedApk对象(创建ApplicationInfo(),创建ClassLoader)
createAppContext()利用刚创建的LoadedApk对象创建新的ContextImpl对象
**/
ContextImpl context = ContextImpl.createAppContext(this,getSystemContext().mPackageInfo);
/**
initializeJavaContextClassLoader() 设置当前的线程ContextClassLoader
newApplication()
public Application newApplication(ClassLoader cl, String className, Context context)throws InstantiationException, IllegalAccessException, ClassNotFoundException {
    //创建Application对象
    Application app = getFactory(context.getPackageName())
        .instantiateApplication(cl, className);
    //将新创建的ContextImpl对象保存到Application父类成员变量mBase
    //将新创建的LoadedApk对象保存到Application的成员变量mLoadedApk
    app.attach(context);
    return app;
    }
**/
mInitialApplication = context.mPackageInfo.makeApplication(true, null);
mInitialApplication.onCreate();

SystemServer.startBootstrapServices()

// SystemServiceManager 专门管理各种服务启动(java层各种服务)
​
ActivityTaskManagerService atm = mSystemServiceManager.startService(
        ActivityTaskManagerService.Lifecycle.class).getService();
        
// 在SystemServiceManager.startService()中new Lifecycle()-->new ActivityManagerService(),且回调Lifecycle.onStart()
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
        mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
//设置AMS的APP安装器
mActivityManagerService.setInstaller(installer);
//开启PMS服务
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
//初始化AMS相关的PMS服务
mActivityManagerService.initPowerManagement();
//添加C/C++各种服务
mActivityManagerService.setSystemProcess();

new ActivityManagerService(context, sAtm) 启动相关服务 创建UI线程 创建ActiveServices 创建CpuTracker线程 Lifecycle.start()

//移除所有的进程组
removeAllProcessGroups();
//启动CpuTracker线程
mProcessCpuThread.start();
//启动电池统计服务
mBatteryStatsService.publish();
//启动APP操作信息服务
mAppOpsService.publish();
//添加到LocalServices中
LocalServices.addService(ActivityManagerInternal.class, mInternal);

ActivityManagerService.setSystemProcess();

/**
ServiceManager c/c++服务
​
activity AMS
procstats 进程统计
meminfo 内存信息
gfxinfo 图像信息
dbinfo 数据库
cpuinfo 
permission
processinfo 进程信息
cacheinfo 缓存信息
**/
ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_HIGH);
ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
ServiceManager.addService("dbinfo", new DbBinder(this));
if (MONITOR_CPU_USAGE) {
ServiceManager.addService("cpuinfo", new CpuBinder(this),
    /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
    }
ServiceManager.addService("permission", new PermissionController(this));
ServiceManager.addService("processinfo", new ProcessInfoService(this));
ServiceManager.addService("cacheinfo", new CacheBinder(this));
/**
getSystemContext().installSystemApplicationInfo(info, classLoader);
getSystemUiContext().installSystemApplicationInfo(info, classLoader);
mProfiler = new Profiler();
**/
mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
//创建ProcessRecord对象
ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
                        false,
                        0,
                        new HostingRecord("system"));

ActivityThread.installSystemApplicationInfo(info,getClass().getClassLoader());

//最终调用LoadedApk的installSystemApplicationInfo(),加载名为android的包
getSystemContext().installSystemApplicationInfo(info, classLoader);
getSystemUiContext().installSystemApplicationInfo(info, classLoader);
//创建用于性能统计Profiler对象
mProfiler = new Profiler();

SystemServer.startOtherServices(t);

//与AMS相关,其他代码省略
/**
安装系统Provider
创建CoreSettingsObserver,用于监控Settings的改变
**/
mActivityManagerService.installSystemProviders();
//
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,new PhoneWindowManager(),mActivityManagerService.mActivityTaskManager);
//加入到底层服务中
ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
//WMS管理
mActivityManagerService.setWindowManager(wm);
/**
startSystemUi()启动系统UI
执行一系列服务的systemReady()
**/
mActivityManagerService.systemReady();
​
//至此80多个服务初始化完成

文末

以上就是Android开发技术中比较核心的技术点;SystemServer加载AMS的一些原理及解析;更多Android开发进阶可以查看《Android核心技术手册》里面技术点上千个,能够帮助你在Android开发岗位中深造。

SystemServer中启动服务列表

服务类名称作用描述启动模式
EntropyService提供伪随机数1.0
PowerManagerService电源管理服务1.2/3
ActivityManagerService最核心的服务之一,管理 Activity自定义
TelephonyRegistry通过该服务注册电话模块的事件响应,比如重启、关闭、启动等1.0
PackageManagerService程序包管理服务3.3
AccountManagerService账户管理服务,是指联系人账户,而不是 Linux 系统的账户1.0
ContentServiceContentProvider 服务,提供跨进程数据交换3.0
BatteryService电池管理服务1.0
LightsService自然光强度感应传感器服务1.0
VibratorService震动器服务1.0
AlarmManagerService定时器管理服务,提供定时提醒服务1.0
WindowManagerServiceFramework 最核心的服务之一,负责窗口管理3.3
BluetoothService蓝牙服务1.0 +
DevicePolicyManagerService提供一些系统级别的设置及属性1.3
StatusBarManagerService状态栏管理服务1.3
ClipboardService系统剪切板服务1.0
InputMethodManagerService输入法管理服务1.0
NetStatService网络状态服务1.0
NetworkManagementService网络管理服务NMS.create()
ConnectivityService网络连接管理服务2.3
ThrottleService暂不清楚其作用1.3
AccessibilityManagerService辅助管理程序截获所有的用户输入,并根据这些输入给用户一些额外的反馈,起到辅助的效果1.0
MountService挂载服务,可通过该服务调用 Linux 层面的 mount 程序1.0
NotificationManagerService通知栏管理服务, Android 中的通知栏和状态栏在一起,只是界面上前者在左边,后者在右边1.3
DeviceStorageMonitorService磁盘空间状态检测服务1.0
LocationManagerService地理位置服务1.3
SearchManagerService搜索管理服务1.0
DropBoxManagerService通过该服务访问 Linux 层面的 Dropbox 程序1.0
WallpaperManagerService墙纸管理服务,墙纸不等同于桌面背景,在 View 系统内部,墙纸可以作为任何窗口的背景1.3
AudioService音频管理服务1.0
BackupManagerService系统备份服务1.0
AppWidgetServiceWidget 服务1.3
RecognitionManagerService身份识别服务1.3
DiskStatsService磁盘统计服务1.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

细谈文件操作

该文章将详细的介绍文件操作这方面的知识,文件的打开,关闭,读取,写入,以及相关的函数都会在本文一一介绍,干货满满喔!1.为什么使用文件2.什么是文件2.1程序文件2.2数据文件2.3文件名3.文件的打开…

SpringBoot(java)操作elasticsearch

elasticsearch我已经装了ik,中文分词器。已经使用容器搭建了集群。之前在我的博客-elasticsearch入门中,已经介绍了http请求操纵es的基本功能,java API功能和他一样,只是从http请求换成了javaApi操作。springBoot里继承了elastics…

蓝桥杯算法训练合集八 1.数的划分2.求先序排列3.平方计算4.三角形高5.单词复数

目录 1.数的划分 2.求先序排列 3.平方计算 4.三角形高 5.单词复数 1.数的划分 问题描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n7,k3,下面三种分法被认为是相同的。 1&#xff0c…

关于宏文档开启宏后还是不能正常使用问题

1.问题 2.开启宏 (62条消息) [Win10Excel365]尽管已启用VBA宏,Excel还是无法运行宏_逍遥猴哥的博客-CSDN博客 3. 问题还是没解决 发现可能是字体显示乱码,导致vba运行找不到争取路径 VBA编辑器中中文乱码的解决办法:1、依次点击【工具→选项…

如何写一个命令行解释器(SHELL)

文章目录前言什么是命令行解释器 ——SHELLSHELL的结构void print_info(char ** env) //打印命令行信息函数void read_comand(char **buffer) //读取指令函数char **split_line(char *buffer, int *flag) //分割字符串函数int excute_line(char **buffer, int flag) // 执行指令…

Redis 安全汇总小结

Redis redis 是一个C语言编写的 key-value 存储系统,可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list…

电子技术——基本MOS放大器配置

电子技术——基本MOS放大器配置 上一节我们探究了一种MOS管的放大器实现,其实MOS放大器还有许多变种配置,在本节我们学习最基本的三大MOS放大器配置,分别是共栅极(CG)、共漏极(CD)、共源极&…

【MSSQL】分析数据库日志文件无法收缩的问题

一、问题描述 在SQL Server 2008R2数据库中,无法对数据库日志进行收缩,导致日志不断膨胀。 二、问题分析 由于是日志文件不断增大且无法收缩,所以初步判断为存在未提交的事务。检查可能阻止日志阶段的活动事务,执行&#xff1a…

使用 JMX 连接远程服务进行监测

使用 JMX 连接远程服务进行监测1.JVM参数2.启动脚本3.演示使用相关JMX工具连接部署在服务器上的Java应用,可以对应用的内存使用量,CPU占用率和线程等信息进行监测。相关监测工具有jconsole,jprofiler,jvisualvm等。1.JVM参数 监测…

本地镜像发布到阿里云

1、找到阿里云控制台中的容器镜像服务,进入个人版 2、先创建命名空间,再创建镜像仓库 记住创建时设置的密码,选择创建本地的镜像仓库 建完之后,选择管理 进入后的界面如下 内容如下: 1. 登录阿里云Docker Registry $…

547、RocketMQ详细入门教程系列 -【消息队列之 RocketMQ(一)】 2023.01.30

目录一、RocketMQ 特点二、基本概念2.1 生产者2.2 消费者2.3 消息服务器2.4 名称服务器三、参考链接一、RocketMQ 特点 RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于2017年9月25日成为 Apache 的顶级项目…

【自然语言处理】【大模型】PaLM:基于Pathways的大语言模型

PaLM:基于Pathways的大语言模型《PaLM: Scaling Language Modeling with Pathways》论文地址:https://arxiv.org/pdf/2204.02311.pdf 相关博客 【自然语言处理】【大模型】PaLM:基于Pathways的大语言模型 【自然语言处理】【chatGPT系列】大语…

电脑重装系统后找不到硬盘怎么办

有网友的win10系统电脑出了系统故障进行了重装,但是又发现了重装系统后找不到硬盘的新问题,那么重装系统后找不到硬盘怎么办呢? 工具/原料: 系统版本:win10专业版 品牌型号:戴尔成就5880 方法/步骤: …

使用FFmpeg工具进行推流、拉流、截图、变速、转换,及常见问题处理

下载安装 FFmpeg下载官网:FFmpeg ,这里提供了官网下载的windows环境 4.1.3版本:https://download.csdn.net/download/qq_43474959/12311422 下载后,配置环境变量,将bin文件地址加入到path中: 测试 在cmd…

数据结构 | 图结构 | 最小生成树 | Kruskal Prim算法讲解

文章目录前言Kruskal算法Prim算法前言 讲解之前,我们需要先明白连通图是指什么?连通图具有以一个顶点为起点可以到达该图中的任意一个顶点的特性,就算它们不直接相连,但是它们之间至少有一条可以递达的路径。并且连通图是针对无向…

Mysql 中的日期时间函数汇总

日期和时间函数MySQL中内置了大量的日期和时间函数,能够灵活、方便地处理日期和时间数据,本节就简单介绍一下MySQL中内置的日期和时间函数。1 CURDATE()函数CURDATE()函数用于返回当前日期,只包含年、月、日部分,格式为YYYY-MM-D…

【Unity3D小工具】Unity3D中实现仿真时钟、表盘、仿原神时钟

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 今天实现一个时钟工具,其实在之前已经完成了一个简…

P3366 【模板】最小生成树

题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz。 输入格式 第一行包含两个整数 �,�N,M,表示该图共有 �N 个结点和 �M 条无向边。 接下来 &…

【K8S系列】Pod重启策略及重启可能原因

目录 1 重启策略 1.1 Always 1.2 OnFailure 1.3 Nerver 1.4 yaml示例 2 Pod常见异常状态 2.1 Pending状态 2.2 Waiting/ContainerCreating状态 2.3 CrashLoopBackOff状态 2.4 ImagePullBackOff状态 2.5 Error状态 2.6 其他状态说明 tips: 3.自动重启的可能原…

【HBase——陌陌海量存储案例】5. Apache Phoenix快速入门

6.3 快速入门 6.3.1 需求 本次的小DEMO,我们沿用之前的订单数据集。我们将使用Phoenix来创建表,并进行数据增删改查操作。 列名说明id订单IDstatus订单状态money支付金额pay_way支付方式IDuser_id用户IDoperation_time操作时间category商品分类 6.3.…