Linux内核启动后,Android系统启动有4个步骤;
(1)init进程启动
(2)Native服务启动
(3)System Server及Java服务启动
(4)Home启动
Init进程启动后,将根据init.rc及initXXX.rc的内容执行一系列的命令,包括创建mount目录,安装文件系统,设置属性,启动adb,systemserver,mediaserver
system/core/rootdir/init.rc 内容如下:
- <span style="font-size:18px;"># setup the global environment //设置环境变量
- export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
- export LD_LIBRARY_PATH /vendor/lib:/system/lib
- ...
- # Filesystem image public mount points. //mount文件系统
- mkdir /mnt/obb 0700 root system
- mount tmpfs tmpfs /mnt/obb mode=0755,gid=1000
- ...
- </span>
- <span style="font-size:18px;"># Define the oom_adj values for the classes of processes that can be
- # killed by the kernel. These are used in ActivityManagerService.
- setprop ro.FOREGROUND_APP_ADJ 0
- ...
- service servicemanager /system/bin/servicemanager //在其他服务启动前必须启动ServiceManager
- class pre_zygote_services
- user system
- group system
- critical
- onrestart restart zygote
- onrestart restart media
- </span>
- <span style="font-size:18px;">service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server //启动SystemServer
- class zygote_services
- socket zygote stream 666
- onrestart write /sys/android_power/request_state wake
- onrestart write /sys/power/state on
- onrestart restart media
- onrestart restart netd
- service media /system/bin/mediaserver //启动mediaserver,启动多媒体相关的camera/playback等服务
- class zygote_services
- user media
- group system audio camera graphics inet net_bt net_bt_admin net_raw mot_drm input mot_tpapi mot_secclkd mot_pwric mot_caif
- ioprio rt 4</span>
代码中service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server将启动systemserver。
具体调用路径如下:
frameworks/base/cmds/app_process/app_main.cpp
- <span style="font-size:18px;">int main(int argc, const char* const argv[])
- {
- ...
- // Next arg is startup classname or "--zygote"
- if (i < argc) {
- arg = argv[i++];
- if (0 == strcmp("--zygote", arg)) { //命令行必须含 --zygote
- bool startSystemServer = (i < argc) ?
- strcmp(argv[i], "--start-system-server") == 0 : false; //命令行是否含--start-system-server
- setArgv0(argv0, "zygote");
- set_process_name("zygote");
- runtime.start("com.android.internal.os.ZygoteInit",
- startSystemServer); //此处启动systemserver
- } else {
- ...
- }</span>
frameworks/base/core/jni/AndroidRuntime.cpp
- <span style="font-size:18px;">void AndroidRuntime::start(const char* className, const bool startSystemServer)
- {
- ...
- /* start the virtual machine */
- if (startVm(&mJavaVM, &env) != 0)
- goto bail;
- /*
- * Register android functions.
- */
- if (startReg(env) < 0) {
- LOGE("Unable to register all android natives\n");
- goto bail;
- }
- ...
- if (startClass == NULL) {
- LOGE("JavaVM unable to locate class '%s'\n", slashClassName);
- /* keep going */
- } else {
- startMeth = env->GetStaticMethodID(startClass, "main",
- "([Ljava/lang/String;)V");
- if (startMeth == NULL) {
- LOGE("JavaVM unable to find main() in '%s'\n", className);
- /* keep going */
- } else {
- env->CallStaticVoidMethod(startClass, startMeth, strArray); //调用com.android.internal.os.ZygoteInit的main()方法
- }
- }
- bail:
- free(slashClassName);
- }</span>
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
- <span style="font-size:18px;"> public static void main(String argv[]) {
- try {
- VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024);
- ... registerZygoteSocket();
- ... preloadClasses();
- ... preloadResources();
- // Do an initial gc to clean up after startup
- gc();
- ...
- if (argv[1].equals("true")) { //只支持true参数
- startSystemServer(); //此处启动systemserver
- }
- ...
- if (ZYGOTE_FORK_MODE) { //目前为false
- runForkMode();
- } else {
- runSelectLoopMode(); //将在Loop中顺序处理以后的For请求
- }
- closeServerSocket();
- } catch (MethodAndArgsCaller caller) {
- caller.run();
- } catch (RuntimeException ex) {
- Log.e(TAG, "Zygote died with exception", ex);
- closeServerSocket();
- throw ex;
- }
- }</span>
- <span style="font-size:18px;"> private static boolean startSystemServer()
- throws MethodAndArgsCaller, RuntimeException {
- /* Hardcoded command line to start the system server */
- String args[] = {
- "--setuid=1000",
- "--setgid=1000",
- ... "--capabilities=130104352,130104352",
- "--runtime-init",
- "--nice-name=system_server",
- "com.android.server.SystemServer", //指定要启动的类名
- };
- ZygoteConnection.Arguments parsedArgs = null;...
- try {
- parsedArgs = new ZygoteConnection.Arguments(args);
- ...
- /* Request to fork the system server process */
- pid = Zygote.forkSystemServer( //fork出进程
- parsedArgs.uid, parsedArgs.gid,
- parsedArgs.gids, debugFlags, null,
- parsedArgs.permittedCapabilities,
- parsedArgs.effectiveCapabilities);
- } catch (IllegalArgumentException ex) {
- throw new RuntimeException(ex);
- }
- /* For child process */
- if (pid == 0) {
- handleSystemServerProcess(parsedArgs); //在fork出的进程里执行systemserver启动
- }
- return true;
- }</span>
- <span style="font-size:18px;"> private static void handleSystemServerProcess(
- ZygoteConnection.Arguments parsedArgs)
- throws ZygoteInit.MethodAndArgsCaller {
- closeServerSocket();
- RuntimeInit.zygoteInit(parsedArgs.remainingArgs);
- }</span>
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
- <span style="font-size:18px;"> public static final void zygoteInit(String[] argv)
- throws ZygoteInit.MethodAndArgsCaller {
- ...
- commonInit(); //初始化时区,设置agent
- zygoteInitNative(); //调用到com_android_internal_os_RuntimeInit_zygoteInit@AndroidRuntime.cpp -> gCurRuntime->onZygoteInit(),此处启动ThreadPool
- ...
- invokeStaticMain(startClass, startArgs); //调用com.android.server.SystemServer的main方法
- }</span>
frameworks/base/cmds/app_process/app_main.cpp
- <span style="font-size:18px;"> virtual void onZygoteInit()
- {
- sp<ProcessState> proc = ProcessState::self();
- if (proc->supportsProcesses()) {
- LOGV("App process: starting thread pool.\n");
- proc->startThreadPool(); //启动线程池处理Binder事件
- }
- }</span>
frameworks/base/services/java/com/android/server/SystemServer.java
- <span style="font-size:18px;"> public static void main(String[] args) {
- ...
- // The system server has to run all of the time, so it needs to be
- // as efficient as possible with its memory usage.
- VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
- System.loadLibrary("android_servers"); //Load JNI library here that is used by SystemServer
- init1(args); //这里调用到android_server_SystemServer_init1@com_android_server_SystemServer.cpp
- }</span>
frameworks/base/services/jni/com_android_server_SystemServer.cpp
- <span style="font-size:18px;">static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
- {
- system_init();
- }</span>
frameworks/base/cmds/system_server/library/system_init.cpp
- <span style="font-size:18px;">extern "C" status_t system_init()
- {
- sp<ProcessState> proc(ProcessState::self());
- sp<IServiceManager> sm = defaultServiceManager();
- LOGI("ServiceManager: %p\n", sm.get());
- sp<GrimReaper> grim = new GrimReaper();
- sm->asBinder()->linkToDeath(grim, grim.get(), 0);
- char propBuf[PROPERTY_VALUE_MAX];
- property_get("system_init.startsurfaceflinger", propBuf, "1");
- if (strcmp(propBuf, "1") == 0) { //可以通过改变属性来设置SurfaceFlinger是否run在systemserver里
- // Start the SurfaceFlinger
- SurfaceFlinger::instantiate();
- }
- // Start the sensor service
- SensorService::instantiate(); //启动SensorService
- // On the simulator, audioflinger et al don't get started the
- // same way as on the device, and we need to start them here
- if (!proc->supportsProcesses()) { //在phone上,这些service在mediaserver中创建。模拟器上,以下service在此进程创建
- // Start the AudioFlinger
- AudioFlinger::instantiate();
- // Start the media playback service
- MediaPlayerService::instantiate();
- // Start the camera service
- CameraService::instantiate();
- // Start the audio policy service
- AudioPolicyService::instantiate();
- }
- AndroidRuntime* runtime = AndroidRuntime::getRuntime();
- runtime->callStatic("com/android/server/SystemServer", "init2");//调用init2@SystemServer.java,在这里创建工作线程以启动各java服务并进入循环处理各service请求
- if (proc->supportsProcesses()) {
- ProcessState::self()->startThreadPool(); //启动线程池,注意:由于前面已经调用过startThreadPool,故此次调用不做任何事情
- IPCThreadState::self()->joinThreadPool(); //主线程加入到线程池里
- }
- return NO_ERROR;
- }</span>
frameworks/base/services/java/com/android/server/SystemServer.java
- <span style="font-size:18px;">public class SystemServer
- {
- public static final void init2() {
- Slog.i(TAG, "Entered the Android system server!");
- Thread thr = new ServerThread(); //创建新线程
- thr.setName("android.server.ServerThread");
- thr.start(); //启动工作线程
- }
- </span>
此线程实现Java Service注册初始化及进入SystemServer事件处理循环。
- <span style="font-size:18px;">class ServerThread extends Thread {
- @Override
- public void run() {
- Looper.prepare();
- android.os.Process.setThreadPriority(
- android.os.Process.THREAD_PRIORITY_FOREGROUND);
- BinderInternal.disableBackgroundScheduling(true);
- android.os.Process.setCanSelfBackground(false);
- // Critical services...
- try {
- ServiceManager.addService("entropy", new EntropyService()); //注册Service到ServiceManager
- power = new PowerManagerService();
- ServiceManager.addService(Context.POWER_SERVICE, power);
- context = ActivityManagerService.main(factoryTest); //注意:此处启动ActivityManagerService
- ...
- wm.systemReady(); //通知SystemReady
- power.systemReady();
- try {
- pm.systemReady();
- } catch (RemoteException e) {
- }
- ...
- // We now tell the activity manager it is okay to run third party
- // code. It will call back into us once it has gotten to the state
- // where third party code can really run (but before it has actually
- // started launching the initial applications), for us to complete our
- // initialization.
- ((ActivityManagerService)ActivityManagerNative.getDefault())
- .systemReady(new Runnable() { //此处启动Home
- public void run() {
- if (statusBarF != null) statusBarF.systemReady2();
- if (batteryF != null) batteryF.systemReady();
- if (connectivityF != null) connectivityF.systemReady();
- if (dockF != null) dockF.systemReady();
- if (usbF != null) usbF.systemReady();
- if (uiModeF != null) uiModeF.systemReady();
- if (recognitionF != null) recognitionF.systemReady();
- Watchdog.getInstance().start();
- // It is now okay to let the various system services start their
- // third party code...
- if (appWidgetF != null) appWidgetF.systemReady(safeMode);
- if (wallpaperF != null) wallpaperF.systemReady();
- if (immF != null) immF.systemReady();
- if (locationF != null) locationF.systemReady();
- if (throttleF != null) throttleF.systemReady();
- }
- ...
- Looper.loop(); //进入循环,处理请求
- }
- }
- </span>
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
- public static final Context main(int factoryTest) {
- AThread thr = new AThread();
- thr.start();
- synchronized (thr) { //等待<span style="font-size:18px;"><span style="font-size:18px;">ActivityManagerService</span></span>对象创建完成
- while (thr.mService == null) {
- try {
- thr.wait();
- } catch (InterruptedException e) {
- }
- }
- }
- ActivityThread at = ActivityThread.systemMain(); //把此线程作为<span style="font-size:18px;"><span style="font-size:18px;">ActivityManagerService</span></span>的system线程
- mSystemThread = at;
- Context context = at.getSystemContext();
- m.mContext = context;
- m.mFactoryTest = factoryTest;
- m.mMainStack = new ActivityStack(m, context, true);
- m.mBatteryStatsService.publish(context);
- m.mUsageStatsService.publish(context);
- synchronized (thr) {
- thr.mReady = true;
- thr.notifyAll();
- }
- m.startRunning(null, null, null, null); //初始化变量
- return context;
- }