Android系统启动原理

来源:互联网 发布:口袋密令网络不给力 编辑:程序博客网 时间:2024/05/22 14:21
   我们的Android手机在启动的时候都做了些什么,还有手机为什么需要耗费几十秒才能启动起来??
 一、启动过程
    Android系统架构由四层组成,底层为Linux内核层,第二层为Librares(c或c++)层,第三层为frameWork层
    顶层为app层;framework层和app层都算作是java层
    
  二、详解
      系统引导程序启动Linux内核时,内核会加载各种数据和驱动,有了驱动就开启Android系统并加载用户
   级别的第一个进程init.c
      1.init.c
mkdir("/dev",0755);-->创建各种文件夹和挂载目录
init_parse_config_file("/init.rc");-->解析配置文件init.rc,并加载
      2.init.rc
启动了Zygote进程,这个进程是Android系统启动关键服务的一个母进程
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server    socket zygote stream 666    onrestart write /sys/android_power/request_state wake    onrestart write /sys/power/state on    onrestart restart media    onrestart restart netd

      3.App_main.cpp文件
init.rc启动Zygote进程,但是Zygote的初始化是在App_main.cpp的main方法中完成的,如下
int main(int argc, const char* const argv[]){// 定义Android运行时环境.    AppRuntime runtime;    int i = runtime.addVmArguments(argc, argv);...    bool startSystemServer = (i < argc) ?             strcmp(argv[i], "--start-system-server") == 0 : false;    setArgv0(argv0, "zygote");    set_process_name("zygote");// 使用运行时环境启动Zygote的初始化类.    runtime.start("com.android.internal.os.ZygoteInit",        startSystemServer);    ...}

      4.ZygoteInit.java
由此进入java代码层,加载系统运行依赖的class类和依赖的资源文件,由于类和资源文件很多所以
        系统在此处消耗的时间比较长大约20秒左右,这也是系统启动过程中最耗时的地方,然后启动系统的
核心服务SystemServer
public static void main(String argv[]) {// 加载系统运行依赖的class类.            preloadClasses();...                        if (argv[1].equals("true")) {// Zygote孵化器进程开始孵化系统核心服务.                startSystemServer();            } else if (!argv[1].equals("false")) {                throw new RuntimeException(argv[0] + USAGE_STRING);            }...    }

      5.SystemServer
首先加载本地的动态链接库,然后调用动态链接库中的c函数,这时代码执行到了Libraries层
public static void main(String[] args) {        ...// 加载本地的动态链接库.        System.loadLibrary("android_servers");// 调用动态链接库中的c函数.        init1(args);    }

init1(args);中调用了c中的代码com_android_server_SystemServer.cpp
       6.com_android_server_SystemServer
调用系统初始化类System_init.cpp
static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz){// 转调    system_init();}// 此方法没有方法体.extern "C" int system_init();

       7.System_init.cpp类
在本类中开启硬件相关的服务、获取Android运行时调用SystemServer下的init2,进入java层
// 开启一些硬件相关的服务.    SensorService::instantiate();...    // 获取Android运行时环境    AndroidRuntime* runtime = AndroidRuntime::getRuntime();    LOGI("System server: starting Android services.\n");// 调用SystemServer类中静态方法init2. 从native层转到java层.    runtime->callStatic("com/android/server/SystemServer", "init2");

       8.init2()
Android系统服务的初始化
public static final void init2() {        Slog.i(TAG, "Entered the Android system server!");// 进入Android系统服务的初始化.        Thread thr = new ServerThread();        thr.setName("android.server.ServerThread");        thr.start();

调用ServerThread
       9.ServerThread中run方法执行
public void run() {        ...        // 初始化系统的服务, 并且把服务添加ServiceManager中, 便于以后系统进行统一管理.ServiceManager.addService("entropy", new EntropyService());...        // 调用了ActivityManagerService的systemReady的方法.        ((ActivityManagerService)ActivityManagerNative.getDefault())                .systemReady(new Runnable() {            public void run() {                ...            }        });...    }

       10.ActivityManagerService
在本类中调用了ActivityStack中的resumeTopActivityLocked方法,在此方法中开启了系统的第一
个界面,代码如下
// 找到第一个当前没有关闭的Activity, 系统刚刚系统没有任何Activity执行, 所以next为null        ActivityRecord next = topRunningActivityLocked(null);        // Remember how we'll process this pause/resume situation, and ensure        // that the state is reset however we wind up proceeding.        final boolean userLeaving = mUserLeaving;        mUserLeaving = false;        if (next == null) {            // There are no more activities!  Let's just start up the            // Launcher...            if (mMainStack) {// 开启Launcher应用的第一个Activity界面.                return mService.startHomeActivityLocked();            }        }

home界面显示,进入手机系统
  三、小结
以上全都是Android系统的源码,看起来太费劲了,因为不仅有java代码还有c和c++的代码,方法之
    间还来回调用,但是看完源码后的收获是非常大的,虽然很多都还不懂,但是对于Android底层的实现有
    了进一步的认识
1 0