1.非zygote模式的RuntimeInit
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
221 public static final void main(String[] argv) { 222 if (argv.length == 2 && argv[1].equals("application")) { 223 if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting application"); 224 redirectLogStreams(); 225 } else { 226 if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting tool"); 227 }//这里看到android进程zygote、systemserver、application、tool 228 229 commonInit(); 230 231 /* 232 * Now that we're running in interpreted code, call back into native code 233 * to run the system. 234 */ 235 nativeFinishInit(); 236 237 if (DEBUG) Slog.d(TAG, "Leaving RuntimeInit!"); 238 }
2.commonInit是初始化,看下nativefinfishInit,调用到native层
frameworks/base/core/jni/AndroidRuntime.cpp
188static void com_android_internal_os_RuntimeInit_nativeFinishInit(JNIEnv* env, jobject clazz) 189{ 190 gCurRuntime->onStarted(); 191}
3.frameworks/base/cmds/app_process/app_main.cpp
virtual void onStarted() 83 { 84 sp<ProcessState> proc = ProcessState::self(); 85 ALOGV("App process: starting thread pool.\n"); 86 proc->startThreadPool(); 87 88 AndroidRuntime* ar = AndroidRuntime::getRuntime(); 89 ar->callMain(mClassName, mClass, mArgC, mArgV); 90 91 IPCThreadState::self()->stopProcess(); 92 }
4.主要就是执行class的main命令
status_t AndroidRuntime::callMain(const char* className, 264 jclass clazz, int argc, const char* const argv[]) 265{ 266 JNIEnv* env; 267 jmethodID methodId; 268 269 ALOGD("Calling main entry %s", className); 270 271 env = getJNIEnv(); 272 if (clazz == NULL || env == NULL) { 273 return UNKNOWN_ERROR; 274 } 275 276 methodId = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");//调用main 277 if (methodId == NULL) { 278 ALOGE("ERROR: could not find method %s.main(String[])\n", className); 279 return UNKNOWN_ERROR; 280 } 281 282 /* 283 * We want to call main() with a String array with our arguments in it. 284 * Create an array and populate it. 285 */ 286 jclass stringClass; 287 jobjectArray strArray; 288 289 stringClass = env->FindClass("java/lang/String"); 290 strArray = env->NewObjectArray(argc, stringClass, NULL); 291 292 for (int i = 0; i < argc; i++) { 293 jstring argStr = env->NewStringUTF(argv[i]); 294 env->SetObjectArrayElement(strArray, i, argStr); 295 } 296 297 env->CallStaticVoidMethod(clazz, methodId, strArray); 298 return NO_ERROR; 299}