概述
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);
}
}
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);
}
}