Android7.0 PhoneApp的启动
来源:互联网 发布:ip域名查询 编辑:程序博客网 时间:2024/05/22 12:33
前言
最近准备写一写Android中数据业务相关的内容,考虑到数据业务是基于PhoneApp的,因此需要先来分析一下PhoneApp是如何启动的。
版本
Android 7.0
1 AndroidManifest.xml
为了弄清楚PhoneApp如何启动,我们首先必须先看一下PhoneApp对应的AndroidManifest.xml,它的位置为package/services/Telephony。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
上面的代码中,persistent表示应用是常驻的;directBootAware表示应用是可直接启动的。这两个字段决定了PhoneApp开机后,将被ActivityManagerService启动。
从 Android N 开始,在首次开机时,在用户尚未来得及解锁设备之前,设备可直接启动到一种名为 Direct Boot(直接启动)的新模式中。在此模式下,操作系统可以全功能运行,但不允许访问私有应用数据,只能运行经过更新、可支持直接启动功能的应用。
2 启动过程
现在,我们来看看具体的启动过程。
我们知道,当SystemServer进程被zygote进程创建后,在SystemServer的run方法中会启动系统所需的关键服务:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
在startBootstrapServices函数中将启动ActivityServiceManager:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
之后在startOtherServices中:
- 1
- 2
- 3
- 4
- 5
在ActivityManagerService的systemReady函数中:
- 1
- 2
- 3
- 4
- 5
- 6
从上面的代码可以看出,systemReady将调用startPersistentApps启动某一类Application。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
从上面的代码,我们知道PhoneApp将有addAppLocked进行处理:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
在ActivityThread.java的main函数中:
- 1
- 2
- 3
- 4
- 5
继续看看attach函数:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
从上面的代码可以看出,流程再次回到了ActivityManagerService:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
我们看看ApplicationThreadNative.java中ApplicationThreadProxy的bindApplication函数:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
在ActivityThread.java中的handler H的handleMessage处理消息(在PhoneApp中的binder解析完收到的数据后,触发BIND_APPLICATION消息给H):
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
经过上面的过程,PhoneApp终于可以启动了。
我们大致回忆一下整个过程:
1. SystemServer进程会创建出AM和PM,PM会加载Application的信息。
2. 当AM的SystemReady被调用后,将利用PM得到具有persistent和directBootAware的应用列表,PhoneApp就在其中。
3. AM利用socket向zygote发送消息,启动PhoneApp对应的进程。
4. zygote进程启动PhoneApp进程后,将利用反射调用PhoneApp中ActivityThread的main函数。
5. ActivityThread的main函数被调用后,将利用binder通信向AM发送消息;AM进行对应的处理,处理完成后,同样利用binder通信将处理结果返回给ActivityThread。
6. 最后ActivityThread收到处理结果后,完成最后的准备工作(设置参数之类),并调用PhoneApp的onCreate函数。
结束语
上属流程中有一部分应该适用于所有应用的启动,当然AM和PM的流程,包括Binder的一些内容,分析起来比较复杂,自己目前也没有深入研究,因此上面只描述了主要结构。
原文地址:http://blog.csdn.net/gaugamela/article/details/52311508
- Android7.0 PhoneApp的启动
- Android7.0 PhoneApp的启动
- PhoneApp的启动流程
- PhoneApp
- Android7.0 之 直接启动
- android7.0启动zygote进程
- Android7.0启动SystemServer进程
- Android7.0 启动Launcher流程
- Android7.0启动SystemServer进程
- Android7.0点击Launcher的AMS应用启动流程
- PhoneApp的初步独立分析
- Android6.0 Telephony流程分析——PhoneApp启动主要类关系分析
- PhoneApp 启动异常分析及解决办法
- Android N PhoneAPP 启动关系类初始化
- Android7.0的FileProvider
- Android7.0 PowerManagerService(1) 启动过程
- Android7.0startActivity启动过程分析
- Android7.0 PowerManagerService(1) 启动过程
- MyBatis文档观后整理
- 欢迎使用CSDN-markdown编辑器
- 在Ubuntu16.04安装torch7笔记
- 计算2个日期之间的相隔的工作日不算第一天
- Java字符编码原理_动力节点Java学院整理
- Android7.0 PhoneApp的启动
- 实验一:写一个hello world小程序
- 地址转经纬度(百度)function
- 西瓜书-机器学习《一》
- %:的使用
- 前向传播和反向传播(举例说明)
- python- 路径
- LINTCODE——逆序对
- python执行sql文件