Application组件源代码分析

  • 1. Applicaion启动流程源代码分析
  • 2. 启动过程中应用进程、系统服务进程通信的分界点
  • 3. 组件生命周期与系统服务的关系
  • 4. Application组件启动的序列图(超清点击可放大)
    • 4.1 代理方式更新
    • 4.2 函数作用
    • 4.3 类和函数调用关系
  • 5. 其它
    • 5.1 启动applicaiton的过程中,可以通过什么方式进行拦截并能监控applicaiton的生命周期
    • 5.2 application组件对应的context的创建以及与application如何绑定
  • 6. 另附两篇Application源码分析过程中的文章
  • 7. 参考文章

1. Applicaion启动流程源代码分析

本次使用的源代码版本为android 9,通过Android SDK中sources直接查看代码文件。
共分析了四组代码ActivityThread.java、ActivityManagerService.java、Instrumentation.java、Application.java,PackageManagerService.java。

  1. ActivityThread:通过IActivityManager类,通知AMS准备application启动所需进程数据;
  2. ActivityManagerService:获取application启动所需进程数据;
  3. Instrumentation:创建和启动Application;跟踪Application的生命周期;
  4. PackageManagerService:权限校捡(checkPermission,checkUidPermission),Apk
    meta信息获取(getApplicationInfo等),四大组件信息获取(query系列方法)等功能。

2. 启动过程中应用进程、系统服务进程通信的分界点

  1. AMS通过ProcessRecord来维护进程运行时的状态信息,需要将应用进程绑定到ProcessRecord才能开始一个Application的构建;通过ActivityRecord来维护Activity运行时的状态信息,需要将Activity绑定到AMS中的ActivityRecord能开始Activity的生命周期;
  2. 通过两个Binder接口IApplicationThread和IActivityManager实现应用进程与服务通信;
  3. IApplicationThread作为系统进程请求应用进程的接口,代理类为IApplicationThread.Stub,实体类为ApplicationThread;
  4. IActivityManager作为应用进程请求系统进程的接口,接口代理类为IActivityManager.Stub,实体类为ActivityManagerService;
  5. 应用进程何时将本地binder代理传递给了系统服务进程
    应用进程在ActivityThread创建的时候,会将自己的ApplicationThread绑定到AMS中,应用进程作为客户端,通过IActivityManager接口发起了跨进程调用,跨进程传递的参数mAppThread就是IApplicationThread的实例,执行流程从应用进程进入到系统进程;
    AMS作为IActivityManager接口的服务端实现,会响应客户端的请求,最终AMS.attachApplication()函数会被执行,该函数接收跨进程传递过来的IApplicationThread实例,将其绑定到系统进程。AMS中维护了所有进程运行时的信息(ProcessRecord),一旦发生了应用进程的绑定请求,ProcessRecord.thread就被赋值成应用进程的IApplicationThread实例,在AMS中就能通过该实例发起向应用进程的调用。

3. 组件生命周期与系统服务的关系

  1. AMS
  • Activity的启动和Activity的生命周期回调在AMS中完成;
  • Service的启动调用了AMS的startService和bindService方法;
  • Broadcaset的注册和接收在AMS中完成;
  • getContentResolver从AMS的getContentProvider获取到ContentProvider。
  1. PMS
  • 权限校捡checkPermission、checkUidPermission,Apk meta信息获取getApplicationInfo等,四大组件信息获取,query系列方法等功能在PMS中完成;
  • 静态广播在PMS中完成;

4. Application组件启动的序列图(超清点击可放大)

4.1 代理方式更新

Android 26版本以后ActivityManagerNative类被弃用,代理类ActivityManagerProxy、ApplicationThreadProxy被删除,改用AIDL方式。
ActivityManagerService 继承IActivityManager.Stub;
ApplicationThread继承IApplicationThread.Stub;
PackageManagerService 继承IPackageManager.Stub。

4.2 函数作用

getPackageManager作用:获得PMS的Binder类型实例,然后得到PMS的代理类。
getPackageInfo作用:参数为包名、标志、用户id,为PMS的接口方法。
getService作用:获取AMS的代理类IActivityManager;
attachApplication作用:

  1. 参数为当前应用进程的binder对象,通过系统AMS本地代理传递给系统AMS进程,供系统AMS进程后续通过此binder代理直接调用ApplicationThread类中的函数;
  2. 告知系统AMS服务准备启动Application。
    attachApplicationLocked作用:
  3. 参数为当前应用进程的binder对象的pid、callingUid,根据pid获取存储在AMS中的对应进程的相关信息;
  4. 通知ActivityThread启动启动Application。
    bindApplication作用:从Handler切换到了主线程,最后调用handleBindApplication()。
    handleBindApplication作用:
  5. 创建Instrumentation,负责跟踪Application还在Activity的生命周期;
  6. 创建Application对象 & 调用其attach();
  7. 调用Instrumentation的onCreate(),内部是空实现;
  8. 调用Instrumentation的callApplicationOnCreate(),内部是调用Application的onCreate()。

4.3 类和函数调用关系

  1. ActivityThread通过PMS服务的本地Binder代理获取package信息;
  2. ActivityThread中的 attch()函数通过AMS服务的本地Binder代理将当前应用进程的Binder代理对象传递给系统AMS服务进程,并通知系统AMS启动Application组件;
  3. 系统AMS服务访问PMS相关函数获取Application组件的信息,系统AMS服务通过IApplicationThread代理调用handleBindApplication函数将Application相关信息传递给应用主进程ActivityThread,触发Application对象创建和生命周期函数

5. 其它

5.1 启动applicaiton的过程中,可以通过什么方式进行拦截并能监控applicaiton的生命周期

通过继承实现Instrumentation并反射修改ActivityThread.mInstrumentation变量,可以监控applicaiton的生命周期。

5.2 application组件对应的context的创建以及与application如何绑定

  1. 应用程序启动;
  2. 创建Instrumentation对象;
  3. 创建Application对象;
  4. 创建ContextImpl对象;
  5. Application与ContextImpl进行绑定。

6. 另附两篇Application源码分析过程中的文章

  1. Android源代码分析之类方法与组件名词解释https://blog.csdn.net/qq_26906345/article/details/103694786。
  2. 部分源代码详解
    https://blog.csdn.net/qq_26906345/article/details/103695560。

7. 参考文章

[1]: Android的Handler的简单理解和使用. https://blog.csdn.net/weixin_43548748/article/details/91128791.
[2]: Android消息处理机制:Handler中sendMessage()方法的几种重载方法. https://blog.csdn.net/fansl410k/article/details/79425765.
[3]: Android系统服务 —— WMS与AMS. https://www.jianshu.com/p/47eca41428d6.
[4]: Android源码的Binder权限控制. https://blog.csdn.net/bbmcdull/article/details/52046690.
[5]: Binder进程间通信系统. Android系统源代码情景分析.
[6]: Android进阶(三):Application启动过程(最详细&最简单). https://www.jianshu.com/p/4a8f44b6eecb.
[7]: Application初始化过程,基于android10. https://juejin.im/post/5ddb6b0de51d4523307fca86.
[8]: Android内存优化:DVM和ART原理初探. https://blog.csdn.net/weixin_42336002/article/details/80610555.
[9]: Content Provider组件的实现原理. Android系统源代码情景分析.
[10]: Android HTTPS、TLS版本支持相关解决方案. https://blog.csdn.net/devrecord/article/details/88580235.
[11]: 不同版本的TLS在Android中的支持情况. https://blog.csdn.net/yanzhenjie1003/article/details/80202476.
[12]: 加密传输才是王道!谷歌在 Android P 上默认启用 TLS. https://www.oschina.net/news/95202/dns-over-tls-support-in-android-p.
[13]: Android instrumentation原理. https://blog.csdn.net/a19891024/article/details/54342799.
[14]: Instrumentation的理解. https://www.jianshu.com/p/5a7768f22b36.
[15]: Android ABI的浅析. https://www.jianshu.com/p/d2119b3880d8.
[16]: 关于BOOT_COMPLETED广播-自启动. https://www.jianshu.com/p/679dc03ee650.
[17]: PackageManagerService原理分析文章合集. https://www.douban.com/note/726553288/.
[18]: PackageManagerService服务框架详解. https://www.jianshu.com/p/ef058fcfcd30.
[19]: Android 插件化原理解析——Hook机制之AMS&PMS.https://www.jianshu.com/p/8632fdc86009.
[20]: 一篇文章看明白 Android PackageManagerService 工作流程.https://blog.csdn.net/freekiteyu/article/details/82774947.

Android Applicaion组件创建的源代码分析(Android 9,含序列图)相关推荐

  1. Android Applicaion组件创建的源代码(Android 9,含代码注释)

    Android Applicaion组件创建的源代码 1. 序列图 1.1 简化版序列图 1.2 完整版序列图 2. Application创建过程源代码 2.1 ActivityThread初始化 ...

  2. android_ android apk analyzer(libchecker apk分析器):分析Android手机上已安装的app(库/基础组件分析/开发技术)/从酷安市场下载安装包

    android apk analyzer(libchecker apk分析器):分析Android手机上已安装的app(库/基础组件分析/开发技术-) download app(apk) Releas ...

  3. Android日志系统驱动程序Logger源代码分析

    我们知道,在Android系统中,提供了一个轻量级的日志系统,这个日志系统是以驱动程序的形式实现在内核空间的,而在用户空间分别提供了Java接口和C/C++接口来使用这个日志系统,取决于你编写的是An ...

  4. Android应用程序安装过程源代码分析(1)

    Android系统在启动的过程中,会启动一个应用程序管理服务PackageManagerService,这个服务负责扫描系统中特定的目录,找到里面的应用程序文件,即以Apk为后缀的文件,然后对这些文件 ...

  5. android 电量管理机制,电池电量分析---android篇

    原标题:电池电量分析---android篇 本文将从底层到上层介绍Android系统中电量显示这一块,电池检测采用的是ADC采样,不是使用市场上封装好的电量计芯片: 1.驱动层 Linux内核中提供p ...

  6. android四大组件的作用简书,Android四大组件是什么

    Android四大组件是:活动.服务.广播接收器.内容提供商.它们的英文名称是ACTIVITY.SERVICE.BroadcastReceiver.Content Provider.四个组件分别起到不 ...

  7. 创建构建方法android,如何快速创建并发布一个 Android 库

    一. 前言 最近经常看到各种大神的库,发现用起来非常方便,自己研究了一下,来写个库发布一下,让自己写代码更加方便一点,自己封装了基本的开发工具类.也是搜集了各位大神的优秀代码总结的. 二.必要的准备工 ...

  8. 需求用例分析之九:序列图

    作者:张克强    作者微博:张克强-敏捷307 序列图,也称时序图.顺序图,英文名Sequence Diagram.在雅各布森用例分析方法中鼓励使用各类图形来表达,但恰恰没有明确提到序列图.而科伯恩 ...

  9. Android APN的显示流程源代码分析

    一.名词介绍 1.PLMN(Public Land Mobile Network,公共陆地移动网络)由政府或它所批准的经营者,为公众提供陆地移动通信业务目的而建立和经营的网络.一句话:一个移动通信网络 ...

最新文章

  1. WIN32 C++ 遍历文件夹
  2. 如何修改手机服务器的ip地址,怎么修改手机服务器ip地址
  3. xshell自动化脚本
  4. 【IT笔试面试题整理】字符串的排列
  5. mobx使用数组提示越界_向Mobx可观察数组添加操作
  6. c语言程序-hello world-运行原理简介
  7. hdu oj1092题解
  8. VTK:Filtering之CombinePolyData
  9. POJ 2227 The Wedding Juicer——堆的应用——Pku2227
  10. Java 7:Fork / Join框架示例
  11. 【渝粤教育】国家开放大学2018年春季 7394-22T政府公共关系 参考试题
  12. Sigar - no sigar-amd64-winnt.dll in java.library.path
  13. Python 实现校园卡目标检测与文字识别系统
  14. oracle数据库导入gson包
  15. iOS开发之创建颜色渐变视图View
  16. DL-C_1_week_1_1
  17. powerdesigner制作数据字典
  18. 九、JavaScript网页特效 - 章节课后练习题及答案
  19. 拼多多店铺流量解析:这些流量入口你必须了解!
  20. 个人建设网站流程解说,手把手教你如何在阿里云上搭建自己的网站

热门文章

  1. 噪声与振动控制工程手册_强夯施工振动安全距离研究总结说明
  2. 几种主板BIOS报警声音的含义
  3. 关于分布式存储,这是你应该知道的(图文详解)(关于存储的一些好文转载--1)
  4. MySql数据库的下载安装及使用(2020最新版)
  5. 【蓝桥杯选拔赛真题45】Scratch猫鼠游戏 少儿编程scratch蓝桥杯选拔赛真题讲解
  6. 节气生活,邮箱推送,提前预警,告别炎炎夏日下的束手无策
  7. C6—Qt+mplayer+win10实现视频播放器
  8. Java用map实现沁园春_QQ飞车:沁园春地图车神跑法,实力老司机带你了解这几个技巧...
  9. Unable to retrieve version information from Elasticsearch nodes.
  10. 电子琴c语言程序仿真时音会颤,仿真微音电子琴码拉弦乐教学系统的研究