Step 4. AndroidRuntime.callStatic
这个函数定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中:
这个函数定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中:
- /*
- * Call a static Java Programming Language function that takes no arguments and returns void.
-
*/
-
status_t AndroidRuntime::callStatic(const char* className, const char* methodName)
- {
- JNIEnv* env;
- jclass clazz;
- jmethodID methodId;
- env = getJNIEnv();
-
if (env == NULL)
-
return UNKNOWN_ERROR;
- clazz = findClass(env, className);
-
if (clazz == NULL) {
-
LOGE("ERROR: could not find class '%s'\n", className);
-
return UNKNOWN_ERROR;
- }
-
methodId = env->GetStaticMethodID(clazz, methodName, "()V");
-
if (methodId == NULL) {
-
LOGE("ERROR: could not find method %s.%s\n", className, methodName);
-
return UNKNOWN_ERROR;
- }
- env->CallStaticVoidMethod(clazz, methodId);
-
return NO_ERROR;
- }
这个函数调用由参数className指定的java类的静态成员函数,这个静态成员函数是由参数methodName指定的。上面传进来的参数className的值为"com/android/server/SystemServer",而参数methodName的值为"init2",因此,接下来就会调用SystemServer类的init2函数了。
Step 5. SystemServer.init2
这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:
这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:
-
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();
- }
- }
这个函数创建了一个ServerThread线程,PackageManagerService服务就是这个线程中启动的了。这里调用了ServerThread实例thr的start函数之后,下面就会执行这个实例的run函数了。
Step 6. ServerThread.run
这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:
这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:
-
class ServerThread extends Thread {
- ......
-
@Override
-
public void run() {
- ......
-
IPackageManager pm = null;
- ......
-
// Critical services...
-
try {
- ......
-
Slog.i(TAG, "Package Manager");
- pm = PackageManagerService.main(context,
- factoryTest != SystemServer.FACTORY_TEST_OFF);
- ......
-
} catch (RuntimeException e) {
-
Slog.e("System", "Failure starting core service", e);
- }
- ......
- }
- ......
- }
这个函数除了启动PackageManagerService服务之外,还启动了其它很多的服务,例如在前面学习Activity和Service的几篇文章中经常看到的ActivityManagerService服务,有兴趣的读者可以自己研究一下。
本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966521,如需转载请自行联系原作者