1. Android 启动概述

Android 系统是运行在Linux 内核上的,所以它的启动过程则是基于kernel的启动发生的。首先Kernel启动过程中会创建用户空间的第一个进程init进程,该进程也是用户空间的鼻祖,是系统的守护进程。之后init进程会启动serviceManager,它则是bind的服务管家,后续启动的许多系统或用户service都会在它里面进行注册。然后init进程也会创建Zygote进程,这个进程则是Java进程的鼻祖。之后的系统主进程system_server进程和其他app进程则都是由Zygote进程创建的。

  1. Init进程启动概述

init是Linux系统中用户空间的第一个进程(pid=1), Kerner启动后会调用/system/core/init/Init.cpp的main()方法.

Init 主要做的4件事

  1. 分析和运行所有的init.rc文件;
  2. 生成设备驱动节点; (通过rc文件创建)
  3. 处理子进程的终止(signal方式);
  4. 提供属性服务property service
    1. Init.main()

这里主要分析下main函数的执行内容:

int main(int argc, char** argv) {

if (!strcmp(basename(argv[0]), "ueventd")) {

return ueventd_main(argc, argv);//启动ueventd

}

if (!strcmp(basename(argv[0]), "watchdogd")) {

return watchdogd_main(argc, argv);//启动watchdog

}

// Clear the umask.

umask(0);//清除屏蔽字,更改目录和文件权限访问不受影响

//  #define _PATH_DEFPATH "/usr/bin:/bin"

add_environment("PATH", _PATH_DEFPATH);//

bool is_first_stage = (argc == 1) || (strcmp(argv[1], "--second-stage") != 0);

这里有一个状态值is_first_stage,从代码我们知道它是根据main函数的传入参数决定的。Init进程中会使用is_first_stage标志进行区分,决定是否需要进行初始化。在引入selinux机制后,有些操作必须要在内核态才能完成; 但init进程作为android的第一个进程,又是运行在用户态的。于是,最终设计为用is_first_stage进行区分init进程的运行状态。init进程在运行的过程中,会完成从内核态到用户态的切换。

然后主要执行的是创建文件系统目录并挂载相关的文件系统,主要mount tmpfs,devpts,proc,sysfs四种文件系统

if (is_first_stage) {

mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");

mkdir("/dev/pts", 0755);

mkdir("/dev/socket", 0755);

mount("devpts", "/dev/pts", "devpts", 0, NULL);

#define MAKE_STR(x) __STRING(x)

mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC));

mount("sysfs", "/sys", "sysfs", 0, NULL);

}

open_devnull_stdio();//屏蔽标准的输入输出

klog_init();//初始化kernelLog

klog_set_level(KLOG_NOTICE_LEVEL);//kernel Log level,在/system/core/include/cutils/klog.h定义

if (!is_first_stage) {

.......

property_init();//创建一块共享的内存空间,用于属性服务

.......

}

selinux_initialize(is_first_stage);//启动SELinux并导入相关配置策略

if (is_first_stage) {

//根据seLinux policy的策略重新设置init文件属性

if (restorecon("/init") == -1) {

ERROR("restorecon failed: %s\n", strerror(errno));

security_failure();

}

char* path = argv[0];

char* args[] = { path, const_cast<char*>("--second-stage"), nullptr };

//这里就是前面所说的,启动用户态的init进程,即second-stage

if (execv(path, args) == -1) {

ERROR("execv(\"%s\") failed: %s\n", path, strerror(errno));

security_failure();

}

}

//这些文件节点在加载Sepolicy之前已经被创建了,因此在加载完Sepolicy后,需要重新设置相关的属性。

NOTICE("Running restorecon...\n");

restorecon("/dev");

restorecon("/dev/socket");

restorecon("/dev/__properties__");

restorecon("/property_contexts");

restorecon_recursive("/sys");

//创建epoll句柄

epoll_fd = epoll_create1(EPOLL_CLOEXEC);

if (epoll_fd == -1) {

ERROR("epoll_create1 failed: %s\n", strerror(errno));

exit(1);

}

signal_handler_init();//初始化子进程退出的信号处理过程

property_load_boot_defaults();//加载/default.prop文件

export_oem_lock_status();

start_property_service();//启动属性服务器

const BuiltinFunctionMap function_map;

Action::set_function_map(&function_map);

//解析init.rc文件,对比6.0还是有很大区别

Parser& parser = Parser::GetInstance();

parser.AddSectionParser("service",std::make_unique<ServiceParser>());

parser.AddSectionParser("on", std::make_unique<ActionParser>());

parser.AddSectionParser("import", std::make_unique<ImportParser>());

parser.ParseConfig("/init.rc");

//init进程将所有需要操作的action加入运行队列后,然后进入无限循环过程,

不断处理运行队列中的事件,同时进行重启service等操作。

ActionManager& am = ActionManager::GetInstance();

am.QueueEventTrigger("early-init");

am.QueueBuiltinAction(wait_for_coldboot_done_action, "wait_for_coldboot_done");

am.QueueBuiltinAction(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng");

#if defined(__aarch64__)

am.QueueBuiltinAction(set_mmap_rnd_bits_action, "set_mmap_rnd_bits");

#endif

am.QueueBuiltinAction(keychord_init_action, "keychord_init");

am.QueueBuiltinAction(console_init_action, "console_init");

am.QueueEventTrigger("init");

am.QueueBuiltinAction(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng");

std::string bootmode = property_get("ro.bootmode");

if (bootmode == "charger") {

am.QueueEventTrigger("early-fs");

am.QueueEventTrigger("fs");

am.QueueEventTrigger("post-fs");

am.QueueEventTrigger("charger");

} else {

am.QueueEventTrigger("late-init");

}

am.QueueBuiltinAction(queue_property_triggers_action, "queue_property_triggers");

while (true) {

if (!waiting_for_exec) {

am.ExecuteOneCommand();

restart_processes();

}

int timeout = -1;

if (process_needs_restart) {

timeout = (process_needs_restart - gettime()) * 1000;

if (timeout < 0)

timeout = 0;

}

if (am.HasMoreCommands()) {

timeout = 0;

}

bootchart_sample(&timeout);

epoll_event ev;

int nr = TEMP_FAILURE_RETRY(epoll_wait(epoll_fd, &ev, 1, timeout));

if (nr == -1) {

ERROR("epoll_wait failed: %s\n", strerror(errno));

} else if (nr == 1) {

((void (*)()) ev.data.ptr)();

}

}

return 0;

}

  1. Log 分析:

Init进程启动后,进入Main函数执行逻辑第一句Log的是

[    3.687408] c1 init: init first stage started!

上文说过init存在内核态和用户态,这句代表当前还在内核态,并且前面的环境设置,文件系统挂载,输入输出屏蔽和Kernel Log开启都已经完成。

[    4.295989] c1 init: (Initializing SELinux enforcing took 0.61s.)

则是代表SELinux初始化已经完成,这句Log是在selinux_initialize 执行完打出来的。

[    4.307861] c2 init: init second stage started!

这句话就是代码已经开始执行用户态的init进程。

[    4.332763] c2 init: Running restorecon... 下面要修改之前已经创建的节点属性

[    4.706207] c2 init: (Loading properties from /default.prop took 0.00s.)

property_load_boot_defaults函数执行完成,属性文件解析和导入完成。

[    4.712707] c2 init: (Parsing /init.environ.rc took 0.00s.)

[    4.714294] c2 init: (Parsing /init.usb.rc took 0.00s.)

[    4.721252] c2 init: (Parsing /init.sc8830.usb.rc took 0.00s.)

[    4.721588] c2 init: (Parsing /init.storage.rc took 0.00s.)

[    4.721679] c2 init: (Parsing /init.sc8830.rc took 0.01s.)

[    4.721740] c2 init: (Parsing /init.sp7731g_1h10.rc took 0.01s.)

[    4.726928] c2 init: (Parsing /init.usb.configfs.rc took 0.01s.)

[    4.727416] c2 init: (Parsing /init.zygote32.rc took 0.00s.)

[    4.727478] c2 init: (Parsing /init.rc took 0.02s.)

[   11.915832] c2 init: Starting service 'zygote'...

这里则是通过解析相关init.zygote32.rc文件,解析并启动'zygote进程。

  1. Zygote进程启动概述

    1. 配置文件解析

从1.1我们了解到,init在启动的时候会解析init.rc 配置文件,而Zygote进程则是通过这一事件触发启动的。

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

class main //服务进程的class级别,一般有core, main, default几个级别

socket zygote stream 660 root system //创建socket

onrestart write /sys/android_power/request_state wake

onrestart write /sys/power/state on

onrestart restart audioserver //当zygote重启时,则会重启audioServer

onrestart restart cameraserver //当zygote重启时,则会重启cameraServer

onrestart restart media //当zygote重启时,则会重启media

onrestart restart netd  //当zygote重启时,则会重启netd

writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks

当Zygote进程启动后, 便会执行到frameworks/base/cmds/app_process/App_main.cpp文件的main()方法.调用流程:

  1. App_main.main

int main(int argc, char* const argv[])

{

......

首先进行参数解析

AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));

argc--;

argv++;

// --zygote : Start in zygote mode

// --start-system-server : Start the system server.

// --application : Start in application (stand alone, non zygote) mode.

// --nice-name : The nice name for this process.

int i;

//只解析-开头的字符串,同时--开头后面没有字符串的不处理,这些参数保存到AppRuntime中

for (i = 0; i < argc; i++) {

if (argv[i][0] != '-') {

break;

}

if (argv[i][1] == '-' && argv[i][2] == 0) {

++i; // Skip --.

break;

}

runtime.addOption(strdup(argv[i]));

}

// Parse runtime arguments.  Stop at first unrecognized option.

bool zygote = false;

bool startSystemServer = false;

bool application = false;

String8 niceName;

String8 className;

++i;  // Skip unused "parent dir" argument.

//将筛选出的字符串参数,进行解析处理

while (i < argc) {

const char* arg = argv[i++];

if (strcmp(arg, "--zygote") == 0) {

zygote = true;

niceName = ZYGOTE_NICE_NAME;

} else if (strcmp(arg, "--start-system-server") == 0) {

startSystemServer = true;

} else if (strcmp(arg, "--application") == 0) {

application = true;

} else if (strncmp(arg, "--nice-name=", 12) == 0) {

niceName.setTo(arg + 12);

} else if (strncmp(arg, "--", 2) != 0) {

className.setTo(arg);

break;

} else {

--i;

break;

}

}

Vector<String8> args;

if (!className.isEmpty()) {

// // 运行application或tool程序

args.add(application ? String8("application") : String8("tool"));

runtime.setClassNameAndArgs(className, argc - i, argv + i);

} else {

// We're in zygote mode.zygote会走此处,创建 /data/dalvik-cache路径

maybeCreateDalvikCache();

//加入参数,启动system_server

if (startSystemServer) {

args.add(String8("start-system-server"));

}

char prop[PROP_VALUE_MAX];

if (property_get(ABI_LIST_PROPERTY, prop, NULL) == 0) {

LOG_ALWAYS_FATAL("app_process: Unable to determine ABI list from property %s.",

ABI_LIST_PROPERTY);

return 11;

}

String8 abiFlag("--abi-list=");

abiFlag.append(prop);

args.add(abiFlag);

// In zygote mode, pass all remaining arguments to the zygote

// main() method.

for (; i < argc; ++i) {

args.add(String8(argv[i]));

}

}

//设置进程名

if (!niceName.isEmpty()) {

runtime.setArgv0(niceName.string());

set_process_name(niceName.string());

}

//判断是启动模式

if (zygote) {

// 启动AppRuntime

runtime.start("com.android.internal.os.ZygoteInit", args, zygote);

} else if (className) {

runtime.start("com.android.internal.os.RuntimeInit", args, zygote);

} else {

//参数错误

fprintf(stderr, "Error: no class name or --zygote supplied.\n");

app_usage();

LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");

return 10;

}

}

  1. AndroidRuntime.start

上一小节会通过执行runtime.start("com.android.internal.os.ZygoteInit", args, zygote);

void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)

{

......

//创建虚拟机

JniInvocation jni_invocation;

jni_invocation.Init(NULL);

JNIEnv* env;

if (startVm(&mJavaVM, &env, zygote) != 0) {

return;

}

onVmCreated(env);

* Register android functions.//JNI方法注册

if (startReg(env) < 0) {

ALOGE("Unable to register all android natives\n");

return;

}

......

char* slashClassName = toSlashClassName(className);

jclass startClass = env->FindClass(slashClassName);

if (startClass == NULL) {

ALOGE("JavaVM unable to locate class '%s'\n", slashClassName);

/* keep going */

} else {

jmethodID startMeth = env->GetStaticMethodID(startClass, "main",

"([Ljava/lang/String;)V");

if (startMeth == NULL) {

ALOGE("JavaVM unable to find main() in '%s'\n", className);

/* keep going */

} else {

//此处开始调用Zygote.main 方法

env->CallStaticVoidMethod(startClass, startMeth, strArray);

......

}

}

free(slashClassName);

}

Start方法的第一句Log就是下面,代表该进程已经开始启动

A001-01 08:08:10.716   223   223 D AndroidRuntime: >>>>>> START com.android.internal.os.ZygoteInit uid 0 <<<<<<

  1. ZygoteInit.main

public static void main(String argv[]) {

// 标记Zygote已经启动

ZygoteHooks.startZygoteNoThreadCreation();

try {

RuntimeInit.enableDdms();//打开DDMS功能

//性能统计相关的操作类

SamplingProfilerIntegration.start();

boolean startSystemServer = false;

String socketName = "zygote";

String abiList = null;

//这里面主要进行了参数的解析,是否打开systemServer,还有就是

检查参数--abi-list=和--socket-name=

for (int i = 1; i < argv.length; i++) {

if ("start-system-server".equals(argv[i])) {

startSystemServer = true;

} else if (argv[i].startsWith(ABI_LIST_ARG)) {

abiList = argv[i].substring(ABI_LIST_ARG.length());

} else if (argv[i].startsWith(SOCKET_NAME_ARG)) {

socketName = argv[i].substring(SOCKET_NAME_ARG.length());

} else {

throw new RuntimeException("Unknown command line argument: " + argv[i]);

}

}

abiList参数为null 会抛出异常

if (abiList == null) {

throw new RuntimeException("No ABI list supplied.");

}

// 注册zygote的socket端口

registerZygoteSocket(socketName);

EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,

SystemClock.uptimeMillis());//boot_progress_preload_start

preload();//预加载类和资源

EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,

SystemClock.uptimeMillis());//boot_progress_preload_end

SamplingProfilerIntegration.writeZygoteSnapshot();

// 在启动后做一次GC操作

gcAndFinalize();

// Zygote process unmounts root storage spaces.

Zygote.nativeUnmountStorageOnInit();

ZygoteHooks.stopZygoteNoThreadCreation();

//启动systemServer

if (startSystemServer) {

startSystemServer(abiList, socketName);

}

Log.i(TAG, "Accepting command socket connections");

//进入循环模式

runSelectLoop(abiList);

closeServerSocket();

} catch (MethodAndArgsCaller caller) {

caller.run();

} catch (RuntimeException ex) {

Log.e(TAG, "Zygote died with exception", ex);

closeServerSocket();

throw ex;

}

}

Log分析:

A001-01 08:08:12.401   223   223 I SamplingProfilerIntegration: Profiling disabled.

代表正在执行SamplingProfilerIntegration.start();

A001-01 08:08:12.405   223   223 D Zygote  : begin preload

开始执行preload();加载类和资源

第一个执行beginIcuCachePinning();

A001-01 08:08:12.406   223   223 I Zygote  : Installing ICU cache reference pinning...

A001-01 08:08:12.406   223   223 I Zygote  : Preloading ICU data...

preloadClasses();//预加载类

A001-01 08:08:12.667   223   223 I Zygote  : Preloading classes...

preloadResources();//预加载资源,包含drawable和color资源

A001-01 08:08:15.991   223   223 I Zygote  : Preloading resources...

preloadOpenGL();

preloadSharedLibraries();//通过System.loadLibrary()方法,预加载"android","compiler_rt","jnigraphics"这3个共享库

A001-01 08:08:16.565   223   223 I Zygote  : Preloading shared libraries...

endIcuCachePinning();

A001-01 08:08:16.630   223   223 I Zygote  : Uninstalled ICU cache reference pinning...

warmUpJcaProviders();

A001-01 08:08:16.642   223   223 I Zygote  : Installed AndroidKeyStoreProvider in 11ms.

A001-01 08:08:16.689   223   223 I Zygote  : Warmed up JCA providers in 46ms.

至此preload函数执行完成,分别在main和eventLog打出如下

A001-01 08:08:16.689   223   223 D Zygote  : end preload

A301-01 08:08:16.689   223   223 I boot_progress_preload_end: 21809

fork systemserver进程时,在执行com_android_internal_os_Zygote.cpp com_android_internal_os_Zygote_nativeForkSystemServer()方法会打出如下Log,代表systemServer进程已经被创建:

A001-01 08:08:16.877   223   223 I Zygote  : System server process 661 has been created

下面这句Log则是在startsystemserver完成后,执行runSelectLoop前打出。代表要进行zygote进入等待和处理客户端请求的状态。

A001-01 08:08:16.894   223   223 I Zygote  : Accepting command socket connections

  1. SystemServer启动流程分析

SystemServer是Android Framework层的主进程,该进程运行着Framework的核心服务。systemServer由Zygote启动 fork生成的。进程名是system_server,上文我们跟踪代码分析到Zygote进程会调用startSystemServer()方法走入system_server的启动流程。

下图是systemServer的启动框图:

那么我们将按照上图对于主要函数进行分析

  1. Zygote 进程启动SystemServer

    1. startSystemServer()

private static boolean startSystemServer(String abiList, String socketName)

throws MethodAndArgsCaller, RuntimeException {

......

//首先配置启动systemserver 的相关参数uid,gid,name,group

String args[] = {

"--setuid=1000",

"--setgid=1000",

"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1032,3001,3002,3003,3006,3007,3009,3010",

"--capabilities=" + capabilities + "," + capabilities,

"--nice-name=system_server",

"--runtime-args",

"com.android.server.SystemServer",

};

ZygoteConnection.Arguments parsedArgs = null;

int pid;

try {

//Arguments用于解析参数,这里则是把上文配置的参数解析生成目标格式并存在parsedArgs对象中

parsedArgs = new ZygoteConnection.Arguments(args);

ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);

ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);

// fork子进程,该进程是system_server进程

pid = Zygote.forkSystemServer(

parsedArgs.uid, parsedArgs.gid,

parsedArgs.gids,

parsedArgs.debugFlags,

null,

parsedArgs.permittedCapabilities,

parsedArgs.effectiveCapabilities);

} catch (IllegalArgumentException ex) {

throw new RuntimeException(ex);

}

/* For child process */

if (pid == 0) {

if (hasSecondZygote(abiList)) {

//对于有两个zygote进程情况,需等待第2个zygote创建完成

waitForSecondaryZygote(socketName);

}

// 完成system_server进程剩余的工作

handleSystemServerProcess(parsedArgs);

}

return true;

}

  1. forkSystemServer()

1. forkSystemServer()

public static int forkSystemServer(int uid, int gid, int[] gids, int debugFlags,

int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {

......

//调用native方法fork system_server进程

int pid = nativeForkSystemServer(

uid, gid, gids, debugFlags, rlimits, permittedCapabilities, effectiveCapabilities);

......

return pid;

}

2. nativeForkSystemServer()

nativeForkSystemServer()方法则是调用到Zygote的JNI层 com_android_internal_os_Zygote.cpp com_android_internal_os_Zygote_nativeForkSystemServer()

static jint com_android_internal_os_Zygote_nativeForkSystemServer(

JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,

jint debug_flags, jobjectArray rlimits, jlong permittedCapabilities,

jlong effectiveCapabilities) {

pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids,

debug_flags, rlimits,

permittedCapabilities, effectiveCapabilities,

MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,

NULL, NULL);

if (pid > 0) {

//zygote进程,检测system_server进程是否创建

gSystemServerPid = pid;

int status;

if (waitpid(pid, &status, WNOHANG) == pid) {

//当system_server进程死亡后,重启zygote进程

RuntimeAbort(env, __LINE__, "System server process has died. Restarting Zygote!");

}

}

这里有一个fork 后对于systemServer进程是否创建成功的判断,如果创建失败则会重启Zygote进程

3.ForkAndSpecializeCommon()

static pid_t ForkAndSpecializeCommon(.....) {

SetSigChldHandler();//设置systemServer的对于Linux信号的处理

......

//fork 子进程

pid_t pid = fork();

if (pid == 0) {

// 进入子进程了

gMallocLeakZygoteChild = 1;

// 第一步先清除描述符

DetachDescriptors(env, fdsToClose);

......

if (!is_system_server) {

//对于非system_server子进程,则创建进程组,rc 非0则打出创建失败原因

int rc = createProcessGroup(uid, getpid());

.....

}

//设置group GID

SetGids(env, javaGids);

//设置资源limit

SetRLimits(env, javaRlimits);

......

//设置真实的,有效的和保存过的组标识号

int rc = setresgid(gid, gid, gid);

//分别设置真实的,有效的和保存过的用户标识号

rc = setresuid(uid, uid, uid);

......

SetCapabilities(env, permittedCapabilities, effectiveCapabilities);

设置调度策略

SetSchedulerPolicy(env);

const char* se_info_c_str = NULL;

ScopedUtfChars* se_info = NULL;

if (java_se_info != NULL) {

se_info = new ScopedUtfChars(env, java_se_info);

se_info_c_str = se_info->c_str();

if (se_info_c_str == NULL) {

RuntimeAbort(env, __LINE__, "se_info_c_str == NULL");

}

}

//selinux上下文

rc = selinux_android_setcontext(uid, is_system_server, se_info_c_str, se_name_c_str);

if (se_info_c_str == NULL && is_system_server) {

se_name_c_str = "system_server";

}

if (se_info_c_str != NULL) {

//设置线程名system_server

SetThreadName(se_name_c_str);

}

delete se_info;

delete se_name;

UnsetSigChldHandler();

env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, debug_flags,

is_system_server, instructionSet);

} else if (pid > 0) {

进入父进程Zygote

}

return pid;

}

  1. handleSystemServerProcess()

上文介绍了systemServer进程的fork过程,当返回pid为0的判断内,则进入systemserver 进程里面了。而handleSystemServerProcess()方法则继续完成systemserver 启动的其他内容,

一直到main()主函数的启动。

private static void handleSystemServerProcess(.....)

throws ZygoteInit.MethodAndArgsCaller {

closeServerSocket();/关闭fork过程从Zygote copy的socket

Os.umask(S_IRWXG | S_IRWXO);

if (parsedArgs.niceName != null) {

//设置进程名system_server

Process.setArgV0(parsedArgs.niceName);

}

//执行dex优化

final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");

if (systemServerClasspath != null) {

performSystemServerDexOpt(systemServerClasspath);

}

if (parsedArgs.invokeWith != null) {

......

//通过系统调用执行进程

WrapperInit.execApplication(parsedArgs.invokeWith,

parsedArgs.niceName, parsedArgs.targetSdkVersion,

VMRuntime.getCurrentInstructionSet(), null, args);

} else {

ClassLoader cl = null;

if (systemServerClasspath != null) {

//创建类加载器

cl = createSystemServerClassLoader(systemServerClasspath,parsedArgs.targetSdkVersion);

Thread.currentThread().setContextClassLoader(cl);

}

//通过寻找到相应目标类的main()函数并执行

RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);

}

}

  1. RuntimeInit.zygoteInit()

public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)

throws ZygoteInit.MethodAndArgsCaller {

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

redirectLogStreams(); //重定向log输出

commonInit(); // 通用的一些初始化

nativeZygoteInit(); // zygote初始化

applicationInit(targetSdkVersion, argv, classLoader); // 应用初始化

}

private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)

throws ZygoteInit.MethodAndArgsCaller {

//true代表应用程序退出时不调用AppRuntime.onExit(),否则会在退出前调用

nativeSetExitWithoutCleanup(true);

//设置虚拟机的内存利用率参数值为0.75

VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);

VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion);

final Arguments args;

try {

args = new Arguments(argv); //解析参数

} catch (IllegalArgumentException ex) {

return;

}

Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);

//调用startClass的static方法 main(),此处args.startClass为”com.android.server.SystemServer”。

invokeStaticMain(args.startClass, args.startArgs, classLoader);

}

对于方法我们关注下面的处理

private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)

throws ZygoteInit.MethodAndArgsCaller {

//通过抛出异常,回到ZygoteInit.main()。

throw new ZygoteInit.MethodAndArgsCaller(m, argv)

}

在分析Zygote 的时候,对startSystemServer 进行try catch时,当上文处抛出异常时就会执行caller.run。

这里面我们看下caller的处理。

public static void main(String argv[]) {

try {

startSystemServer(abiList, socketName);//启动system_server

....

} catch (MethodAndArgsCaller caller) {

caller.run();

} catch (RuntimeException ex) {

closeServerSocket();

throw ex;

}

}

public static class MethodAndArgsCaller extends Exception

implements Runnable {

......

public void run() {

try {

//通过反射机制能够调用到SystemServer.main()方法

mMethod.invoke(null, new Object[] { mArgs });

}

……

}

  1. Log分析:

上文在fork systemserver进程时,在执行com_android_internal_os_Zygote.cpp com_android_internal_os_Zygote_nativeForkSystemServer()方法会打出如下Log,代表systemServer进程已经被创建:

A001-01 08:08:16.877   223   223 I Zygote  : System server process 661 has been created

  1. SystemServer 启动系统服务

上文我们知道通过Zygote fork SystemServer 进程,调用到SystemServer.main()方法。这一节我们主要关注启动的各个阶段启动的服务,和相关分类。

首先main函数的只是执行new SystemServer().run(); 实例化systemServer并执行run方法。

而对于run方法我们除了一些运行状态的初始化以外,主要关注下面几个方法。

performPendingShutdown();

createSystemContext();

mSystemServiceManager = new SystemServiceManager(mSystemContext);

startBootstrapServices();

startCoreServices();

startOtherServices();

Looper.loop()

  1. Run()

private void run() {

try {

Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "InitBeforeStartServices");

对于系统时间为1970年前的时间更改为1970

if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {

Slog.w(TAG, "System clock is before 1970; setting to 1970.");

SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);

}

//语言更改为本地属性预置的

if (!SystemProperties.get("persist.sys.language").isEmpty()) {

final String languageTag = Locale.getDefault().toLanguageTag();

SystemProperties.set("persist.sys.locale", languageTag);

SystemProperties.set("persist.sys.language", "");

SystemProperties.set("persist.sys.country", "");

SystemProperties.set("persist.sys.localevar", "");

}

// Here we go!

Slog.i(TAG, "Entered the Android system server!");

EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, SystemClock.uptimeMillis());

//变更虚拟机使用的库文件,目前使用应该是libart.so

SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());

//判断性能统计功能是否开启

if (SamplingProfilerIntegration.isEnabled()) {

SamplingProfilerIntegration.start();

mProfilerSnapshotTimer = new Timer();

mProfilerSnapshotTimer.schedule(new TimerTask() {

@Override

public void run() {

//SystemServer性能统计,每小时统计一次,统计结果输出为文件

SamplingProfilerIntegration.writeSnapshot("system_server", null);

}

}, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);

}

// 因为启动阶段系统会消耗大量的虚拟机内存空间,此处先清除内存的限制

VMRuntime.getRuntime().clearGrowthLimit();

//因为systemServer会一直运行,这里设置了下它的内存使用率

VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);

// 一些设备的运行可能依赖指纹信息,这里先提前进行定义

Build.ensureFingerprintProperty();

制定用户

Environment.setUserRequired(true);

// 在system server,任何传入的Bundles应该被defused,以避免抛出BadParcelableException。

BaseBundle.setShouldDefuse(true);

// 确保当前系统进程的binder调用,总是运行在前台优先级

BinderInternal.disableBackgroundScheduling(true);

BinderInternal.setMaxThreads(sMaxBinderThreads);

//主线程looper就在当前线程运行

android.os.Process.setThreadPriority(

android.os.Process.THREAD_PRIORITY_FOREGROUND);

android.os.Process.setCanSelfBackground(false);

Looper.prepareMainLooper();

//初始化native服务

System.loadLibrary("android_servers");

//检查上次关机是否失败,该方法可能不会反回.

// 当"sys.shutdown.requested"值不为空,则会重启或者关机

performPendingShutdown();

//初始化system context.

createSystemContext();

// 创建systemServiceManager作为系统服务管理

mSystemServiceManager = new SystemServiceManager(mSystemContext);

//将mSystemServiceManager添加到本地服务的成员sLocalServiceObjects

LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);

} finally {

Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

}

// 开始启动系统相关核心服务

try {

Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartServices");

startBootstrapServices();

startCoreServices();

startOtherServices();

} catch (Throwable ex) {

Slog.e("System", "******************************************");

Slog.e("System", "************ Failure starting system services", ex);

throw ex;

} finally {

Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

}

......

//循环处理

Looper.loop();

throw new RuntimeException("Main thread loop unexpectedly exited");

}

Log分析:

刚进入systemServer的run 方法就会打出如下Log

A101-01 08:08:17.070   661   661 I SystemServer: Entered the Android system server!

A301-01 08:08:17.071   661   661 I boot_progress_system_run: 22191

  1. Framework 核心服务启动

我们可以把系统服务的启动分成下面六个阶段。分别在下面三个方法实现。

六个阶段:

public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100;

public static final int PHASE_LOCK_SETTINGS_READY = 480;

public static final int PHASE_SYSTEM_SERVICES_READY = 500;

public static final int PHASE_ACTIVITY_MANAGER_READY = 550;

public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;

public static final int PHASE_BOOT_COMPLETED = 1000;

三个方法函数:

startBootstrapServices();

startCoreServices();

startOtherServices();

  1. 系统服务启动的六个阶段

在完成每阶段的执行后,systemServer通过调用mSystemServiceManager.startBootPhase() 方式发出消息。

而一些服务则会对其进行回调。

  1. 系统服务启动阶段:

创建四大引导服务

ActivityManagerService

PowerManagerService

LightsService//光感应传感器服务。

DisplayManagerService共4项服务

Log分析:

A101-01 08:08:17.308   661   661 I SystemServiceManager: Starting com.android.server.pm.InstallerEx

A101-01 08:08:17.322   661   661 I SystemServiceManager: Starting com.android.server.am.ActivityManagerService$Lifecycle

//电源管理服务

A101-01 08:08:17.942   661   661 I SystemServiceManager: Starting com.android.server.power.PowerManagerService

//光感应传感器服务。

A101-01 08:08:17.975   661   661 I SystemServiceManager: Starting com.android.server.lights.LightsService

//用于管理全局显示生命周期,决定在已连接的物理设备如何配置逻辑显示,并且通知系统和应用状态的改变

A101-01 08:08:17.992   661   661 I SystemServiceManager: Starting com.android.server.display.DisplayManagerService

  1. Phase100

会进入阶段PHASE_WAIT_FOR_DEFAULT_DISPLAY=100会进行回调的服务

DisplayManagerService

public void onBootPhase(int phase) {

if (phase == PHASE_WAIT_FOR_DEFAULT_DISPLAY) {

}

然后创建大量服务下面等服务:

PackageManagerService

WindowManagerService

InputManagerService

NetworkManagerService

DropBoxManagerService

FingerprintService

LauncherAppsService

A101-01 08:08:18.007   661   661 I SystemServiceManager: Starting phase 100

//Android framework框架核心服务,用于APK的解析、权限验证、安装等。

A101-01 08:08:18.039   661   661 I SystemServer: StartPackageManagerService

package scan开始

A301-01 08:08:18.104   661   661 I boot_progress_pms_start: 23224

System目录扫描

A301-01 08:08:18.612   661   661 I boot_progress_pms_system_scan_start: 23732

Data目录扫描

A301-01 08:08:20.508   661   661 I boot_progress_pms_data_scan_start: 25628

package scan结束

A301-01 08:08:20.586   661   661 I boot_progress_pms_scan_end: 25707

A301-01 08:08:22.806   661   661 I boot_progress_pms_ready: 27926

A101-01 08:08:22.904   661   661 I SystemServer: StartOtaDexOptService

//user用户管理服务

A101-01 08:08:22.907   661   661 I SystemServer: StartUserManagerService

A101-01 08:08:22.908   661   661 I SystemServiceManager: Starting com.android.server.pm.UserManagerService$LifeCycle

A001-01 08:08:22.931   661   661 D SensorService: nuSensorService starting...

到此处startBootstrapServices()执行完。然后开始执行startCoreServices();

电池电量相关service

A101-01 08:08:23.580   661   661 I SystemServiceManager: Starting com.android.server.BatteryService

收集用户使用每一个APP的频率、使用时常的一个service

A101-01 08:08:23.601   661   661 I SystemServiceManager: Starting com.android.server.usage.UsageStatsService

A101-01 08:08:23.630   661   661 I SystemServiceManager: Starting com.android.server.webkit.WebViewUpdateService

到这里startCoreServices()也执行完了,接着就会执行startOtherServices()

A101-01 08:08:23.643   661   661 I SystemServer: Reading configuration...

A101-01 08:08:23.643   661   661 I SystemServer: StartSchedulingPolicyService

A101-01 08:08:23.646   661   661 I SystemServiceManager: Starting com.android.server.telecom.TelecomLoaderService

A101-01 08:08:23.651   661   661 I SystemServer: StartTelephonyRegistry

//生成系统随机数

A101-01 08:08:23.660   661   661 I SystemServer: StartEntropyMixer

A101-01 08:08:23.690   661   661 I SystemServer: Camera Service

A101-01 08:08:23.691   661   661 I SystemServiceManager: Starting com.android.server.camera.CameraService

//Android账户服务,提供了对账户、密码、授权的集中管理

A101-01 08:08:23.704   661   661 I SystemServer: StartAccountManagerService

A101-01 08:08:23.707   661   661 I SystemServiceManager: Starting com.android.server.accounts.AccountManagerService$Lifecycle

//内容服务,主要是数据库等提供解决方法的服务

A101-01 08:08:23.720   661   661 I SystemServer: StartContentService

A101-01 08:08:23.722   661   661 I SystemServiceManager: Starting com.android.server.content.ContentService$Lifecycle

//将SettingsProvider放到SystemServer进程中来运行

A101-01 08:08:23.731   661   661 I SystemServer: InstallSystemProviders

//android 震动马达相关的service

A101-01 08:08:23.807   661   661 I SystemServer: StartVibratorService

//远程控制,通过红外等控制周围的设备

A101-01 08:08:23.821   661   661 I SystemServer: StartConsumerIrService

//展讯自己加的一个服务

A101-01 08:08:23.826   661   661 I SystemServer: PowerGuru Manager

//提供闹铃和定时器等功能

A101-01 08:08:23.844   661   661 I SystemServer: StartAlarmManagerService

A101-01 08:08:23.844   661   661 I SystemServiceManager: Starting com.android.server.AlarmManagerService

//初始化watchdog

A101-01 08:08:23.873   661   661 I SystemServer: InitWatchdog

//处理事件分发

A101-01 08:08:23.874   661   661 I SystemServer: StartInputManagerService

//窗口管理服务

A101-01 08:08:23.886   661   661 I SystemServer: StartWindowManagerService

//android N增加的适用VR服务的

A101-01 08:08:24.013   661   661 I SystemServer: StartVrManagerService

A101-01 08:08:24.013   661   661 I SystemServiceManager: Starting com.android.server.vr.VrManagerService

A101-01 08:08:24.048   661   661 I SystemServiceManager: Starting com.android.server.BluetoothService

A101-01 08:08:24.071   661   661 I SystemServer: ConnectivityMetricsLoggerService??

A101-01 08:08:24.072   661   661 I SystemServiceManager: Starting com.android.server.connectivity.MetricsLoggerService

A101-01 08:08:24.076   661   661 I SystemServer: PinnerService?

A101-01 08:08:24.076   661   661 I SystemServiceManager: Starting com.android.server.PinnerService

//输入法服务,打开和关闭输入法

A101-01 08:08:24.079   661   661 I SystemServiceManager: Starting com.android.server.InputMethodManagerService$Lifecycle

//辅助管理程序截获所有的用户输入,并根据这些输入给用户一些额外的反馈,起到辅助的效果,View的点击、焦点等事件分发管理服。

A101-01 08:08:24.171   661   661 I SystemServer: StartAccessibilityManagerService

//磁盘加载服务程序,一般要和一个linux daemon程序如vold/mountd等合作起作用,主要负责监听并广播device的mount/unmount/badremoval等等事件。

A101-01 08:08:24.223   661   661 I SystemServiceManager: Starting com.android.server.MountService$Lifecycle

//管理当前Android设备的夜间模式和行车模式.

A101-01 08:08:24.273   661   661 I SystemServiceManager: Starting com.android.server.UiModeManagerService

//和锁屏界面中的输入密码,手势等安全功能有关。可以保存每个user的相关锁屏信息

A101-01 08:08:24.300   661   661 I SystemServer: StartLockSettingsService

A101-01 08:08:24.310   661   661 I SystemServiceManager: Starting com.android.server.LockSettingsService$Lifecycle

A101-01 08:08:24.330   661   661 I SystemServiceManager: Starting com.android.server.PersistentDataBlockService??

//这个服务可以控制设备的Idle状态。而当设备在idle状态时,它会忽略cpu的wakelock,Alarm等。

A101-01 08:08:25.386   661   661 I SystemServiceManager: Starting com.android.server.DeviceIdleController

//提供一些系统级别的设置及属性

A101-01 08:08:25.394   661   661 I SystemServiceManager: Starting com.android.server.devicepolicy.DevicePolicyManagerService$Lifecycle

//状态栏

A101-01 08:08:25.417   661   661 I SystemServer: StartStatusBarManagerService

//剪贴板功能

A101-01 08:08:25.429   661   661 I SystemServer: StartClipboardService

//网络管理服务。Android 系统网络连接和管理服务由四个系统服务ConnectivityService、NetworkPolicyManagerService、NetworkManagementService、NetworkStatsService共同配合完成网络连接和管理功能。ConnectivityService、NetworkPolicyManagerService、NetworkStatsService三个服务都通过INetworkManagementService接口跨进程访问NetworkManagementService服务,实现与网络接口的交互及信息读取。

A101-01 08:08:25.438   661   661 I SystemServer: StartNetworkManagementService

A101-01 08:08:25.452   661   661 I SystemServiceManager: Starting com.android.server.TextServicesManagerService$Lifecycle

A101-01 08:08:25.469   661   661 I SystemServer: StartNetworkScoreService

A101-01 08:08:25.474   661   661 I SystemServer: StartNetworkStatsService

A101-01 08:08:25.493   661   661 I SystemServer: StartNetworkPolicyManagerService

A101-01 08:08:25.523   661   661 I SystemServiceManager: Starting com.android.server.wifi.p2p.WifiP2pService

A101-01 08:08:25.591   661   661 I SystemServiceManager: Starting com.android.server.wifi.WifiService

A101-01 08:08:25.898   661   661 I SystemServiceManager: Starting com.android.server.wifi.scanner.WifiScanningService

A101-01 08:08:25.907   661   661 I SystemServiceManager: Starting com.android.server.wifi.RttService

A101-01 08:08:25.913   661   661 I SystemServer: StartConnectivityService

//网络搜索服务

A101-01 08:08:25.949   661   661 I SystemServer: StartNsdService

A101-01 08:08:25.959   661   661 I SystemServer: StartUpdateLockService//提供升级锁

A101-01 08:08:25.964   661   661 I SystemServiceManager: Starting com.android.server.RecoverySystemService//OTA升级相关的service

A101-01 08:08:25.969   661   661 I SystemServiceManager: Starting com.android.server.notification.NotificationManagerService//通知服务

A101-01 08:08:26.046   661   661 I SystemServiceManager: Starting com.android.server.storage.DeviceStorageMonitorService//手机存储监控

A101-01 08:08:26.057   661   661 I SystemServer: StartLocationManagerService//位置服务,GPS、定位等。

A101-01 08:08:26.066   661   661 I SystemServer: StartCountryDetectorService//检测用户国家

A101-01 08:08:26.070   661   661 I SystemServer: StartSearchManagerService//搜索服务

A101-01 08:08:26.071   661   661 I SystemServiceManager: Starting com.android.server.search.SearchManagerService$Lifecycle

A101-01 08:08:26.077   661   661 I SystemServiceManager: Starting com.android.server.DropBoxManagerService//用于系统运行时日志的存储管理

A101-01 08:08:26.081   661   661 I SystemServer: StartWallpaperManagerService//壁纸管理服务

A101-01 08:08:26.082   661   661 I SystemServiceManager: Starting com.android.server.wallpaper.WallpaperManagerService$Lifecycle

A101-01 08:08:26.096   661   661 I SystemServer: StartAudioService

A101-01 08:08:26.097   661   661 I SystemServiceManager: Starting com.android.server.audio.AudioService$Lifecycle

A101-01 08:08:26.167   661   661 I SystemServiceManager: Starting com.android.server.DockObserver//应该是手机设备底座管理

A101-01 08:08:26.173   661   661 I SystemServer: StartWiredAccessoryManager//监视手机和底座上的耳机

A101-01 08:08:26.177   661   661 I SystemServiceManager: Starting com.android.server.midi.MidiService$Lifecycle//MIDI管理

A101-01 08:08:26.185   661   661 I SystemServiceManager: Starting com.android.server.usb.UsbService$Lifecycle//USB管理

A101-01 08:08:26.227   661   661 I SystemServer: StartSerialService//对串口的设备进行操作

A101-01 08:08:26.236   661   661 I SystemServer: BoardScore Service

A101-01 08:08:26.255   661   661 I SystemServiceManager: Starting com.android.server.twilight.TwilightService//指出用户当前所在位置是否为晚上,被UiModeManager等用来调整夜间模式。

A101-01 08:08:26.264   661   661 I SystemServiceManager: Starting com.android.server.job.JobSchedulerService//允许开发者在符合某些条件时创建执行在后台的任务。

A101-01 08:08:26.295   661   661 I SystemServiceManager: Starting com.android.server.soundtrigger.SoundTriggerService//应该是语音识别相关的

A101-01 08:08:26.304   661   661 I SystemServiceManager: Starting com.android.server.backup.BackupManagerService$Lifecycle//备份服务

A101-01 08:08:26.314   661   661 I SystemServiceManager: Starting com.android.server.appwidget.AppWidgetService//应用小部件服务

A101-01 08:08:26.338   661   661 I SystemServiceManager: Starting com.android.server.voiceinteraction.VoiceInteractionManagerService//也是语音识别相关的服务

A101-01 08:08:26.343   661   661 I SystemServer: Gesture Launcher Service??监控传感器的某些手势操作,然后启动相应的inten

A101-01 08:08:26.344   661   661 I SystemServiceManager: Starting com.android.server.GestureLauncherService

A101-01 08:08:26.345   661   661 I SystemServiceManager: Starting com.android.server.SensorNotificationService//传感器的通知服务

A101-01 08:08:26.346   661   661 I SystemServiceManager: Starting com.android.server.ContextHubSystemService

A101-01 08:08:26.351   661   661 I SystemServer: StartDiskStatsService//磁盘统计服务,供dumpsys使用

A101-01 08:08:26.354   661   661 I SystemServer: StartSamplingProfilerService//性能统计

A101-01 08:08:26.368   661   661 I SystemServer: StartNetworkTimeUpdateService//监视网络时间,当网络时间变化时更新本地时间。

A101-01 08:08:26.372   661   661 I SystemServer: StartCommonTimeManagementService//管理本地常见的时间服务的配置,在网络配置变化时重新配置本地服务

A101-01 08:08:26.376   661   661 I SystemServer: CertBlacklister//黑名单

A101-01 08:08:26.382   661   661 I SystemServiceManager: Starting com.android.server.dreams.DreamManagerService//屏幕保护

A101-01 08:08:26.387   661   661 I SystemServer: StartAssetAtlasService//负责将预加载的bitmap组装成纹理贴图,生成的纹理贴图可以被用来跨进程使用,以减少内存。

A101-01 08:08:26.397   661   661 I SystemServiceManager: Starting com.android.server.print.PrintManagerService//打印相关服务

A101-01 08:08:26.406   661   661 I SystemServiceManager: Starting com.android.server.restrictions.RestrictionsManagerService??

A101-01 08:08:26.411   661   661 I SystemServiceManager: Starting com.android.server.media.MediaSessionService//多媒体相关的服务

A101-01 08:08:26.425   661   661 I SystemServer: StartMediaRouterService

A101-01 08:08:26.433   661   661 I SystemServiceManager: Starting com.android.server.trust.TrustManagerService

A101-01 08:08:26.443   661   661 I SystemServer: StartBackgroundDexOptService

A101-01 08:08:26.449   661   661 I SystemServiceManager: Starting com.android.server.pm.ShortcutService$Lifecycle

A101-01 08:08:26.458   661   661 I SystemServiceManager: Starting com.android.server.pm.LauncherAppsService

A101-01 08:08:26.467   661   661 I SystemServiceManager: Starting com.android.server.media.projection.MediaProjectionManagerService

A101-01 08:08:26.502   661   661 I SystemServiceManager: Starting com.android.server.MmsServiceBroker

  1. Phase480

进入阶段PHASE_LOCK_SETTINGS_READY=480阶段,会进行回调的服务

DevicePolicyManagerService

onBootPhase(480)

DevicePolicyManagerService

阶段480后马上就进入阶段500

A101-01 08:08:26.572   661   661 I SystemServiceManager: Starting phase 480

  1. Phase500

PHASE_SYSTEM_SERVICES_READY=500,进入该阶段服务能安全地调用核心系统服务,

会进行回调的服务:

AlarmManagerService

JobSchedulerService

NotificationManagerService

BackupManagerService

UsageStatsService

DeviceIdleController

TrustManagerService

UiModeManagerService

BluetoothService

BluetoothManagerService

EthernetService

WifiP2pService

WifiScanningService

WifiService

RttService

onBootPhase(500)

然后会执行各主要服务的systemReady():

WindowManagerService.systemReady():

PowerManagerService.systemReady():

PackageManagerService.systemReady():

DisplayManagerService.systemReady():

最后执行AMS.systemReady方法.AMS在进行systemReady的时候回调用期待systemUI和homeActivity。

A101-01 08:08:26.595   661   661 I SystemServiceManager: Starting phase 500

A301-01 08:08:26.810   661   661 I boot_progress_ams_ready: 31930

A101-01 08:08:26.810   661   661 I ActivityManager: System now ready

A101-01 08:08:26.823   661   661 I SystemServer: Making services ready

  1. Phase550

PHASE_ACTIVITY_MANAGER_READY=550,

A此阶段AMS的相关Service 已准备就绪,进入该阶段服务能广播Intent;

但是system_server主线程并没有就绪.

会进行回调的服务:

MountService

TelecomLoaderService

UsbService

WebViewUpdateService

DockObserver

BatteryService

onBootPhase(550)

接下来执行会进行AMS启动native crash监控,,加载WebView,启动SystemUi等

mActivityManagerService.startObservingNativeCrashes();

WebViewFactory.prepareWebViewInSystemServer();

startSystemUi(context);

networkScoreF.systemReady();

networkManagementF.systemReady();

networkStatsF.systemReady();

networkPolicyF.systemReady();

connectivityF.systemReady();

audioServiceF.systemReady();

Watchdog.getInstance().start();

A101-01 08:08:26.823   661   661 I SystemServiceManager: Starting phase 550

A101-01 08:08:26.830   661   661 D BluetoothManagerService: Bluetooth boot completed

A101-01 08:08:27.066   661   661 I ActivityManager: Start proc 865:com.android.systemui/u0a13 for service com.android.systemui/.ImageWallpaper

A101-01 08:08:27.105   661   661 I SystemServer: WebViewFactory preparation

6Phase600

PHASE_THIRD_PARTY_APPS_CAN_START=600

该阶段会进行回调的服务:

JobSchedulerService

NotificationManagerService

BackupManagerService

AppWidgetService

GestureLauncherService

DreamManagerService

TrustManagerService

VoiceInteractionManagerService

onBootPhase(600)

然后接下来就是各种服务的systemRunning过程:

WallpaperManagerService、InputMethodManagerService、LocationManagerService、CountryDetectorService、NetworkTimeUpdateService、CommonTimeManagementService、TextServicesManagerService、AssetAtlasService、InputManagerService、TelephonyRegistry、MediaRouterService、MmsServiceBroker这些服务依次执行其systemRunning()方法。

然后会执行start home activity。

Log:

A101-01 08:08:30.657   661   661 I SystemServiceManager: Starting phase 600

A101-01 08:08:31.714   661   661 I SystemServer: WcnManager Service//sprd 添加

  1. Phase1000

PHASE_BOOT_COMPLETED = 1000

当Home Activity启动时,会执行如下调用调用到AMS.finishBooting(),然后则进入阶段Phase1000。

ActivityStarter.startHomeActivityLocked

ActivityStarter.startActivityLocked

WindowManagerService.continueSurfaceLayout

WindowSurfacePlacer.continueLayout

WindowSurfacePlacer.performSurfacePlacement

WindowSurfacePlacer.performSurfacePlacementLoop

WindowSurfacePlacer.performSurfacePlacementInner

WindowManagerService.enableScreenIfNeededLocked

WindowManagerService.performEnableScreen

ActivityManagerService.bootAnimationComplete

ActivityManagerService.finishBooting

到此,系统服务启动阶段完成就绪,system_server进程启动完成则进入Looper.loop()状态,随时待命,等待消息队列MessageQueue中的消息到来,则马上进入执行状态。

Log:

A101-01 08:08:35.805   661   701 I SystemServiceManager: Starting phase 1000

  1. SystemServer启动系统服务的启动方式

system_server进程中的服务启动方式有两种,分别是SystemServiceManager的startService()和ServiceManager的addService

1.startService

通过SystemServiceManager的startService(Class<T> serviceClass)用于启动继承于SystemService的服务。主要功能:

创建serviceClass类对象,将新建对象注册到SystemServiceManager的成员变量mServices;

调用新建对象的onStart()方法,即调用serviceClass.onStart();

当系统启动到一个新的阶段Phase时,SystemServiceManager的startBootPhase()会循环遍历所有向SystemServiceManager注册过服务的onBootPhase()方法,即调用serviceClass.onBootPhase()。

2.addService

通过ServiceManager的addService(String name, IBinder service)用于初始化继承于IBinder的服务。主要功能:

将该服务向Native层的serviceManager注册服务。

  1. 服务类别

system_server进程,从启动的服务可以分为引导服务、核心服务、其他服务3类。

引导服务(7个):ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、SensorService;

核心服务(3个):BatteryService、UsageStatsService、WebViewUpdateService;

其他服务:AlarmManagerService、VibratorServic.

Android 7.0平台开机启动相关推荐

  1. Android 4.0 平台特性

    Android 4.0 平台特性 API等级:14  Android4.0 是一次重要的平台发布版,为用户和应用程序开发者增加了大量的新特性.在下面我们将讨论的所有新特性和API中,因为它将 Andr ...

  2. Android 学习 之 Android 4.0 平台

    [size=large]转转转,感谢饿哦额Android的各位大侠,在这里谢过,我这里做个备份,嘿嘿!! http://www.eoeandroid.com/thread-103300-1-1.htm ...

  3. Android 7.0 SystemUI 之启动和状态栏和导航栏简介

    Android 7.0 SystemUI 之启动和状态栏和导航栏简介 一.SystemUI 是什么 首先SystemUI 是一个系统应用,apk路径位于/system/priv-app 源码路径位于: ...

  4. 深入分析Android 9.0源代码——Activity启动流程

    引言 点击此处查看<深入分析Android 9.0源代码>系列的组织结构和相关说明. 1 应用进程发起启动请求 本章的调用流程如下图所示: (Context) Activity Instr ...

  5. android app启动流程分析,Android应用开发之Android 7.0 Launcher3的启动和加载流程分析...

    本文将带你了解Android应用开发Android 7.0 Launcher3的启动和加载流程分析,希望本文对大家学Android有所帮助. Android 7.0 Launcher3的启动和加载流程 ...

  6. Android 7.0 Launcher3的启动和加载流程分析----转载

     Android 7.0 Launcher3的启动和加载流程分析,Launcher的本质就是一个普通应用,它比普通应用多配置了Category的Android:name="android ...

  7. Android定制:修改开机启动画面

    转自:https://blog.csdn.net/godiors_163/article/details/72529210 引言 Android系统在按下开机键之后就会进入启动流程,这个过程本身需要一 ...

  8. android 4.0.3开机时不能收到广播

    ============问题描述============ 在android 4.0.3的手机上,receiver在手机开机后收不到启动广播,代码如下: 配置文件:    <receiver an ...

  9. 【Android】简单的开机启动、全屏、Dialog尺寸

    因为我的项目大部分是在工业机运行,而工业机的Rom相对版本比较低,权限也都给的很足.因此也不需要过多的设置,就将最基本的代码贴一下. 一.开机启动 1.创建一个广播接受者BroadcastReceiv ...

最新文章

  1. 两数、三数、四数之和相关题目(Leetcode题解-Python语言)
  2. OpenShift 4 - 下载OpenShift项目中的ImageStream
  3. 认识队列技术中的硬件队列和软件队列及如何改变硬件队列长度
  4. Linux 根文件系统目录结构与功能,4.Linux根文件系统和目录结构及bash特性
  5. VSCode 将已编辑好的文件中的 tab 键转换成空格键
  6. 哪些大学有计算机动漫专业,计算机专业考研有哪些值得推荐的院校?
  7. Python科学计算
  8. 在IntelliJ IDEA中使用 JAVAFX 过程记录
  9. 【人工智能】想要入坑机器学习?这是MIT在读博士的AI心得
  10. Vue运行环境及淘宝镜像(cnpm命令)安装
  11. 如何利用碎片化时间形成知识体系
  12. 管理中的“鲶鱼效应”
  13. 打开chm手册显示已取消到该网页的导航
  14. 【高登世德:为资产证券化引入区块链技术】GBCAX
  15. 游戏项目开发的简单流程
  16. 制作轮播图经验分享——element ui走马灯的使用(附源码,效果截图)
  17. 微信小程序 订单倒计时
  18. HRBUSTOJ 1313 火影忍者之~静音 【模拟】【排序】
  19. glassfish java ee_GlassFish 3.1.2发布 开源的JavaEE应用服务器
  20. rapidSVN : Error while performing action: ra_serf: The server sent a truncated HTTP response body.

热门文章

  1. 数据可视化优秀作品欣赏
  2. 阿里云域名备案和域名解析流程详解
  3. Actin机器人控制软件,专注于机器人路径规划
  4. java字符串是否相等的三种判断方法
  5. linux查看硬盘信息命令
  6. VSC学习前端,不容错过的插件
  7. 第一次学习计划(含用pytorch跑通mnist例子)
  8. 阿里云企业发展史中的重大事件一览
  9. C++的函数声明、函数定义、函数调用
  10. 摄影基础1 : 135相机