diff --git a/README.md b/README.md index c59fd4d..53094a4 100644 --- a/README.md +++ b/README.md @@ -58,37 +58,37 @@ Class 文件格式 ​ [Class 文件格式总览](https://github.com/Omooo/Android-Notes/blob/master/blogs/JVM/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%20Class%20%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F/Class%20%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E6%80%BB%E8%A7%88.md) -​ [常量池及相关内容](https://github.com/Omooo/Android-Notes/blob/master/blogs/JVM/深入理解 Class 文件格式/常量池及相关内容.md) +​ [常量池及相关内容](https://github.com/Omooo/Android-Notes/blob/master/blogs/JVM/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%20Class%20%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F/%E5%B8%B8%E9%87%8F%E6%B1%A0%E5%8F%8A%E7%9B%B8%E5%85%B3%E5%86%85%E5%AE%B9.md) ​ [属性介绍] ##### 性能优化 -[I/O 优化](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/I%5CO%20%E4%BC%98%E5%8C%96.md) +[I/O 优化] -[UI 优化](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/UI%20%E4%BC%98%E5%8C%96.md) +[UI 优化] [内存优化](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96.md) [包体积优化](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E5%8C%85%E4%BD%93%E7%A7%AF%E4%BC%98%E5%8C%96.md) -[卡顿优化](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E5%8D%A1%E9%A1%BF%E4%BC%98%E5%8C%96.md) +[卡顿优化] -[启动优化](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E5%90%AF%E5%8A%A8%E4%BC%98%E5%8C%96.md) +[启动优化] [存储优化](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E5%AD%98%E5%82%A8%E4%BC%98%E5%8C%96.md) -[崩溃优化](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E5%B4%A9%E6%BA%83%E4%BC%98%E5%8C%96.md) +[崩溃优化] -[电量优化](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E7%94%B5%E9%87%8F%E4%BC%98%E5%8C%96.md) +[电量优化] #### Framework -[Android 系统架构](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/Framework/Android 系统架构.md) +[Android 系统架构](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/Framework/Android%20%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84.md) -[Android 系统启动](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/Framework/Android 系统启动.md) +[Android 系统启动](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/Framework/Android%20%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8.md) #### Java 基础 @@ -118,7 +118,7 @@ Class 文件格式 [并发编程的万能钥匙 - 管程 ( Monitor )](https://github.com/Omooo/Android-Notes/blob/master/blogs/Java/%E5%B9%B6%E5%8F%91/%E7%AE%A1%E7%A8%8B(Monitor).md) -[Lock 和 Condition](https://github.com/Omooo/Android-Notes/blob/master/blogs/Java/并发/Lock 和 Condition.md) +[Lock 和 Condition](https://github.com/Omooo/Android-Notes/blob/master/blogs/Java/%E5%B9%B6%E5%8F%91/Lock%20%E5%92%8C%20Condition.md) #### JVM diff --git a/blogs/Android/Framework/Android 系统启动.md b/blogs/Android/Framework/Android 系统启动.md index 5c5a6d1..f803a91 100644 --- a/blogs/Android/Framework/Android 系统启动.md +++ b/blogs/Android/Framework/Android 系统启动.md @@ -44,7 +44,48 @@ init 进程主要做了以下三件事: #### Zygote 进程启动过程 -在 Android 系统中,DVM 和 ART、应用程序进程以及运行系统的关键服务的 SystemServer 进程都是由 Zygote 进程来创建的,我们也将它称为孵化器。它通过 fork 的形式来创建应用程序进程和 SystemServer 进程。 +在 Android 系统中,DVM 和 ART、应用程序进程以及运行系统的关键服务的 SystemServer 进程都是由 Zygote 进程来创建的,我们也将它称为孵化器。它通过 fork 的形式来创建应用程序进程和 SystemServer 进程。由于 Zygote 进程在启动时会创建 DVM 或者 ART,因此通过 fork 而创建的应用程序进程和 SystemServer 进程可以在内部获取一个 DVM 或者 ART 的实例副本。 + +我们知道,Zygote 进程是在 init 进程启动时创建的,起初 Zygote 进程的名字并不是叫 zygote,而是叫 app_process,这个名称是在 Android.mk 中定义的,Zygote 进程启动后,Linux 系统下的 pctrl 系统会调用 app_process,将其名称换成了 zygote。 + +Zygote 进程都是通过 fork 自身来创建子进程的。再通过 JNI 调用 ZygoteInit 的 main 方法后,Zygote 便进入了 Java 框架层,此前是没有任何代码进入 Java 框架层的,也就是说,Zygote 开创了 Java 框架层。 + +ZygoteInit#main: + +```java + public static void main(String argv[]) { + //... + try { + //... + //1. 创建一个 Server 端的 Socket,socketName 为 zygote + zygoteServer.registerServerSocketFromEnv(socketName); + + if (!enableLazyPreload) { + bootTimingsTraceLog.traceBegin("ZygotePreload"); + EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START, + SystemClock.uptimeMillis()); + //2. 预加载资源和类 + preload(bootTimingsTraceLog); + EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END, + SystemClock.uptimeMillis()); + bootTimingsTraceLog.traceEnd(); // ZygotePreload + } else { + Zygote.resetNicePriority(); + } + //... + if (startSystemServer) { + //3. 启动 SystemServer 进程 + Runnable r = forkSystemServer(abiList, socketName, zygoteServer); + //4. 等待 AMS 请求 + caller = zygoteServer.runSelectLoop(abiList); + } catch (Throwable ex) { + Log.e(TAG, "System zygote died with exception", ex); + throw ex; + } finally { + zygoteServer.closeServerSocket(); + } + } +``` **总结:** diff --git a/blogs/Android/Framework/应用程序进程启动过程.md b/blogs/Android/Framework/应用程序进程启动过程.md new file mode 100644 index 0000000..ccf6f63 --- /dev/null +++ b/blogs/Android/Framework/应用程序进程启动过程.md @@ -0,0 +1,31 @@ +--- +应用程序进程启动过程 +--- + +#### 目录 + +1. 应用程序进程简介 +2. 应用程序进程启动过程 +3. Binder 线程池启动过程 +4. 消息循环创建过程 + +#### 应用程序进程简介 + +要想启动一个应用程序,首先要保证这个应用程序所需要的应用程序进程已经启动。AMS 在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求 Zygote 进程启动需要的应用程序进程。Zygote 的 Java 框架层中会创建一个 Server 端的 Socket,这个 Socket 用来等待 AMS 请求 Zygote 来创建新的应用程序进程。Zygote 进程通过 fork 自身创建应用程序进程,这样应用程序进程就获得了 Zygote 进程在启动时创建的虚拟机实例。当然,在应用程序进程创建过程中除了获取虚拟机实例外,还创建了 Binder 线程池和消息循环,这样运行在应用程序进程中的应用程序就可以使用 Binder 进行进程间通信以及消息处理了。 + +#### 应用程序进程启动过程 + +启动过程可以分为两步: + +1. AMS 发送启动应用程序进程的请求 + + AMS 如果想要启动应用程序进程,就需要向 Zygote 进程发送创建应用程序进程的请求,AMS 会通过调用 startProcessLocked 方法向 Zygote 进程发送请求。 + +2. Zygote 接受请求并创建应用程序进程 + +#### Binder 线程池启动过程 + + + +#### 消息循环创建过程 +