Android FrameWork - 开机启动 SystemServer 进程

Android系统启动流程(七)——SystemServer进程(基于Android13) SystemServer是重要的进程,该进程中运行了AMS、PMS等重要的系统服务SystemServer进程由zygote fork而出SystemServer执行完加载系统服务后,进入死循环接收消息。 阅读详情

基于安卓 12 源码分析

相关类:

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

frameworks/base/core/java/com/android/internal/os/Zygote.java

frameworks/base/core/java/com/android/internal/os/RuntimeInit.java

frameworks/base/services/java/com/android/server/SystemServer.java

frameworks/base/core/jni/AndroidRuntime.cpp

frameworks/base/cmds/app_process/app_main.cpp

frameworks/base/core/java/android/os/ServiceManager.java

frameworks/base/services/core/java/com/android/server/SystemServiceManager.java

在 ZygoteInit.java 的 main 方法中,启动了 SystemServer 进程:

if (startSystemServer) {
    Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
    // {@code r == null} in the parent (zygote) process, and {@code r != null} in the
    // child (system_server) process.
    if (r != null) {
        r.run();
        return;
    }
}

forkSystemServer 源码:

    private static Runnable forkSystemServer(String abiList, String socketName,
            ZygoteServer zygoteServer) {
        //  定义 system_server 进程所需的能力(Linux capabilities)
        //  这些能力决定了该进程可以执行哪些特权操作
        long capabilities = posixCapabilitiesAsBits(
                OsConstants.CAP_IPC_LOCK,// 锁定内存,防止被换出
                OsConstants.CAP_KILL,
                OsConstants.CAP_NET_ADMIN,
                OsConstants.CAP_NET_BIND_SERVICE,
                OsConstants.CAP_NET_BROADCAST,// 发送广播包
                OsConstants.CAP_NET_RAW,
                OsConstants.CAP_SYS_MODULE,
                OsConstants.CAP_SYS_NICE,
                OsConstants.CAP_SYS_PTRACE,
                OsConstants.CAP_SYS_TIME,// 修改系统时间
                OsConstants.CAP_SYS_TTY_CONFIG,
                OsConstants.CAP_WAKE_ALARM,// 设置唤醒闹钟
                OsConstants.CAP_BLOCK_SUSPEND
        );
        /* Containers run without some capabilities, so drop any caps that are not available. */
        StructCapUserHeader header = new StructCapUserHeader(
                OsConstants._LINUX_CAPABILITY_VERSION_3, 0);
        StructCapUserData[] data;
        try {
            data = Os.capget(header);
        } catch (ErrnoException ex) {
            throw new RuntimeException("Failed to capget()", ex);
        }
        capabilities &= ((long) data[0].effective) | (((long) data[1].effective) << 32);

        /* Hardcoded command line to start the system server */
        // 构造启动 system_server 的参数(硬编码,不可外部修改)
        String[] args = {
                "--setuid=1000", // UID 1000 = system 用户
                "--setgid=1000", // GID 1000 = system 组
                "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
                        + "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010,3011,3012",
                "--capabilities=" + capabilities + "," + capabilities,
                "--nice-name=system_server",
                "--runtime-args",
                "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
                "com.android.server.SystemServer",// 要启动的主类
        };
        ZygoteArguments parsedArgs;

        int pid;

        try {
            // 将字符串参数解析为 ZygoteArguments 对象
            ZygoteCommandBuffer commandBuffer = new ZygoteCommandBuffer(args);
            try {
                parsedArgs = ZygoteArguments.getInstance(commandBuffer);
            } catch (EOFException e) {
                throw new AssertionError("Unexpected argument error for forking system server", e);
            }
            commandBuffer.close();
            Zygote.applyDebuggerSystemProperty(parsedArgs);
            Zygote.applyInvokeWithSystemProperty(parsedArgs);

            if (Zygote.nativeSupportsMemoryTagging()) {
                /* The system server has ASYNC MTE by default, in order to allow
                 * system services to specify their own MTE level later, as you
                 * can't re-enable MTE once it's disabled. */
                String mode = SystemProperties.get("arm64.memtag.process.system_server", "async");
                if (mode.equals("async")) {
                    parsedArgs.mRuntimeFlags |= Zygote.MEMORY_TAG_LEVEL_ASYNC;
                } else if (mode.equals("sync")) {
                    parsedArgs.mRuntimeFlags |= Zygote.MEMORY_TAG_LEVEL_SYNC;
                } else if (!mode.equals("off")) {
                    /* When we have an invalid memory tag level, keep the current level. */
                    parsedArgs.mRuntimeFlags |= Zygote.nativeCurrentTaggingLevel();
                    Slog.e(TAG, "Unknown memory tag level for the system server: "" + mode + """);
                }
            } else if (Zygote.nativeSupportsTaggedPointers()) {
                /* Enable pointer tagging in the system server. Hardware support for this is present
                 * in all ARMv8 CPUs. */
                parsedArgs.mRuntimeFlags |= Zygote.MEMORY_TAG_LEVEL_TBI;
            }

            // ...

            // 调用 native 层 fork 出 system_server 进程
            pid = Zygote.forkSystemServer(
                    parsedArgs.mUid, parsedArgs.mGid,
                    parsedArgs.mGids,
                    parsedArgs.mRuntimeFlags,
                    null,
                    parsedArgs.mPermittedCapabilities,
                    parsedArgs.mEffectiveCapabilities);
        } catch (IllegalArgumentException ex) {
            throw new RuntimeException(ex);
        }

        /* For child process */
        // fork 返回后,区分父子进程
        // pid == 0 表示当前在 **子进程(system_server)** 中运行
        if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }
            // 关闭 Zygote 的 socket(子进程不需要监听新请求)
            zygoteServer.closeServerSocket();

            // 真正进入 SystemServer.main(),启动各种系统服务。
            return handleSystemServerProcess(parsedArgs);
        }

        return null;
    }

Zygote.forkSystemServer 源码:

frameworks/base/core/java/com/android/internal/os/Zygote.java

    static int forkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
            int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
        ZygoteHooks.preFork();

        int pid = nativeForkSystemServer(
                uid, gid, gids, runtimeFlags, rlimits,
                permittedCapabilities, effectiveCapabilities);

        // Set the Java Language thread priority to the default value for new apps.
        Thread.currentThread().setPriority(Thread.NORM_PRIORITY);

        ZygoteHooks.postForkCommon();
        return pid;
    }

    private static native int nativeForkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
            int[][] rlimits, long permittedCapabilities, long effectiveCapabilities);

nativeForkSystemServer 是实现在 以下文件中:

frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

前景回顾:

在前面分析 AndroidRuntime::start 代码时,我们知道 startReg 就是注册 JNI 方法 的

// frameworks/base/core/jni/AndroidRuntime.cpp
void AndroidRuntime::start(...) {
    ...
    JniInvocation jni_invocation;
    jni_invocation.Init(NULL);
    JNIEnv* env;
    if (startVm(&mJavaVM, &env, zygote) != 0) {
        return;
    }
    ...
    // 注册 JNI 方法,包括 com_android_internal_os_Zygote.cpp 里的 native 方法
    if (startReg(env) < 0) {
        return;
    }
    ...
}

startReg(env) 会调用 register_jni_procs 加载一系列 cpp 文件 其中就包括 register_com_android_internal_os_Zygote:

// frameworks/base/core/jni/AndroidRuntime.cpp
int register_jni_procs(...) {
    ...
    REG_JNI(register_com_android_internal_os_Zygote),
    ...
}

nativeForkSystemServer 关键源码:

// com_android_internal_os_Zygote.cpp
static jint com_android_internal_os_Zygote_nativeForkSystemServer(
        JNIEnv* env, jclass, jint uid, jint gid, jintArray gids,
        jint runtime_flags, jobjectArray rlimits,
        jlong permittedCapabilities, jlong effectiveCapabilities) {

    pid_t pid = zygote::ForkCommon(env, /*is_system_server=*/true, ...);

    if (pid == 0) {
        // 子进程逻辑:进入 system_server
    } else if (pid > 0) {
        // 父进程逻辑
    }
    // 返回 pid 给 Java 层
    return pid;
}

可以看到 nativeForkSystemServer 最终会调用 ForkCommon() → 里面再去调用 Linux 的 fork() 系统调用。

呃… 分析岔劈了…

在安卓 10 之前,启动系统服务是通过 ZygoteInit 中抛出一个特殊的异常 ZygoteInit.MethodAndArgsCaller,最后在 catch 里调用 main()。到 Android 12 已经变成 直接 return Runnable, 所以应该去找到这个 Runnable。


在 ZygoteInit.java 的 forkSystemServer 方法中,SystemServer 进程调用了 handleSystemServerProcess 去启动 系统服务:

    private static Runnable forkSystemServer(String abiList, String socketName,
            ZygoteServer zygoteServer) {

        // ...

        /* For child process */
        if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }

            zygoteServer.closeServerSocket();
            return handleSystemServerProcess(parsedArgs);
        }

        return null;
    }

接着在 handleSystemServerProcess 中 调用 zygoteInit:

    private static Runnable handleSystemServerProcess(ZygoteArguments parsedArgs) {

        //...

            /*
             * Pass the remaining arguments to SystemServer.
             */
            // 启动 runtime
            return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,
                    parsedArgs.mDisabledCompatChanges,
                    parsedArgs.mRemainingArgs, cl);
        }

        /* should never reach here */
    }

继续调用 RuntimeInit.applicationInit:

    public static Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges,
            String[] argv, ClassLoader classLoader) {
        if (RuntimeInit.DEBUG) {
            Slog.d(RuntimeInit.TAG, "RuntimeInit: Starting application from zygote");
        }

        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ZygoteInit");
        RuntimeInit.redirectLogStreams();

        RuntimeInit.commonInit();
        ZygoteInit.nativeZygoteInit();//进入 binder、signal 等 native 初始化(对应 app_main.cpp 的 onZygoteInit)
        return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv,
                classLoader);
    }

然后来到 RuntimeInit.java 中的 applicationInit:

frameworks/base/core/java/com/android/internal/os/RuntimeInit.java

protected static Runnable applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) {
    final Arguments args = new Arguments(argv);

    return findStaticMain(args.startClass, args.startArgs, classLoader);
}

这里会解析参数,找到启动类:com.android.server.SystemServer,记住这里的 所有参数就是上面的 构造启动 system_server 的参数,包括写死的 com.android.server.SystemServer

findStaticMain():

private static Runnable findStaticMain(String className, String[] argv, ClassLoader classLoader) {
    Class<?> cl = Class.forName(className, true, classLoader);
    Method m = cl.getMethod("main", new Class[] { String[].class });
    return new MethodAndArgsCaller(m, argv);
}

构造一个 MethodAndArgsCaller (实现了 Runnable) ,持有 SystemServer.main() 的反射方法。

MethodAndArgsCaller:

static class MethodAndArgsCaller implements Runnable {
    private final Method mMethod;
    private final String[] mArgs;

    public MethodAndArgsCaller(Method method, String[] args) {
        mMethod = method;
        mArgs = args;
    }

    public void run() {
        try {
            mMethod.invoke(null, new Object[] { mArgs });
        } catch (InvocationTargetException ex) {
            ...
        }
    }
}

回到 ZygoteInit.main():

Runnable r = forkSystemServer(...);
if (r != null) {
    r.run();   // <--- 这里直接执行 SystemServer.main()
}

至此调用链为:

ZygoteInit.main()   [frameworks/base/core/java/com/android/internal/os/ZygoteInit.java]
   -> forkSystemServer()
       -> handleSystemServerProcess()
           -> ZygoteInit.zygoteInit()
               -> RuntimeInit.applicationInit()
                   -> RuntimeInit.findStaticMain()
                       -> new MethodAndArgsCaller(SystemServer.main)
   -> r.run()  // MethodAndArgsCaller.run()
       -> SystemServer.main()  [frameworks/base/services/java/com/android/server/SystemServer.java]

SystemServer.main():

frameworks/base/services/java/com/android/server/SystemServer.java

public static void main(String[] args) {
    new SystemServer().run();
}
    private void run() {
        TimingsTraceAndSlog t = new TimingsTraceAndSlog();
        try {
            //...

            // 主线程 looper
            Looper.prepareMainLooper();
            Looper.getMainLooper().setSlowLogThresholdMs(
                    SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);

            //...

            // Initialize native services.
            System.loadLibrary("android_servers");

            //...
            
            // 初始化系统上下文环境
            createSystemContext();

            //...
            // 创建系统服务管理
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setStartInfo(mRuntimeRestart,
                    mRuntimeStartElapsedTime, mRuntimeStartUptime);
            mDumper.addDumpable(mSystemServiceManager);

            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
            
        // 启动各种服务
        try {
            t.traceBegin("StartServices");
            startBootstrapServices(t);
            startCoreServices(t);
            startOtherServices(t);
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            t.traceEnd(); // StartServices
        }

        //...
            
        // Loop forever.
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

这个 run() 方法是 system_server 进程启动后执行的主逻辑,负责:

  • 初始化系统运行环境
  • 启动数百个系统服务(如 ActivityManager、PackageManager、PowerManager 等)
  • 建立主线程 Looper 循环,使系统持续运行

还有一个重要的地方,就是 binder 线程池的启动,启动binder 线程池后SystemServer进程就可以与其他进程进行通信了,在之前的安卓源码中,binder 线程池的启动都是放在启动 SystemServer 时创建的,而安卓 12 是在

Zygote 初始化阶段启动!

流程如下:

ZygoteInit.java
    ↓ nativeZygoteInit() (JNI)
    ↓
AndroidRuntime.cpp
    ↓ com_android_internal_os_ZygoteInit_nativeZygoteInit()
    ↓ gCurRuntime->onZygoteInit()  ← 虚函数调用
    ↓
AppRuntime.cpp (app_main.cpp)
    ↓ AppRuntime::onZygoteInit()
    ↓ ProcessState::self()->startThreadPool()
    ↓
Binder 驱动开始监听 /dev/binder

SystemServiceManager 和 ServiceManager:

在SystemServer 中创建了这两个类,使用 如下:

SystemServiceManager.startService()
ServiceManager.addService()

SystemServiceManager 功能是在 SystemServer 进程内部启动一个服务对象,让它运行起来,具备自己的逻辑。

ServiceManager 功能是注册 Binder IPC 接口,让其他进程能通过 binder 与该服务交互。

系统服务启动后都会交给 ServiceManager 来管理,另外ServiceManager 是 Android 的系统服务目录,SystemServer 把它创建的服务注册到 ServiceManager,以便其他进程通过名字找到并通信。管理着 SystemServer 对外暴露的所有服务入口。

最后,SystemServer进程被创建后,主要做了如下工作:

  1. 创建SystemServiceManager,其用于对系统的服务进行创建、启动和生命周期管理。
  2. 启动各种系统服务。
Android高工必备:说说从手机开机到APP启动FrameWork层的整体执行流程 先看流程图: 开机加电后,CPU先执行预设代码、加载ROM中的引导程序Bootloader和Linux内核到RAM内存中去,然后初始化各种软硬件环境、加载驱动程序、挂载根文件系统,执行init进程。 init进程会启动各种系统本地服务,如SM(ServiceManager)、MS(Media Server)、bootanim(开机动画)等,然后init进程会在解析init.rc文件后fork()出Zygoto进程。 Zygote会启动Java虚拟机,通过jni进入Zygote的java代码中,并创建soc 阅读详情

相关推荐

Android系统开机时间优化-实践篇(一)

优化前的状态: 裁剪多余的原生apk和资源文件、部分耗时动作等,并修改log输出等级。 目前状态:经过深度优化,启动时间只需要"优化前的状态"的一半。 要求:必须有开机logo和开机视频动画,启动完成的标志是,能够立刻操作界面和使用功能。

hwj的博客 2266

Android FrameWork(二)SystemServer(上)

上次在写init和zygote的时候,说起过,SystemServer是Android系统的系统服务模块,主要功能是管理Android的system service。system_server进程是zygote进程通过fork方法创造出来的第一个子进程,而且当system_server进程启动失败时会导致zygote进程自杀重启。今天,看一下SystemServer的启动过程。 一.Zy...

zhaojun的博客 2万+

Android 14.0 framework中开机启动之SystemServer相关源码分析

在14.0的系统rom定制化开发中,systemserver进程也是非常重要的,system_server 进程承载着整个framework的核心服务, 例如创建 ActivityManagerService、PowerManagerService、DisplayManagerService、PackageManagerService、WindowManagerService、 LauncherAppsService等80多个核心系统服务。这些服务以不同的线程方式存在于system_server这个进程

安卓兼职framework和app工程师的博客 513

Android FrameWork--SytemServer进程fork

在Linux平台我们可以通过fork系统调用来创建一个新的进程,这个新的进程将会拥有原始进程的一份副本,包括代码、数据、内存等等。唯一的区别是新的进程拥有一个新的ID,使得它成为一个独立的进程,运行自己的代码。 fork()系统调用会返回两次,在原始进程中会返回进程ID,在新的进程中会返回0。两个进程可以执行相同的任务,也可以按照需要执行不同的代码。

yihanss的博客 235

芯片级IO (Pad) Ring &IP Checklist

芯片级IO Ring,PAD Ring 和IP Checklist检查项目

weixin_37584728的博客 3572

Qt OpenGL 3D 点云数据显示

在Qt中使用OpenGL显示3D点云数据是一个常见的需求,特别是在计算机视觉、机器人学和三维重建等领域。下面我将介绍一个基本的实现方案。

深之JohnChen的专栏 1239

Android 10.0 系统启动之SystemServer进程-[Android取经之路]

摘要:上一节讲解了Zygote进程的整个启动流程。Zygote是所有应用的鼻祖。SystemServer和其他所有Dalivik虚拟机进程都是由Zygote fork而来。Zygote fork的第一个进程就是SystemServer,其在手机中的进程名为 system_server。 阅读本文大约需要花费50分钟。 文章的内容主要还是从源码进行分析,虽然又臭又长,但是如果想要学习...

IngresGe 的专栏 1万+

在Jetson Orin (Arm64)上从Ubuntu22.04回退至20.04的完整指南及ROS-noetic适配方案

本文提供了在Jetson Orin (Arm64)设备上将Ubuntu 22.04系统回退至20.04 LTS版本的完整操作指南。针对机器人开发中ROS-noetic对Ubuntu20.04的官方最佳支持,详细阐述了从关键备份、软件源与APT优先级配置、系统降级执行到后续问题排查的全过程,并附带了在Arm64架构上成功安装和验证ROS-noetic的适配方案,旨在为开发者构建稳定可靠的机器人开发环境。

flower的专栏 580

AOSP 8.0 系统启动之五systemserver启动(一)

SystemServer就是系统用来启动Framework核心service的入口,如AMS,PMS,WMS等。Android系统在启动的时候, 在启动两个重要的进程,一个是zygote进程另一个是由zygote进程fork出来的system_server进程;

shenxiaolinil的专栏 627

【软考高级架构设计师】——2025年上半年软考真题(回忆版)

a)异构计算和算法优化b)资源抽象和容器控制c)安全和隔离(大致是这个意思)

小志的博客 4831

OpenClaw一人公司落地案例:本地商家营销智能体月赚3万的秘密

角色:本地商家营销专家## 核心目标为商家生成高转化率的抖音营销策略,最大化 ROI。## 输入数据- 商家名称: "XX奶茶店"- 过去 30 天视频播放量: 12,000- 客单价: 28 元- 竞品平均播放量: 15,000- 市场趋势: rising## 策略生成规则1. **内容类型**:根据客单价推荐- < 30 元:美食探店 + 优惠券- > 30 元:场景化故事 + 会员权益2. **发布时间**:根据历史数据- 18:00-20:00 高峰期。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 542

Android Framework - 开机启动 SystemServer 进程

相关文章链接: 1. Android FrameWork - 学习启动篇 3. Android FrameWork - 开机启动 Zygote 进程 相关源码文件: /frameworks/base/core/java/com/android/internal/os/ZygoteInit.java /frameworks/base/core/java/com/android/internal/os...

z240336124的专栏 2794

2.Vivado软件基础操作

在本章节,我们以一个简单的计数器实例,介绍FPGA开发软件Vivado的基础操作流程,计数器实例程序的设计,在本课程中先不同掌握,后续课程将针对verilog编程进行讲解。 打开Vivado软件,会看到如下的界面: 点击如下图所示的: 点击Next> 将这个地方,设置路径,注意路径必须是英文路径。且文件夹名称第一个字符不能为数字。所有路径的名称的字符数量不能超过144个符号。 点击Next> 点击Next> 点...

FPGA/MATLAB学习教程/源码/项目合作开发 4480

深入Android S(12.0)探索Framework之SystemServer进程的启动详解

SystemServer 作为 Zygote 进程 fork 出的第一个进程,其进程名为:system_server。其承载着整个 Framework 的核心服务,如创建并启动 ActivityManagerService、PackageManagerService、WindowManagerService、InputManagerService 等 90 多个核心系统服务。接下来一起深入学习一下 SystemServer 进程的创建与启动流程。

neuHenry 1251

30、电力生产系统中的效率测量

本文探讨了如何使用数据包络分析(DEA)模型来评估电力生产系统的效率。文章详细介绍了电力生产系统的三个主要环节——发电、输电和配电,并通过多种DEA模型,如输入导向模型、输出导向模型以及基于松弛的SBM模型,展示了效率测量的方法和技术。同时,结合实际案例分析,说明了DEA模型在识别效率低下环节及提出改进建议方面的应用价值。

rgv2345678的博客 117

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java 启动系统服务,启动SystemServer的进程:启动各种系统服务

带着问题去思考,可能会好一点?img三个为什么?流程图Android的开机流程图是由下往上看的,从Loader-->Kernel--->C++ Framework---->Android Framework----->App应用img开机流程图从开机到SystemServer系统服务启动概述(全文分析围绕的重点!!!)Loader:当设备主板通电后, 引导芯片开始执行固化在...

weixin_36184940的博客 515

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android Telephony服务的开机启动流程

Android设备开机过程中Telephony服务的启动涉及多个层级,从底层驱动到Framework再到应用层。驱动(基本都是C代码与脚本语言的实现)和应用的代码暂时没有找到合适的开源代码,所以本篇只介绍Framework的代码。本人对于驱动的研究水平有限,也只能做些基本的介绍,仅供帮助更好理解Android系统的工作架构以及原理。此流程展示了Telephony服务如何从底层硬件初始化到上层应用交互的完整链路。

qq_34965992的博客 2116

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android系统启动流程

init进程是Android系统中用户空间的第一个进程(pid=1),它是用户进程的鼻祖,负责孵化各种属性服务、守护进程也包括非常重要的Zygote。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init。本文将基于Android7.0源码来分析Init进程。二。

Dream It Possible 5959

Android系统开机到Launcher启动流程分析

系统如何是被已安装的应用哪个是launcher应用? 如何定制一款launcher? 进程创建完成的出口是如何定义的? 掌握进程创建流程中各个类和关键方法的作用。 为什么Activity必须在清单文件中注册? ActivityStarter会做各种启动前检查。 ...

路漫漫其修远兮,吾将上下而求索 8894

梳理一下Android 系统启动流程

Android系统是一款基于Linux的开源系统,系统的架构划分为:系统应用层、Java API Framework层、native C/C++库和Android 运行时、硬件抽象层、和Linux内核层。 各层级之间的衔接关系可以通过梳理进程

川川的博客 336

android 开机启动流程分析(02)init的启动流程分析

系列文章解读&说明: Android开机启动流程的分析主要分为以下部分: android 开机启动流程分析(01) init之前启动说明 android 开机启动流程分析(02)init的启动流程分析 android 开机启动流程分析(03)init启动中关键进程 uevent & watchdog android 开机启动流程分析(04)init启动中关键服务-属性服务...

wangdsh的博客 1736

Android 系统启动流程

Android系统是基于Linux定制的一款开源的而移动端操作系统,由于其开源的特性,各大手机厂商可以针对其源码进行深度定制,对于开发者来说,有如此庞大且优秀的开源os提供参考,尤其是对移动端的开发者来说,阅读Android系统源码可以帮助我们更好地理解其中的各种机制,平时束手无策的问题也可以在源码中寻找答案。当然光8.0的源码就20多个g,像全部读完几乎是不可能的事,我们主要以framework...

weixin_33711641的博客 79

Android系统启动流程解析

开机logo和动画init.rc。

事后不诸葛的博客 49

Android系统启动流程—— init进程zygote进程SystemServer进程启动流程

原文地址:https://blog.youkuaiyun.com/qq_30993595/article/details/82714409 Android系统启动流程 Android系统启动过程往细了说可以分为5步: Loader --》Kernel --》Native --》Framework --》Application Loader Boot ROM: 当手机处于关机状态时,长按Power键...

Dream It Possible 5068

安卓系统启动流程: Zygote进程 –> SystemServer进程

一. 安卓启动流程 1)安卓系统启动层次结构 Android系统启动的流程图,可以看到系统从启动开始是按照一个流程:Loader->kernel->framework->Application来进行的。 1. Loader层 Boot Rom:当手机处于关机状态时,长按开机键开机,会引导芯片开始从固化在Rom里预设的代码开始执行,然后加载引导程序到Ram Boot Loader:启动Android系统之前的引导程序,主要是检查Ram,初始化参数等 2. Kernerl

mike_jun的博客 1629
上一篇: Android FrameWork - Zygote 启动流程分析
下一篇: Android Binder 驱动 - Media 服务启动流程
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值