Android 7.0平台开机启动
- Android 启动概述
Android 系统是运行在Linux 内核上的,所以它的启动过程则是基于kernel的启动发生的。首先Kernel启动过程中会创建用户空间的第一个进程init进程,该进程也是用户空间的鼻祖,是系统的守护进程。之后init进程会启动serviceManager,它则是bind的服务管家,后续启动的许多系统或用户service都会在它里面进行注册。然后init进程也会创建Zygote进程,这个进程则是Java进程的鼻祖。之后的系统主进程system_server进程和其他app进程则都是由Zygote进程创建的。
- Init进程启动概述
init是Linux系统中用户空间的第一个进程(pid=1), Kerner启动后会调用/system/core/init/Init.cpp的main()方法.
Init 主要做的4件事
- 分析和运行所有的init.rc文件;
- 生成设备驱动节点; (通过rc文件创建)
- 处理子进程的终止(signal方式);
- 提供属性服务property service
- 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;
}
- 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进程。
- Zygote进程启动概述
- 配置文件解析
从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()方法.调用流程:
- 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;
}
}
- 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 <<<<<<
- 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
- SystemServer启动流程分析
SystemServer是Android Framework层的主进程,该进程运行着Framework的核心服务。systemServer由Zygote启动 fork生成的。进程名是system_server,上文我们跟踪代码分析到Zygote进程会调用startSystemServer()方法走入system_server的启动流程。
下图是systemServer的启动框图:
那么我们将按照上图对于主要函数进行分析
- Zygote 进程启动SystemServer
- 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;
}
- 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;
}
- 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);
}
}
- 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 });
}
……
}
- 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
- SystemServer 启动系统服务
上文我们知道通过Zygote fork SystemServer 进程,调用到SystemServer.main()方法。这一节我们主要关注启动的各个阶段启动的服务,和相关分类。
首先main函数的只是执行new SystemServer().run(); 实例化systemServer并执行run方法。
而对于run方法我们除了一些运行状态的初始化以外,主要关注下面几个方法。
performPendingShutdown();
createSystemContext();
mSystemServiceManager = new SystemServiceManager(mSystemContext);
startBootstrapServices();
startCoreServices();
startOtherServices();
Looper.loop()
- 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
- 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();
- 系统服务启动的六个阶段
在完成每阶段的执行后,systemServer通过调用mSystemServiceManager.startBootPhase() 方式发出消息。
而一些服务则会对其进行回调。
- 系统服务启动阶段:
创建四大引导服务
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
- 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
- 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
- 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
- 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
6.Phase600
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 添加
- 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
- 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注册服务。
- 服务类别
system_server进程,从启动的服务可以分为引导服务、核心服务、其他服务3类。
引导服务(7个):ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、SensorService;
核心服务(3个):BatteryService、UsageStatsService、WebViewUpdateService;
其他服务:AlarmManagerService、VibratorServic.
Android 7.0平台开机启动相关推荐
- Android 4.0 平台特性
Android 4.0 平台特性 API等级:14 Android4.0 是一次重要的平台发布版,为用户和应用程序开发者增加了大量的新特性.在下面我们将讨论的所有新特性和API中,因为它将 Andr ...
- Android 学习 之 Android 4.0 平台
[size=large]转转转,感谢饿哦额Android的各位大侠,在这里谢过,我这里做个备份,嘿嘿!! http://www.eoeandroid.com/thread-103300-1-1.htm ...
- Android 7.0 SystemUI 之启动和状态栏和导航栏简介
Android 7.0 SystemUI 之启动和状态栏和导航栏简介 一.SystemUI 是什么 首先SystemUI 是一个系统应用,apk路径位于/system/priv-app 源码路径位于: ...
- 深入分析Android 9.0源代码——Activity启动流程
引言 点击此处查看<深入分析Android 9.0源代码>系列的组织结构和相关说明. 1 应用进程发起启动请求 本章的调用流程如下图所示: (Context) Activity Instr ...
- android app启动流程分析,Android应用开发之Android 7.0 Launcher3的启动和加载流程分析...
本文将带你了解Android应用开发Android 7.0 Launcher3的启动和加载流程分析,希望本文对大家学Android有所帮助. Android 7.0 Launcher3的启动和加载流程 ...
- Android 7.0 Launcher3的启动和加载流程分析----转载
Android 7.0 Launcher3的启动和加载流程分析,Launcher的本质就是一个普通应用,它比普通应用多配置了Category的Android:name="android ...
- Android定制:修改开机启动画面
转自:https://blog.csdn.net/godiors_163/article/details/72529210 引言 Android系统在按下开机键之后就会进入启动流程,这个过程本身需要一 ...
- android 4.0.3开机时不能收到广播
============问题描述============ 在android 4.0.3的手机上,receiver在手机开机后收不到启动广播,代码如下: 配置文件: <receiver an ...
- 【Android】简单的开机启动、全屏、Dialog尺寸
因为我的项目大部分是在工业机运行,而工业机的Rom相对版本比较低,权限也都给的很足.因此也不需要过多的设置,就将最基本的代码贴一下. 一.开机启动 1.创建一个广播接受者BroadcastReceiv ...
最新文章
- 两数、三数、四数之和相关题目(Leetcode题解-Python语言)
- OpenShift 4 - 下载OpenShift项目中的ImageStream
- 认识队列技术中的硬件队列和软件队列及如何改变硬件队列长度
- Linux 根文件系统目录结构与功能,4.Linux根文件系统和目录结构及bash特性
- VSCode 将已编辑好的文件中的 tab 键转换成空格键
- 哪些大学有计算机动漫专业,计算机专业考研有哪些值得推荐的院校?
- Python科学计算
- 在IntelliJ IDEA中使用 JAVAFX 过程记录
- 【人工智能】想要入坑机器学习?这是MIT在读博士的AI心得
- Vue运行环境及淘宝镜像(cnpm命令)安装
- 如何利用碎片化时间形成知识体系
- 管理中的“鲶鱼效应”
- 打开chm手册显示已取消到该网页的导航
- 【高登世德:为资产证券化引入区块链技术】GBCAX
- 游戏项目开发的简单流程
- 制作轮播图经验分享——element ui走马灯的使用(附源码,效果截图)
- 微信小程序 订单倒计时
- HRBUSTOJ 1313 火影忍者之~静音 【模拟】【排序】
- glassfish java ee_GlassFish 3.1.2发布 开源的JavaEE应用服务器
- rapidSVN : Error while performing action: ra_serf: The server sent a truncated HTTP response body.