Android应用程序进程管理

2020-02-27 58浏览

  • 1.Android 应用程序进程管理 罗升阳http://weibo.com/shengyangluohttp://blog.csdn.net/luoshengyang
  • 2.About Me • 《老罗的 Android 之旅》博客作者 • 《 Android 系统统 源代 统 统统 情景分析》 统 统 统 统 统统 籍作者 统统 • 博客:http://blog.csdn.net/Luoshengyang• 微博:http://weibo.com/shengyangluo
  • 3.Agenda • • • • • Android 系统启动概述 Zygote 进程启动过程分析 System Server 进程启动过程分析 Android 应用程序进程启动过程分析 Android 应用程序进程回收机制
  • 4.Android 系统启动概述
  • 5.Zygote 进程启动过程分析 • Zygote 进程由 Init 进程启动 – 加载文件: /system/app_process – --start-system-server :启动 System Serv er 进程 – 创建名称为 zygote 的 socket :用来和 Activi tyManagerService 通信
  • 6.Zygote 进程启动过程分析 ( 续 ) • app_process
  • 7.Zygote 进程启动过程分析 ( 续 ) •AndroidRuntime::start
  • 8.Zygote 进程启动过程分析 ( 续 ) • 启动 Dalvik 虚拟机 – 创建一个 Dalvik 虚拟机实例 – 加载 Java 核心类及其 JNI 方法 – 初始化主线程的 JNI 环境 • 加载部分 Android 核心类及其 JNI 方法 – android.os.* – android.graphics.* – android.opengl.* – android.hardware.* – android.media.* – ……
  • 9.Zygote 进程启动过程分析 ( 续 ) • ZygoteInit.main
  • 10.Zygote 进程启动过程分析 ( 续 ) • Preload Classes – 参考 frameworks/base/preloaded-classes 文件 • • • • android.accounts.* android.app.* android.view.* ……
  • 11.Zygote 进程启动过程分析 ( 续 ) • Preload Drawables – 参考 frameworks/base/core/res/res/values$/arra ys.xml 文件 • • • • @drawable/toast_frame_holo @drawable/btn_check_on_pressed_holo_light @drawable/btn_check_on_pressed_holo_dark ……
  • 12.Zygote 进程启动过程分析 ( 续 ) • Preload Color State List – 参考 frameworks/base/core/res/res/values$/arra ys.xml 文件 • • • • @color/primary_text_dark @color/primary_text_dark_disable_only @color/primary_text_dark_nodisable ……
  • 13.Zygote 进程启动过程分析 ( 续 ) • runSelectLoopMode
  • 14.Zygote 进程启动过程分析 ( 续 ) • Zygote 进程启动完成后的地址空间
  • 15.System Server 进程启动过程分析 • Zygote 在启动的过程中创建 System Server 进 程
  • 16.System Server 进程启动过程分析 ( 续 ) • startSystemServer
  • 17.System Server 进程启动过程分析 ( 续 ) • handleSystemServerProcess
  • 18.System Server 进程启动过程分析 ( 续 ) • RuntimeInit.zygoteInit
  • 19.System Server 进程启动过程分析 ( 续 ) • nativeZygoteInit-- 启动 Binder 线程池
  • 20.System Server 进程启动过程分析 ( 续 ) • applicationInit— 调用 SystemServer.m ain
  • 21.System Server 进程启动过程分析 ( 续 ) • SystemServer.main
  • 22.System Server 进程启动过程分析 ( 续 ) • Init1— 启动 C/C++ Rutime Framework Service
  • 23.System Server 进程启动过程分析 ( 续 ) • Init2— 启动 Java Runtime Framework Service
  • 24.System Server 进程启动过程分析 ( 续 ) • ServerThread.run
  • 25.System Server 进程启动过程分析 ( 续 ) • System Server 进程启动完成后的地址空 间
  • 26.Android 应用程序进程启动过程分析 • ActivityManagerService.startProcessL ocked
  • 27.Android 应用程序进程启动过程分析 (续) • Process.start
  • 28.Android 应用程序进程启动过程分析 (续) • Process.startViaZygote
  • 29.Android 应用程序进程启动过程分析 (续) • Process.zygoteSendArgsAndGetResul t
  • 30.Android 应用程序进程启动过程分析 (续) • ZygoteConnection.runOnce
  • 31.Android 应用程序进程启动过程分析 (续) • ZygoteConnection.handleChildProc
  • 32.Android 应用程序进程启动过程分析 (续) • RuntimeInit.zygoteInit – nativeZygoteInit – applicationInit • Invoke main of ActivityThread
  • 33.Android 应用程序进程启动过程分析 (续) • ActivityThread.main
  • 34.Android 应用程序进程回收机制 • Linux 的内存回收机制 --Out of Memory Killer – 每一个进程都有一个 oom_adj 值,取值范围 [-17,1 5] ,可以通过 /proc//oom_adj 访问 – 每一个进程的 oom_adj 初始值都等于其父进程的 oo m_adj 值 – oom_adj 值越小,越不容易被杀死,其中, -17 表 示不会被杀死 – 内存紧张时, OOM Killer 统 合统 统 统 程的内存消耗量、 统统 统统 统统 CPU 时间、存活时间和 oom_adj 值来决定是否要杀 死一个进程来回收内存
  • 35.Android 应用程序进程回收机制 ( 续 ) • Android 的内存回收机制— Low Memory Ki ller – 进程的 oom_adj 值由 ActivityManagerService 根据运行在进程里面的组件的状态来计算 – 进程的 oom_adj 值取值范围为 [-16,15] , oom _adj 值越小,就不容易被杀死 – 内存统统统统 , LMK 基于 oom_adj 值来决定是否 要回收一个进程 – ActivityManagerService 和 WindowManager Service 在特定情况下也会进行进程回收
  • 36.Android 应用程序进程回收机制 ( 续 ) • LMK 的进程回收策略 – 当系统内存小于 i 时,在 oom_adj 值大于等于 j 的进程中,选择一个 oom_adj 值最大并且消 耗内存最多的进程来回收
  • 37.Android 应用程序进程回收机制 ( 续 ) • 应用程序进程的 oom_adj 值 – SYSTEM_ADJ(-16) : System Server 进程 – PERSISTENT_PROC_ADJ(-12) :android:persistent'>android:persistent