第十二板块:Android 系统启动与初始化 | 第三十篇:Zygote 孵化机制与 System Server 的启动

第十二板块:Android 系统启动与初始化 | 第三十篇:Zygote 孵化机制与 System Server 的启动

所属板块:第十二板块 --- Android 系统启动与初始化

前置知识:第二十九篇中的 Init 进程、RC 脚本、属性服务、SELinux 上下文、Linux fork/exec 机制

本篇定位 :这是 Android 系统从"裸金属"迈向"智能世界"的惊险一跃 。如果说 Init 构建了躯壳,那么 Zygote 就是 注入灵魂的母体 。本篇将彻底拆解 Zygote 的预热(Preload)机制Copy-on-Write(COW)在进程孵化中的应用Zygote Server Socket 的 IPC 模型System Server 的启动与核心服务(AMS, PMS, WMS)的初始化时序 。我们将深入 app_processZygoteInit.javaSystemServer.java,揭示 Android 如何通过"预加载"换取"秒开",以及 Java 世界是如何被构建的。全程无应用开发技巧、无启动加速指南,仅保留 Android 系统初始化的底层定义与调度规范。


1. 核心结论先行(Thesis Statement)

Android 的 Java 层启动是一个基于模板复制(Cloning)的资源复用过程

  • Zygote 的本质Java 虚拟机的母体(Root JVM) 。它在系统启动时启动,预加载了所有通用的 Framework 类、资源和 so 库。当需要新应用进程时,它通过 fork() 自我复制,从而避免了重新加载这些资源的巨大开销。
  • Copy-on-Write (COW) 的本质内存共享的魔法 。Zygote fork() 出的子进程(应用进程)最初与父进程共享同一块物理内存。只有当子进程尝试修改内存页时,内核才会为其复制一份新的物理页。这使得多个应用可以共享 Framework 代码,极大地节省了内存。
  • System Server 的本质Zygote 孵化的第一个特殊子进程。它是 Android 系统的"上帝进程",运行着所有核心系统服务(AMS, PMS, WMS 等),并通过 Binder 向应用提供服务。
  • Socket IPC 的本质Zygote 的通信契约。Zygote 启动后会监听一个 Local Socket。System Server 或 AMS 通过向这个 Socket 发送请求来命令 Zygote 孵化新进程。

2. Zygote 启动全景图

2.1 从 Init 到 Zygote 再到 System Server

#mermaid-svg-DvO75EbAH0AI6RS3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DvO75EbAH0AI6RS3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DvO75EbAH0AI6RS3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DvO75EbAH0AI6RS3 .error-icon{fill:#552222;}#mermaid-svg-DvO75EbAH0AI6RS3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DvO75EbAH0AI6RS3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DvO75EbAH0AI6RS3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DvO75EbAH0AI6RS3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DvO75EbAH0AI6RS3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DvO75EbAH0AI6RS3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DvO75EbAH0AI6RS3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DvO75EbAH0AI6RS3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DvO75EbAH0AI6RS3 .marker.cross{stroke:#333333;}#mermaid-svg-DvO75EbAH0AI6RS3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DvO75EbAH0AI6RS3 p{margin:0;}#mermaid-svg-DvO75EbAH0AI6RS3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DvO75EbAH0AI6RS3 .cluster-label text{fill:#333;}#mermaid-svg-DvO75EbAH0AI6RS3 .cluster-label span{color:#333;}#mermaid-svg-DvO75EbAH0AI6RS3 .cluster-label span p{background-color:transparent;}#mermaid-svg-DvO75EbAH0AI6RS3 .label text,#mermaid-svg-DvO75EbAH0AI6RS3 span{fill:#333;color:#333;}#mermaid-svg-DvO75EbAH0AI6RS3 .node rect,#mermaid-svg-DvO75EbAH0AI6RS3 .node circle,#mermaid-svg-DvO75EbAH0AI6RS3 .node ellipse,#mermaid-svg-DvO75EbAH0AI6RS3 .node polygon,#mermaid-svg-DvO75EbAH0AI6RS3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DvO75EbAH0AI6RS3 .rough-node .label text,#mermaid-svg-DvO75EbAH0AI6RS3 .node .label text,#mermaid-svg-DvO75EbAH0AI6RS3 .image-shape .label,#mermaid-svg-DvO75EbAH0AI6RS3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-DvO75EbAH0AI6RS3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DvO75EbAH0AI6RS3 .rough-node .label,#mermaid-svg-DvO75EbAH0AI6RS3 .node .label,#mermaid-svg-DvO75EbAH0AI6RS3 .image-shape .label,#mermaid-svg-DvO75EbAH0AI6RS3 .icon-shape .label{text-align:center;}#mermaid-svg-DvO75EbAH0AI6RS3 .node.clickable{cursor:pointer;}#mermaid-svg-DvO75EbAH0AI6RS3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DvO75EbAH0AI6RS3 .arrowheadPath{fill:#333333;}#mermaid-svg-DvO75EbAH0AI6RS3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DvO75EbAH0AI6RS3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DvO75EbAH0AI6RS3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DvO75EbAH0AI6RS3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DvO75EbAH0AI6RS3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DvO75EbAH0AI6RS3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DvO75EbAH0AI6RS3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DvO75EbAH0AI6RS3 .cluster text{fill:#333;}#mermaid-svg-DvO75EbAH0AI6RS3 .cluster span{color:#333;}#mermaid-svg-DvO75EbAH0AI6RS3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DvO75EbAH0AI6RS3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DvO75EbAH0AI6RS3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-DvO75EbAH0AI6RS3 .icon-shape,#mermaid-svg-DvO75EbAH0AI6RS3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DvO75EbAH0AI6RS3 .icon-shape p,#mermaid-svg-DvO75EbAH0AI6RS3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DvO75EbAH0AI6RS3 .icon-shape .label rect,#mermaid-svg-DvO75EbAH0AI6RS3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DvO75EbAH0AI6RS3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DvO75EbAH0AI6RS3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DvO75EbAH0AI6RS3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 核心服务
System Server 进程 (PID 3)
Zygote 进程 (PID 2)
Init 进程 (PID 1)
请求孵化 System Server
解析 init.rc
启动 zygote 服务
app_process (Native)
ZygoteInit (Java)
预加载资源
进入 Socket 监听循环
fork() 复制 Zygote
剥离 Zygote 资源
SystemServer.main()
启动核心服务
ActivityManagerService
PackageManagerService
WindowManagerService

2.2 核心组件职责表

组件 层级 职责 学术定义
app_process Native 启动器 Native 可执行文件,负责创建 JVM(ART 虚拟机)。
ZygoteInit Java 初始化器 Java 层入口,负责预加载、启动 System Server、监听 Socket。
ZygoteServer Java 通信服务 管理 Local Socket,接收孵化请求。
SystemServer Java 系统服务 上帝进程,管理所有系统级服务。
Local Socket IPC 通信通道 基于 Unix Domain Socket,用于进程间通信。

3. Zygote 的预热(Preload)机制

3.1 为什么要预加载?

如果每次启动应用都要重新加载 android.jar 中的几千个类,系统会慢得像蜗牛。

学术定义

  • 空间换时间:Zygote 在启动时把通用资源加载到内存中,后续进程通过 COW 共享这些资源。
  • 预加载内容
    1. Classes : preloaded-classes 文件中的几千个核心类(如 Activity, View, String)。
    2. Resources : com.android.internal.R 中的系统资源(布局、字符串、样式)。
    3. Shared Libraries : libandroid_runtime.so, libc.so 等 Native 库。

3.2 预加载源码解析

java 复制代码
// frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
static void preload(TimingsTraceLog bootTimingsTraceLog) {
    // 1. 预加载类
    preloadClasses();
    // 2. 预加载资源
    preloadResources();
    // 3. 预加载共享库
    preloadSharedLibraries();
}

private static void preloadClasses() {
    // 读取 /system/etc/preloaded-classes
    InputStream is = new FileInputStream("/system/etc/preloaded-classes");
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String line;
    while ((line = br.readLine()) != null) {
        // 加载类
        Class.forName(line);
    }
}

4. Zygote 的孵化(Fork)机制

4.1 Socket 通信模型

Zygote 启动后,会创建一个 LocalServerSocket,并无限循环监听。

学术定义

  • 阻塞监听select()poll() 等待 Socket 连接。
  • 请求格式:AMS 发送的请求包含 UID、GID、进程名、类名等信息。

4.2 Fork 与 COW 的魔法

当收到孵化请求时,Zygote 执行 fork()

java 复制代码
// frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java
Runnable processOneCommand(ZygoteServer zygoteServer) {
    // 1. fork 子进程
    pid = Zygote.forkAndSpecialize(...);

    if (pid == 0) {
        // 2. 子进程 (应用进程)
        handleChildProc(parsedArgs, descriptors, childPipeFd);
    } else {
        // 3. 父进程 (Zygote)
        handleParentProc(pid, serverPipeFd);
    }
}

COW 图解
#mermaid-svg-Zymra7pqm8hSRBeu{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Zymra7pqm8hSRBeu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Zymra7pqm8hSRBeu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Zymra7pqm8hSRBeu .error-icon{fill:#552222;}#mermaid-svg-Zymra7pqm8hSRBeu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Zymra7pqm8hSRBeu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Zymra7pqm8hSRBeu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Zymra7pqm8hSRBeu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Zymra7pqm8hSRBeu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Zymra7pqm8hSRBeu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Zymra7pqm8hSRBeu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Zymra7pqm8hSRBeu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Zymra7pqm8hSRBeu .marker.cross{stroke:#333333;}#mermaid-svg-Zymra7pqm8hSRBeu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Zymra7pqm8hSRBeu p{margin:0;}#mermaid-svg-Zymra7pqm8hSRBeu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Zymra7pqm8hSRBeu .cluster-label text{fill:#333;}#mermaid-svg-Zymra7pqm8hSRBeu .cluster-label span{color:#333;}#mermaid-svg-Zymra7pqm8hSRBeu .cluster-label span p{background-color:transparent;}#mermaid-svg-Zymra7pqm8hSRBeu .label text,#mermaid-svg-Zymra7pqm8hSRBeu span{fill:#333;color:#333;}#mermaid-svg-Zymra7pqm8hSRBeu .node rect,#mermaid-svg-Zymra7pqm8hSRBeu .node circle,#mermaid-svg-Zymra7pqm8hSRBeu .node ellipse,#mermaid-svg-Zymra7pqm8hSRBeu .node polygon,#mermaid-svg-Zymra7pqm8hSRBeu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Zymra7pqm8hSRBeu .rough-node .label text,#mermaid-svg-Zymra7pqm8hSRBeu .node .label text,#mermaid-svg-Zymra7pqm8hSRBeu .image-shape .label,#mermaid-svg-Zymra7pqm8hSRBeu .icon-shape .label{text-anchor:middle;}#mermaid-svg-Zymra7pqm8hSRBeu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Zymra7pqm8hSRBeu .rough-node .label,#mermaid-svg-Zymra7pqm8hSRBeu .node .label,#mermaid-svg-Zymra7pqm8hSRBeu .image-shape .label,#mermaid-svg-Zymra7pqm8hSRBeu .icon-shape .label{text-align:center;}#mermaid-svg-Zymra7pqm8hSRBeu .node.clickable{cursor:pointer;}#mermaid-svg-Zymra7pqm8hSRBeu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Zymra7pqm8hSRBeu .arrowheadPath{fill:#333333;}#mermaid-svg-Zymra7pqm8hSRBeu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Zymra7pqm8hSRBeu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Zymra7pqm8hSRBeu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Zymra7pqm8hSRBeu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Zymra7pqm8hSRBeu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Zymra7pqm8hSRBeu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Zymra7pqm8hSRBeu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Zymra7pqm8hSRBeu .cluster text{fill:#333;}#mermaid-svg-Zymra7pqm8hSRBeu .cluster span{color:#333;}#mermaid-svg-Zymra7pqm8hSRBeu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Zymra7pqm8hSRBeu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Zymra7pqm8hSRBeu rect.text{fill:none;stroke-width:0;}#mermaid-svg-Zymra7pqm8hSRBeu .icon-shape,#mermaid-svg-Zymra7pqm8hSRBeu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Zymra7pqm8hSRBeu .icon-shape p,#mermaid-svg-Zymra7pqm8hSRBeu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Zymra7pqm8hSRBeu .icon-shape .label rect,#mermaid-svg-Zymra7pqm8hSRBeu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Zymra7pqm8hSRBeu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Zymra7pqm8hSRBeu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Zymra7pqm8hSRBeu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 应用进程 2
应用进程 1
Zygote 进程
物理内存
Page 1: libandroid_runtime.so
Page 2: framework-res.apk
Page 3: Activity.class
虚拟地址 A -> Page 1
虚拟地址 B -> Page 2
虚拟地址 C -> Page 3
虚拟地址 A -> Page 1 (共享)
虚拟地址 B -> Page 2 (共享)
虚拟地址 C -> Page 3 (共享)
虚拟地址 A -> Page 1 (共享)
虚拟地址 B -> Page 2 (共享)
虚拟地址 C -> Page 3 (共享)

学术定义

  • 只读共享:所有应用进程共享 Framework 的代码段(Text Segment)。
  • 写时复制:当应用修改自己的数据(如创建新对象),内核会为该应用复制一份新的物理页,其他应用不受影响。

5. System Server 的启动与初始化

5.1 System Server 的特殊性

System Server 不是普通应用,它是 Zygote 孵化的第一个进程,且没有 UI。

启动命令

rc 复制代码
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

5.2 System Server 的初始化时序

System Server 的 main() 方法非常复杂,分为三个阶段:

阶段 类名 职责 学术定义
1. 初始化 SystemServer 创建 Looper、加载库 准备 Java 运行环境。
2. 启动服务 SystemServiceManager 启动引导服务 启动 ActivityManagerService, PackageManagerService, DisplayManagerService
3. 系统就绪 ActivityManagerService 启动系统 UI 启动 SystemUI,启动 Launcher。

5.3 核心服务的启动逻辑

java 复制代码
// frameworks/base/services/java/com/android/server/SystemServer.java
public static void main(String[] args) {
    new SystemServer().run();
}

private void run() {
    // 1. 初始化系统上下文
    createSystemContext();

    // 2. 启动服务
    startBootstrapServices(); // AMS, PMS, WMS
    startCoreServices();      // BatteryService, UsageStatsService
    startOtherServices();     // InputManagerService, WindowManagerService

    // 3. 系统就绪
    mActivityManagerService.systemReady(() -> {
        // 启动 Home Activity
        startHomeActivityLocked(currentUserId, "systemReady");
    });
}

6. 关键源码深度解析

6.1 Zygote 的 Socket 监听

java 复制代码
// frameworks/base/core/java/com/android/internal/os/ZygoteServer.java
void runSelectLoop(String abiList) {
    while (true) {
        // 1. 等待连接
        StructPollfd[] pollFds = new StructPollfd[mZygoteSocket.getFileDescriptor()];
        Os.poll(pollFds, -1);

        // 2. 接受连接
        ZygoteConnection connection = acceptCommandPeer(abiList);

        // 3. 处理命令
        connection.processOneCommand(this);
    }
}

6.2 AMS 请求孵化应用

java 复制代码
// frameworks/base/services/core/java/com/android/server/am/ProcessList.java
private Process.ProcessStartResult startProcessLocked(...) {
    // 1. 构建参数
    String[] args = {"--runtime-args", "--setuid=" + uid, "--setgid=" + gid, "--nice-name=" + niceName};

    // 2. 连接 Zygote Socket
    LocalSocket socket = connectToZygote(abi);

    // 3. 发送请求
    socket.getOutputStream().write(args);

    // 4. 等待返回 PID
    int pid = readPid(socket.getInputStream());
    return new Process.ProcessStartResult(pid);
}

7. 启动过程中的常见误区

误区 学术解释
Zygote 会复制所有内存 错误。使用 COW,只复制修改的部分。
System Server 是 Zygote 的克隆 错误。System Server 是 Zygote 的子进程,但剥离了大部分预加载资源,专注于系统服务。
应用进程启动很慢 相对。没有 Zygote,启动会更慢。慢通常是因为 dex2oat 编译或应用自身初始化过重。
预加载越多越好 错误。预加载过多会占用过多内存,导致系统可用内存减少,引发 LMK(低内存杀手)。

8. 本篇总结(Knowledge Closure)

关键点 纯学术定义
Zygote 的本质 Java 虚拟机母体,通过预加载和 COW 实现资源复用。
COW 机制 内核级的内存共享技术,实现多进程共享 Framework 代码。
System Server 上帝进程,负责启动和管理所有系统服务。
Socket IPC Zygote 与 AMS 之间的通信契约,用于传递孵化请求。
启动时序 Init -> Zygote -> System Server -> AMS -> System UI -> Launcher。

9. 第十二板块结语

至此,第十二板块:Android 系统启动与初始化 已全部完结。

我们从 Init 进程的双分叉 出发,深入 RC 脚本的解析引擎 ,探索 属性服务的全局控制 ,最终抵达 Zygote 的孵化机制与 System Server 的诞生

我们揭示了 Android 系统启动的核心逻辑:用 Init 构建骨架,用 Zygote 复制灵魂,用 System Server 编织神经系统。

下一篇预告第十三板块:Android 综合架构与未来演进 | 第三十一篇:Android 架构演进与 Fuchsia OS 的挑战

相关推荐
故渊at1 小时前
第十二板块:Android 系统启动与初始化 | 第二十九篇:Init 进程、RC 脚本与属性服务(Property Service)
android·linux·内存映射·权限控制·init进程·rc脚本·属性服务
故渊at1 小时前
第十三板块:Android 综合架构与未来演进 | 第三十二篇:Android 内存管理与 LMK 机制的深度剖析
android·架构·内存管理·内存回收·lmk机制·收割算法
故渊at1 小时前
第十一板块:Android 跨进程通信与 Binder 深度剖析 | 第二十七篇:Binder 线程池与死亡通知(Death Recipient)机制
android·binder·线程池·死亡通知·跨进程通讯
jushi89991 小时前
FB Neo 街机模拟器全游戏整合版 含25000+街机游戏怀旧复古街机游戏 解压即玩 热门怀旧街机游戏全集安卓+PC电脑版
android·游戏·电脑
vensli1 小时前
体验专题——Android 应用瘦身实战
android·网络
AFinalStone1 小时前
Android12 U盘插拔链路源码全解析(七):应用层 —— MediaScanner与SAF
android·frameworks
AI玫瑰助手2 小时前
Python模块:import导入模块与模块的搜索路径
android·开发语言·python
yewq-cn2 小时前
Android Log System
android
问心无愧05133 小时前
ctf show web入门107
android·前端·笔记·android studio