android 啟動的流程
Linux
BootLoader 作用-> 加載驅動 啟動硬體 加載linux核心
系統的第一個程序 init 程序 對應的啟動的代碼 init.c
system/core/init/init.c
main方法
建立重要的系統目錄 并且加載進來
mkdir("/dev", 0755);
mkdir("/proc", 0755);
mkdir("/sys", 0755);
mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");
mkdir("/dev/pts", 0755);
mkdir("/dev/socket", 0755);
mount("devpts", "/dev/pts", "devpts", 0, NULL);
mount("proc", "/proc", "proc", 0, NULL);
mount("sysfs", "/sys", "sysfs", 0, NULL);
init_parse_config_file("/init.rc"); //解析init.rc配置檔案 這個配置檔案中都是linux指令 解析這些指令并且執行
system/core/rootdir/init.rc
跟啟動相關 比較重要的部分
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
以服務的形式啟動 zygote程序
zygote程序 是android中十分重要的程序 孵化器程序(受精卵) 所有的android應用程序以及重要的系統程序都是有這個zygote程序 通過fork
以複制自身的形式建立的
1.service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
2.service zygote 以服務的形式啟動zygote
3./system/bin/app_process 啟動的時候對應的檔案路徑
--zygote --start-system-server啟動是傳入的參數
App_main.cpp
main方法
......
const char* className = NULL;
while (i < argc) {
const char* arg = argv[i++];
if (!parentDir) {
parentDir = arg;
} else if (strcmp(arg, "--zygote") == 0) {//周遊傳入的字元串數組 --zygote --start-system-server
zygote = true;
niceName = "zygote"; //這裡會被執行
} 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 = arg + 12;
} else {
className = arg;
break;
}
}
if (niceName && *niceName) {
setArgv0(argv0, niceName);
set_process_name(niceName); //給目前程序起名字為zygote
}
runtime.mParentDir = parentDir;
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit",
startSystemServer ? "start-system-server" : ""); //調用runtime.start方法(ZygoteInit start-system-server)
}
....
runtime.start("com.android.internal.os.ZygoteInit", "start-system-server" );
runtime.start ①給目前的程序建立了一個java虛拟機 ②通過jni的調用 啟動了ZygoteInit.java的main方法 啟動了第一個java程式
void AndroidRuntime::start(const char* className, const char* options)
{
ALOGD("\n>>>>>> AndroidRuntime START %s <<<<<<\n",
className != NULL ? className : "(unknown)");
blockSigpipe();
if (strcmp(options, "start-system-server") == 0) {
const int LOG_BOOT_PROGRESS_START = 3000;
LOG_EVENT_LONG(LOG_BOOT_PROGRESS_START,
ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
}
const char* rootDir = getenv("ANDROID_ROOT");
if (rootDir == NULL) {
rootDir = "/system";
if (!hasDir("/system")) {
LOG_FATAL("No root directory specified, and /android does not exist.");
return;
}
setenv("ANDROID_ROOT", rootDir, 1);
}
//const char* kernelHack = getenv("LD_ASSUME_KERNEL");
//ALOGD("Found LD_ASSUME_KERNEL='%s'\n", kernelHack);
JNIEnv* env; //啟動java虛拟機
if (startVm(&mJavaVM, &env) != 0) {
return;
}
onVmCreated(env);
if (startReg(env) < 0) {
ALOGE("Unable to register all android natives\n");
return;
}
jclass stringClass;
jobjectArray strArray;
jstring classNameStr;
jstring optionsStr;
stringClass = env->FindClass("java/lang/String"); 通過jni調用 建立了一個java的String[] = {"com.android.internal.os.ZygoteInit", "start-system-server"}
assert(stringClass != NULL);
strArray = env->NewObjectArray(2, stringClass, NULL);
assert(strArray != NULL);
classNameStr = env->NewStringUTF(className);
assert(classNameStr != NULL);
env->SetObjectArrayElement(strArray, 0, classNameStr);
optionsStr = env->NewStringUTF(options);
env->SetObjectArrayElement(strArray, 1, optionsStr);
char* slashClassName = toSlashClassName(className); //通過Jni調用 找到zygoteInit.java的位元組碼 找到main方法 執行
jclass startClass = env->FindClass(slashClassName);
if (startClass == NULL) {
ALOGE("JavaVM unable to locate class '%s'\n", slashClassName);
} else {
jmethodID startMeth = env->GetStaticMethodID(startClass, "main", //執行main方法的時候 把剛建立的String[]作為參數穿進去
"([Ljava/lang/String;)V");
if (startMeth == NULL) {
ALOGE("JavaVM unable to find main() in '%s'\n", className);
} else {
env->CallStaticVoidMethod(startClass, startMeth, strArray);
#if 0
if (env->ExceptionCheck())
threadExitUncaughtException(env);
#endif
}
}
free(slashClassName);
ALOGD("Shutting down VM\n");
if (mJavaVM->DetachCurrentThread() != JNI_OK)
ALOGW("Warning: unable to detach main thread\n");
if (mJavaVM->DestroyJavaVM() != 0)
ALOGW("Warning: VM did not shut down cleanly\n");
}
到這兒 從native世界 來到了java的程式中
zygoteInit main方法
public static void main(String argv[]) {
try {
// Start profiling the zygote initialization.
SamplingProfilerIntegration.start();
registerZygoteSocket(); //建立一個socket服務端
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
SystemClock.uptimeMillis());
preload(); //預加載資源 包括 兩千多個位元組碼對象 用到的系統圖檔 顔色資源
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
SystemClock.uptimeMillis());
// Finish profiling the zygote initialization.
SamplingProfilerIntegration.writeZygoteSnapshot();
// Do an initial gc to clean up after startup
gc();
// If requested, start system server directly from Zygote
if (argv.length != 2) {
throw new RuntimeException(argv[0] + USAGE_STRING);
}
if (argv[1].equals("start-system-server")) {
startSystemServer(); //開啟SystemServer 系統服務
} else if (!argv[1].equals("")) {
throw new RuntimeException(argv[0] + USAGE_STRING);
}
Log.i(TAG, "Accepting command socket connections");
if (ZYGOTE_FORK_MODE) {
runForkMode();
} else {
runSelectLoopMode(); //開啟死循環 等待socket用戶端通路
}
closeServerSocket();
} catch (MethodAndArgsCaller caller) {
caller.run();
} catch (RuntimeException ex) {
Log.e(TAG, "Zygote died with exception", ex);
closeServerSocket();
throw ex;
}
}
zygote啟動到這兒就結束了
zygote在啟動的過程中 做了如下幾件事兒
① zygote程序建立了一個jvm
② zygote建立了一個socket服務端 等待ams給它發消息 分叉新的程序
③ 預加載了資源包括 位元組碼 圖檔 顔色
④ 跑起死循環 等待用戶端連接配接
⑤ 建立了SystemServer程序
SystemServer啟動的過程
private static boolean startSystemServer()
throws MethodAndArgsCaller, RuntimeException {
String args[] = {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003,3006,3007",
"--capabilities=130104352,130104352",
"--runtime-init",
"--nice-name=system_server",
"com.android.server.SystemServer",
};
ZygoteConnection.Arguments parsedArgs = null;
int pid;
try {
parsedArgs = new ZygoteConnection.Arguments(args); //zygote程序 分叉出systemserver程序
ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids,
parsedArgs.debugFlags,
null,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
} catch (IllegalArgumentException ex) {
throw new RuntimeException(ex);
}
if (pid == 0) {
handleSystemServerProcess(parsedArgs); //pid為0說明目前的代碼執行在子程序中 這個程序就是system_server程序
}
return true;
}
hanldeSystemServerProess->RuntimeInit.zygoteInit->applicationInit->invokestaticMain()->調用了SystemServer.java的main方法
systemServer的main方法 通過jni調用到 systemserver.cpp的init1方法
init1方法 調用了system_init() 在這個方法中 把 顯示的驅動和傳感器的驅動啟動起來
隻有這些驅動加載進來了 在java層才能啟動相應的服務
通過jni system_init() 方法又調用到systemServer.java的 init2方法
public static final void init2() {
Slog.i(TAG, "Entered the Android system server!");
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start(); //執行serverThread的run方法
}
在run方法中 建立了系統服務對象 通過ServiceManager儲存起來
.....//聲明各種服務
Installer installer = null;
AccountManagerService accountManager = null;
ContentService contentService = null;
LightsService lights = null;
PowerManagerService power = null;
DisplayManagerService display = null;
BatteryService battery = null;
VibratorService vibrator = null;
AlarmManagerService alarm = null;
MountService mountService = null;
NetworkManagementService networkManagement = null;
NetworkStatsService networkStats = null;
NetworkPolicyManagerService networkPolicy = null;
ConnectivityService connectivity = null;
WifiP2pService wifiP2p = null;
WifiService wifi = null;
NsdService serviceDiscovery= null;
//建立服務 通過ServiceManager管理 以key-value的形式添加到ServiceManger中
//是以 getSystemService(傳入一個字元串) 傳回服務
Slog.i(TAG, "Power Manager");
power = new PowerManagerService();
ServiceManager.addService(Context.POWER_SERVICE, power);
Slog.i(TAG, "Activity Manager");
context = ActivityManagerService.main(factoryTest);
Slog.i(TAG, "Display Manager");
display = new DisplayManagerService(context, wmHandler, uiHandler);
ServiceManager.addService(Context.DISPLAY_SERVICE, display, true);
Slog.i(TAG, "Telephony Registry");
telephonyRegistry = new TelephonyRegistry(context);
ServiceManager.addService("telephony.registry", telephonyRegistry);
Slog.i(TAG, "Scheduling Policy");
ServiceManager.addService(Context.SCHEDULING_POLICY_SERVICE,
new SchedulingPolicyService());
當所有的服務都添加進去之後 會執行ActivityManagerService的systemready方法
mMainStack.resumeTopActivityLocked(null);//判斷目前的主任務棧是否有activity 如果沒有就啟動桌面
final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {
// Find the first activity that is not finishing.
ActivityRecord next = topRunningActivityLocked(null);
// Remember how we'll process this pause/resume situation, and ensure
// that the state is reset however we wind up proceeding.
final boolean userLeaving = mUserLeaving;
mUserLeaving = false;
if (next == null) {
// There are no more activities! Let's just start up the
// Launcher...
if (mMainStack) {
ActivityOptions.abort(options);
return mService.startHomeActivityLocked(mCurrentUser);
}
}