Step 4. AndroidRuntime.callStatic
 这个函数定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中:
[cpp] view plaincopy
  1. /*
  2. * Call a static Java Programming Language function that takes no arguments and returns void.
  3. */  
  4. status_t AndroidRuntime::callStatic(const char* className, const char* methodName)  
  5. {
  6. JNIEnv* env;
  7. jclass clazz;
  8. jmethodID methodId;
  9. env = getJNIEnv();
  10.     if (env == NULL)  
  11.         return UNKNOWN_ERROR;  
  12. clazz = findClass(env, className);
  13.     if (clazz == NULL) {  
  14.         LOGE("ERROR: could not find class '%s'\n", className);  
  15.         return UNKNOWN_ERROR;  
  16. }
  17.     methodId = env->GetStaticMethodID(clazz, methodName, "()V");  
  18.     if (methodId == NULL) {  
  19.         LOGE("ERROR: could not find method %s.%s\n", className, methodName);  
  20.         return UNKNOWN_ERROR;  
  21. }
  22. env->CallStaticVoidMethod(clazz, methodId);
  23.     return NO_ERROR;  
  24. }
        这个函数调用由参数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文件中:
[java] view plaincopy
  1. public class SystemServer  
  2. {
  3. ......
  4.     public static final void init2() {  
  5.         Slog.i(TAG, "Entered the Android system server!");  
  6.         Thread thr = new ServerThread();  
  7.         thr.setName("android.server.ServerThread");  
  8. thr.start();
  9. }
  10. }
        这个函数创建了一个ServerThread线程,PackageManagerService服务就是这个线程中启动的了。这里调用了ServerThread实例thr的start函数之后,下面就会执行这个实例的run函数了。
Step 6. ServerThread.run
    这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:
[java] view plaincopy
  1. class ServerThread extends Thread {  
  2. ......
  3.     @Override  
  4.     public void run() {  
  5. ......
  6.         IPackageManager pm = null;  
  7. ......
  8.         // Critical services...  
  9.         try {  
  10. ......
  11.             Slog.i(TAG, "Package Manager");  
  12. pm = PackageManagerService.main(context,
  13. factoryTest != SystemServer.FACTORY_TEST_OFF);
  14. ......
  15.         } catch (RuntimeException e) {  
  16.             Slog.e("System", "Failure starting core service", e);  
  17. }
  18. ......
  19. }
  20. ......
  21. }
        这个函数除了启动PackageManagerService服务之外,还启动了其它很多的服务,例如在前面学习Activity和Service的几篇文章中经常看到的ActivityManagerService服务,有兴趣的读者可以自己研究一下。

Android应用程序安装过程源代码分析(2)相关推荐

  1. Android应用程序安装过程源代码分析(1)

    Android系统在启动的过程中,会启动一个应用程序管理服务PackageManagerService,这个服务负责扫描系统中特定的目录,找到里面的应用程序文件,即以Apk为后缀的文件,然后对这些文件 ...

  2. Android应用程序启动过程源代码分析(5)

    Step 35. MainActivity.onCreate 这个函数定义在packages/experimental/Activity/src/shy/luo/activity/MainActivi ...

  3. Android 系统 (79)---Android应用程序安装过程解析

    Android应用程序安装过程解析 Android应用程序安装过程解析 1.程序安装的4大步骤 (1) 拷贝apk文件到指定目录 在Android系统中,apk安装文件是会被保存起来的,默认情况下,用 ...

  4. Android应用程序安装过程解析(源码解析)

    Android应用程序安装过程解析 1.程序安装的4大步骤 (1) 拷贝apk文件到指定目录 在Android系统中,apk安装文件是会被保存起来的,默认情况下,用户安装的apk首先会被拷贝到 /da ...

  5. Android应用程序安装过程浅析

    我们知道在android中.安装应用是由PackageManager来管理的,可是我们发现PackageManager是一个抽象类.他的installPackage方法也没有详细的实现. 那在安装过程 ...

  6. android 应用安装过程,Android应用程序安装过程浅析(3)

    本文来自网易云社区 作者:孙有军 这里post一个Runnable来执行内部的逻辑,主要做了如下操作:        1,锁定后安装包,通过调用installPackageLI来进行的         ...

  7. Android系统默认Home应用程序(Launcher)的启动过程源代码分析

    在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应 ...

  8. Android应用程序组件Content Provider的启动过程源代码分析(1)

             通过前面的学习,我们知道在Android系统中,Content Provider可以为不同的应用程序访问相同的数据提供统一的入口.Content Provider一般是运行在独立的进 ...

  9. Android系统默认Home应用程序 Launcher 的启动过程源代码分析

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在前面一 ...

  10. Android系统默认Home应用程序(Launcher)的启动过程源代码分析(3)

    Step 13.  ActivityStack.startActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/ ...

最新文章

  1. Heroku创始人Adam Wiggins发布十二要素应用宣言
  2. LumaQQ.NET操作指令制作(3)
  3. 如何用python生成表格_用 Python 生成 HTML 表格
  4. VoIP协议标准浅析
  5. [蓝桥杯2016决赛]反幻方-next_permutation枚举
  6. sql的外键约束和主键约束_SQL约束
  7. Swift--控制流与oc不同的地方
  8. 《R的极客理想—工具篇》—— 第2章 时间序列基础包
  9. java判断斐波那契数列_Java 实例 - 斐波那契数列
  10. SpringMVC上传文件遇到的问题
  11. exists子查询 mysql
  12. 07 熟练使用Console类实现从控制台输入输出数据 1214
  13. 剑指offer 面试63题
  14. vs2015安装msdn_visual studio 2015离线版msdn下载和安装
  15. clover删除多余引导_[转载]EFI引导如何去掉多余的这个clover启动项
  16. Realtek RTL87xx 学习资源
  17. 高性能服务器天梯,2019服务器CPU天梯图 多路CPU性能排名
  18. Python周刊518期
  19. 为什么红黑树查询快_面试被问“红黑树”,我一脸懵逼…
  20. uni-app 杂记

热门文章

  1. 关于macos新功能——控制中心的一些事
  2. Final Cut Pro X for Mac有哪些新功能?Final Cut Pro X Mac版怎么样?
  3. Simbad的使用--检索、导入、保存
  4. k8s学习: 创建 mysql 任务
  5. bug宝典linux篇 LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory(转)
  6. Chromium引擎控件DotNetBrowser V1.14发布 | 附下载
  7. 几种div/css布局的代码
  8. URAL K-based Numbers(1-3)
  9. 微信js-sdk集成小结
  10. linux junit