android运行过程简书,Android系统的启动流程
Android系统有哪些进程
在Linux系统启动时,会读取init.rc,里面配置了一些需要启动的进程。注意:SystemServer进程不在init.rc里,因为SystemServer进程是由zygote启动的。
如下所示:
service zygote /system/bin/app_process ...
service servicemanager /system/bin/servicemanager ...
service sufaceflinger /system/bin/suerfaceflinger ...
service media /system/bin/mediaserver ...
...
Zygote是怎么启动的?
init进程fork出zygote进程
启动虚拟机,注册JNI函数
预加载系统资源(常用类、主题资源、JNI函数、共享库等)
启动SystemServer
private static boolean startSystemServer(...){
String args[] = {
...
"com.android.server.SystemServer",
};
int pid = Zygote.forkSystemServer(...);
if(pid==0){
handleSystemServerProcess(parsedArgs);
}
return true;
}
......
void handleSystemServerProcess(Arguments parsedArgs){
RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion,parsedArgs.remainingArgs,...);
}
......
void zygoteInit(String[] argv,...){
commonInit(); //常规初始化
nativeZygoteInit(); //调用native的onZygoteInit,启动binder。
applicationInit(argv,...); //调用Java类(SystemServer)的main函数
}
......
virtual void onZygoteInit(){
sp proc = ProcessState::self();
proc->startThreadPool();
}
......
void applicationInit(...){
invokeStaticMain(args,...);//调用Java类(SystemServer)的main函数
}
......
SystemServer.java
public static void main(String[] args){
new SystemServer().run();
}
......
private void run(){
Looper.prepareMainLooper(); //创建主线程looper
System.loadLibrary("android_servers"); //加载native层的SystemServer代码
createSystemContext(); //创建系统上下文
startBootstrapServices(); //启动引导服务
startCoreServices(); //启动核心服务
startOtherServices(); //启动其他服务
Looper.loop(); //开启循环
}
进入Socket Loop
boolean runOnce(){
String[] args = readArgumentList();
int pid = Zygote.forkAndSpecialize();
if(pid==0){
//in child process
handleChildProc(args,...);
//should never get here, the child is expected to either throw ZygoteInit.MethodAndArgsCaller or exec().
return true;
}else{
return handleParentProc(pid,...);
}
}
系统服务是怎么发布,让应用程序可见?
void publisBinderService(String name,IBinder service){
publishBinderService(name,service,false);
}
void publishBinderService(String name,IBinder service,...){
ServiceManager.addService(name,service,allowIsolated);
}
系统服务运行在什么线程?
工作线程:AMS、PMS、PackageManagerService
还有一些运行在公用的线程中,如在DisplayThread,FgThread,IoThread,UiThread线程中运行。
binder线程:应用接收到binder调用后,启动线程。
系统服务的互相依赖是如何解决的?
分批启动
AMS, PMS, PKMS
分阶段启动
阶段1,阶段2,阶段3,……
桌面的启动
public void systemReady(final Runnable goingCallback){
……
//启动桌面程序的Launcher类
startHomeActivityLocked(mCurrentUserId,"systemReady");
……
}
//Launcher(Activity)的onCreate方法中会创建一个LoaderTask
mLoaderTask = new LoaderTask(mApp.getContext(),loadFlags);
//在LoaderTask中会去向Package ManagerSevice查询已安装应用,然后将应用图标显示在桌面,当用户点击图标时,Launcher就会启动应用程序。
mPm.queryIntentActivitiesAsUser();
android运行过程简书,Android系统的启动流程相关推荐
- android运行过程简书,android 启动过程(一)
1.由init.rc调用 app_main.cpp的main方法,启动zygote进程 3.调用AndroidRuntime.cpp 的start方法传递ZygoteInit类路径 5.Android ...
- android 读写文件 简书,Android 中的文件操作
Android 文件操作 概述 Android 中的文件操作主要涉及到两个部分,一个是内部存储的读写,一个是外部存储的读写两者的主要区别如下表: 内部存储 外部存储 始终可用 它并非始终可用,因为用户 ...
- android自动登录简书,Android开发之简单登录界面
用户界面基础 Android系统的四大组件分别是活动(Activity).服务(Service).广播接收器(Broadcast Receiver).内容提供器(Content Provider). ...
- android 开发环境简书,Android Studio 开发环境快速搭建
目录 - 1.下载JDK.AS - 1.1 JDK下载 - 1.2 AS下载 - 1.3 百度云资源统一下载 - 2.安装JDK - 3.配置JDK及JAVA的环境 - 3.1 打开系统环境 - 3. ...
- android 存储方式简书,Android的多种数据存储方式
1. 简介 作为一个完整的应用程序,数据存储操作是必不可少的.现在Android的离线缓存就是通过网络良好状态时将从服务器收到的数据保存到本地.Android系统中主要提供了3种方式进行数据存储,分别 ...
- android权限适配 简书,Android动态权限适配
最近APP里面要添加动态权限,网上找了不少例子并经过一定的测试,基本流程有了一定的认识,需要注意的地方记录下来以备以后查阅. 一 各大手机厂商的适配 依据各大手机Rom的不同表现,可以分为三种不同的模 ...
- android 截屏 简书,Android 内置应用截屏方法
Android 中,内置应用如何更好的截屏 在开发系统应用的时候,有时候需要用到截屏,因为 View.getDrawingCache() 截不到状态栏,所以这个方案不理想 这有一个更好的方案,就是用 ...
- android 辅助服务 简书,Android AccessibilityService使用
测试demo主要使用了Android 的无障碍辅助服务(AccessibilityService),主要注意是 1. 开启服务,绑定目标app的监听(demo中根据包命绑定了体积计算的app),需要在 ...
- android四大组件 简书,android四大组件
android有四大组件,分别是Activity, Service(服务),Content Provider(内容提供者),BoadcastReceiver广播接收器. Activity 一个Acti ...
最新文章
- antd Form.Item 中如何获取到Select的label值
- Opencv各种滤波实现
- 7 天玩转 ASP.NET MVC — 第 6 天
- 机器人砖机视频_全自动透水砖机生产线需严格遵守的标准工艺流程
- PHP中date()函数里的参数
- 基于固定坐标与基于参考坐标系得到的机械手的微分运动不同
- 六一儿童节,看我用ModelArts让8090梦回童年
- oracle 二进制与运算,Oracle怎么操作进行二进制的比对
- Exchange2003 备份与还原
- 华为鲲鹏HCIA认证 常考题
- 一位业余爱好者花两年时间完成的STM32H7掌上电脑(软硬件开源)
- mac显示所有文件后缀名
- CS294(285)策略梯度学习笔记
- Hadoop高可用原理及环境搭建
- 在python3 encode和decode 的使用
- vue input失焦事件
- 【MPI编程】矩阵向量乘法--解法二(高性能计算)
- php tiaozh,php 拼音转换的实现方法
- 调研报告--结构--指导
- js获取每个月最后一天的两种方法
热门文章
- Harmony生命周期
- 分离内核和虚拟机支持安全的关键任务边缘计算
- 2021年大数据Kafka(五):❤️Kafka的java API编写❤️
- 2021年大数据常用语言Scala(十九):基础语法学习 iterator迭代器
- 浅谈自然语言处理技术在自动化的应用
- 【分布式架构】“高并发” -- 详解
- 2022-2028年中国车载摄像头行业市场前瞻与投资战略规划分析报告
- centos6一键安装vsftpd脚本
- day13 paramiko、数据库表操作
- VC实用小知识总结 (一),转http://blog.csdn.net/myiszjf/article/details/10007431