当前位置: 首页 > news >正文

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

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




本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966521,如需转载请自行联系原作者

相关文章:

  • 知行不合一,Elon Musk 最大的敌人居然是自己?
  • 第二章 vSphere可用性之准备软硬件环境
  • 谈谈观察者模式和发布订阅模式
  • 策略模式
  • spark本地环境的搭建到运行第一个spark程序
  • VC6不支持typedef中递归。终于找到了Tuple的实现方案。
  • 设计模式-工厂模式
  • RHCS Oracle HA for OEL5.8 KVM实践配置
  • 面试必问之【对象和函数】篇
  • Hyper-v Server在线调整虚拟硬盘大小
  • Redis配置解读
  • JSP、Java、JavaScript与JScript总结
  • dict(字典)
  • Android Handler机制理解
  • 前端面试忽悠师入门,教你如何从容面试。
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 2019.2.20 c++ 知识梳理
  • 230. Kth Smallest Element in a BST
  • JavaScript 基础知识 - 入门篇(一)
  • JavaScript异步流程控制的前世今生
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • nfs客户端进程变D,延伸linux的lock
  • rc-form之最单纯情况
  • Solarized Scheme
  • Spring Boot快速入门(一):Hello Spring Boot
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 安卓应用性能调试和优化经验分享
  • 从零开始的无人驾驶 1
  • 服务器之间,相同帐号,实现免密钥登录
  • 区块链分支循环
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​VRRP 虚拟路由冗余协议(华为)
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (1)虚拟机的安装与使用,linux系统安装
  • (31)对象的克隆
  • (5)STL算法之复制
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计大学生兼职系统
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (一) storm的集群安装与配置
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)为什么要选择C++
  • (译) 函数式 JS #1:简介
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net6 webapi log4net完整配置使用流程
  • ::什么意思
  • :O)修改linux硬件时间
  • ??myeclipse+tomcat