starting of process of android

80 篇文章 0 订阅
63 篇文章 0 订阅
概述
1.init进程功能介绍
2.Zygote进程介绍
3.system_server进程介绍

Init进程主要功能介绍

init进程 linux系统中的第一个用户空间进程 源码位于(/system/core/init/)
    1.初始化属性系统
    2.解析init.rc
    3.根据bootloader中传入的cmdline判断是否进入关机充电(高通平台的关机充电是在此处实现,mtk平台是在bootloader中实现)。
    4.如果不进入关机充电则会启动init.rc中添加的各个服务
    5.进入一个循环监听系统中的属性值是否有发生变化,(主要是实现通过属性值来启动和关闭init.rc中声明的服务)
    
一些主要流程的具体代码说明
Init.c (main方法节选)
    property_init();
    ...
    handle_property_set_fd();
    
Property_service.c (handle_property_set_fd)
    //*** 通过socket接收数据 ******
    r = TEMP_FAILURE_RETRY(recv(s, &msg, sizeof(msg), 0));
    ...
    switch(msg.cmd) {
        case PROP_MSG_SETPROP:
            if(memcmp(msg.name,"ctl.",4) == 0) {
                close(s);
                if (check_control_perms(msg.value, cr.uid, cr.gid, source_ctx)) {
                    handle_control_message((char*) msg.name + 4, (char*) msg.value);
                }
            }

Init.c (handle_control_message函数节选)
    if (!strcmp(msg,"start")) {
        msg_start(arg);
    } else if (!strcmp(msg,"stop")) {
        msg_stop(arg);
    } else if (!strcmp(msg, "restart")) {
        msg_stop(arg);
        msg_start(arg);
    }

Zygote进程主要功能介绍

Zygote进程 android系统的孵化器进程,所有app的父进程 源码位于(/framework/base/cmds/app_process)
    1.创建java虚拟机实例,并配置相关的JNI环境
    2.通过jni调用在本地层回调ZygoteInit类的main方法,从而进行java层相关处理
    3.创建一个名为zygote的socket 后续AMS就是通过此socker来和zygote进行通信让其创建进程。
    4.预加载preloaded-classes文件定义的类和资源
    5.启动system_server进程
    6.进入循环等待AMS通过socket 给其发送创建进程的处理消息

一些主要流程的具体代码说明
app_main.c (main方法的部分节选)
    runtime.start("com.android.internal.os.ZygoteInit", startSystemServer ? "start-system-server" : "");

AndroidRuntime.cpp (start方法的部分节选)

    if (startVm(&mJavaVM, &env) != 0) {
        return;
    }
    
    //** 调用jni调用ZygoteInit的main方法
    jmethodID startMeth = env->GetStaticMethodID(startClass, "main", "([Ljava/lang/String;)V");
    env->CallStaticVoidMethod(startClass, startMeth, strArray);

ZygoteInit.java
    registerZygoteSocket();
    preload();
    if (argv[1].equals("start-system-server")) {
        startSystemServer();
    else if (!argv[1].equals("")) {
        throw new RuntimeException(argv[0] + USAGE_STRING);
    }
    runSelectLoopMode();
    
 system_server 主要功能进程介绍
system_server进程
    1.设置虚拟机的相关参数和加载libandroid_servers.so库
    2.通过jni调用init1方法
    3.在init1中通过jni 回调systemServer类的init2方法
    4.在init2中创建ServerThread线程来向ServiceManager中添加各个核心服务,至此android系统的初始化工作就全部完成。主线程则开启线程池同时进入
    消息选择。
    5.在系统中各个核心服务都注册到servicemanager中后,启动状态栏,然后会启动所有的常驻进程,最后启动启动待机
    
一些主要流程的具体代码说明
SystemServer.java (main方法节选)
    //****** 设置虚拟机的相关参数让system_server进程可以使用大内存配置
    dalvik.system.VMRuntime.getRuntime().clearGrowthLimit();
    VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
    
    //******** 加载libandroid_servers.so库
    System.loadLibrary("android_servers");
    
    init1(args);
    
com_android_server_SystemServer.cpp (init1方法节选)
    system_init();

System_init.cpp (system_init方法节选)
    AndroidRuntime* runtime = AndroidRuntime::getRuntime();
    JNIEnv* env = runtime->getJNIEnv();
    
    //******* 通过jni调用SystemServer类的init2方法
    jclass clazz = env->FindClass("com/android/server/SystemServer");
    jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V");
    env->CallStaticVoidMethod(clazz, methodId);
    
    //***** 开启线程池,让添加到serivemanager中的各个服务能通过binder来实现远程调用。
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
    
SystemServer.java (init2方法节选)
    Thread thr = new ServerThread();
    thr.start();
    
ServerThread类的run方法节选

    ServiceManager.addService("entropy", new EntropyMixer());
    power = new PowerManagerService();
    ServiceManager.addService(Context.POWER_SERVICE, power);

    context = ActivityManagerService.main(factoryTest);

    display = new DisplayManagerService(context, wmHandler, uiHandler);
    ServiceManager.addService(Context.DISPLAY_SERVICE, display, true);

    telephonyRegistry = new TelephonyRegistry(context);
    ServiceManager.addService("telephony.registry", telephonyRegistry);

    if (android.telephony.MSimTelephonyManager.getDefault().isMultiSimEnabled()) {
        msimTelephonyRegistry = new MSimTelephonyRegistry(context);
        ServiceManager.addService("telephony.msim.registry", msimTelephonyRegistry);
    }

    ServiceManager.addService(Context.SCHEDULING_POLICY_SERVICE, new SchedulingPolicyService());
    
    pm = PackageManagerService.main(context, installer,
                    factoryTest != SystemServer.FACTORY_TEST_OFF,
                    onlyCore);
                    
    ServiceManager.addService(Context.USER_SERVICE, UserManagerService.getInstance());
                    
    contentService = ContentService.main(context, factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL);
    
    ActivityManagerService.installSystemProviders();
    
    //初始化上层看门狗
    Watchdog.getInstance().init(context, battery, power, alarm, ActivityManagerService.self());
    
    wm = WindowManagerService.main(context, power, display, inputManager,
                    uiHandler, wmHandler,
                    factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL,
                    !firstBoot, onlyCore);
    ServiceManager.addService(Context.WINDOW_SERVICE, wm);
    ServiceManager.addService(Context.INPUT_SERVICE, inputManager);

    inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
    inputManager.start();
    
    //****** 系统中各个核心服务都添加完成后就需要调用AMS的systemReady方法来启动常驻进程,待机。
    ActivityManagerService.self().systemReady(new Runnable()
    {
        public void run() {
            //********* 启动状态栏 *************
            if (!headless) startSystemUi(contextF);
            ......
        }
    }

ActivityMangerService.java (systemReady函数节选)
    
    if (goingCallback != null) goingCallback.run();
    
    //**** 启动常驻进程 **************
    List apps = AppGlobals.getPackageManager().getPersistentApplications(STOCK_PM_FLAGS);
    for (i=0; i<N; i++) {
        ApplicationInfo info = (ApplicationInfo)apps.get(i);
        if (info != null && !info.packageName.equals("android")) {
            addAppLocked(info, false);
        }
    }
    mMainStack.resumeTopActivityLocked(null);
    
ActivityStack.java (resumeTopActivityLocked方法节选)
    ActivityRecord next = topRunningActivityLocked(null);
    ....
    if (next == null) {
        if (mMainStack) {
            ActivityOptions.abort(options);
            //****** 启动待机 ***********
            return mService.startHomeActivityLocked(mCurrentUser);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值