Android系统在启动的过程中,会启动一个应用程序管理服务PackageManagerService,这个服务负责扫描系统中特定的目录,找到里面的应用程序文件,即以Apk为后缀的文件,然后对这些文件进解析,得到应用程序的相关信息,完成应用程序的安装过程,本文将详细分析这个过程。

应用程序管理服务PackageManagerService安装应用程序的过程,其实就是解析析应用程序配置文件AndroidManifest.xml的过程,并从里面得到得到应用程序的相关信息,例如得到应用程序的组件Activity、Service、Broadcast Receiver和Content Provider等信息,有了这些信息后,通过ActivityManagerService这个服务,我们就可以在系统中正常地使用这些应用程序了。

应用程序管理服务PackageManagerService是系统启动的时候由SystemServer组件启动的,启后它就会执行应用程序安装的过程,因此,本文将从SystemServer启动PackageManagerService服务的过程开始分析系统中的应用程序安装的过程。

应用程序管理服务PackageManagerService从启动到安装应用程序的过程如下图所示:

下面我们具体分析每一个步骤。

Step 1. SystemServer.main

这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:

[java] view plaincopy
  1. public class SystemServer
  2. {
  3. ......
  4. native public static void init1(String[] args);
  5. ......
  6. public static void main(String[] args) {
  7. ......
  8. init1(args);
  9. ......
  10. }
  11. ......
  12. }

SystemServer组件是由Zygote进程负责启动的,启动的时候就会调用它的main函数,这个函数主要调用了JNI方法init1来做一些系统初始化的工作。

Step 2. SystemServer.init1

这个函数是一个JNI方法,实现在 frameworks/base/services/jni/com_android_server_SystemServer.cpp文件中:

[cpp] view plaincopy
  1. namespace android {
  2. extern "C" int system_init();
  3. static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
  4. {
  5. system_init();
  6. }
  7. /*
  8. * JNI registration.
  9. */
  10. static JNINativeMethod gMethods[] = {
  11. /* name, signature, funcPtr */
  12. { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },
  13. };
  14. int register_android_server_SystemServer(JNIEnv* env)
  15. {
  16. return jniRegisterNativeMethods(env, "com/android/server/SystemServer",
  17. gMethods, NELEM(gMethods));
  18. }
  19. }; // namespace android

这个函数很简单,只是调用了system_init函数来进一步执行操作。

Step 3. libsystem_server.system_init

函数system_init实现在libsystem_server库中,源代码位于frameworks/base/cmds/system_server/library/system_init.cpp文件中:

[cpp] view plaincopy
  1. extern "C" status_t system_init()
  2. {
  3. LOGI("Entered system_init()");
  4. sp<ProcessState> proc(ProcessState::self());
  5. sp<IServiceManager> sm = defaultServiceManager();
  6. LOGI("ServiceManager: %p\n", sm.get());
  7. sp<GrimReaper> grim = new GrimReaper();
  8. sm->asBinder()->linkToDeath(grim, grim.get(), 0);
  9. char propBuf[PROPERTY_VALUE_MAX];
  10. property_get("system_init.startsurfaceflinger", propBuf, "1");
  11. if (strcmp(propBuf, "1") == 0) {
  12. // Start the SurfaceFlinger
  13. SurfaceFlinger::instantiate();
  14. }
  15. // Start the sensor service
  16. SensorService::instantiate();
  17. // On the simulator, audioflinger et al don't get started the
  18. // same way as on the device, and we need to start them here
  19. if (!proc->supportsProcesses()) {
  20. // Start the AudioFlinger
  21. AudioFlinger::instantiate();
  22. // Start the media playback service
  23. MediaPlayerService::instantiate();
  24. // Start the camera service
  25. CameraService::instantiate();
  26. // Start the audio policy service
  27. AudioPolicyService::instantiate();
  28. }
  29. // And now start the Android runtime.  We have to do this bit
  30. // of nastiness because the Android runtime initialization requires
  31. // some of the core system services to already be started.
  32. // All other servers should just start the Android runtime at
  33. // the beginning of their processes's main(), before calling
  34. // the init function.
  35. LOGI("System server: starting Android runtime.\n");
  36. AndroidRuntime* runtime = AndroidRuntime::getRuntime();
  37. LOGI("System server: starting Android services.\n");
  38. runtime->callStatic("com/android/server/SystemServer", "init2");
  39. // If running in our own process, just go into the thread
  40. // pool.  Otherwise, call the initialization finished
  41. // func to let this process continue its initilization.
  42. if (proc->supportsProcesses()) {
  43. LOGI("System server: entering thread pool.\n");
  44. ProcessState::self()->startThreadPool();
  45. IPCThreadState::self()->joinThreadPool();
  46. LOGI("System server: exiting thread pool.\n");
  47. }
  48. return NO_ERROR;
  49. }

这个函数首先会初始化SurfaceFlinger、SensorService、AudioFlinger、MediaPlayerService、CameraService和AudioPolicyService这几个服务,然后就通过系统全局唯一的AndroidRuntime实例变量runtime的callStatic来调用SystemServer的init2函数了。关于这个AndroidRuntime实例变量runtime的相关资料,可能参考前面一篇文章Android应用程序进程启动过程的源代码分析一文。      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函数了。

转载于:https://blog.51cto.com/shyluo/966518

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 支付宝支付 第二集:傻瓜式教程->获取支付的RSA公钥和私钥
  2. Hive 基础-进阶
  3. 科学计算库Numpy——随机模块
  4. 第二十二章:动画(十四)
  5. Away3D 的实体收集器Bug
  6. php安装pcntl扩展
  7. 这35个Java代码优化细节,你用了吗?
  8. 1002 写出这个数 (20分)
  9. struts内的action方法自动提交
  10. 724. 寻找数组的中心索引
  11. 【小知识点】分类机器学习中,某一标签占比太大(标签稀疏),如何学习?...
  12. python绘制函数图像
  13. 27岁没文凭自学编程成为程序员难不难
  14. 从word中无损批量导出图片
  15. hdu 2087 剪花布条 kmp小水
  16. antv图例出现分页_AntV - G2
  17. python亲和数_亲和数(示例代码)
  18. 【HTTP Live Streaming】(一)苹果公司 - 流媒体传输技术 - 概览
  19. 英语发音规则---Q字母
  20. FileOutputStream文件写入类

热门文章

  1. 补充知识:三元运算和逻辑运算
  2. numix Docky
  3. 循环查询sql带逗号(,)分隔的数据 以及一对多数据转化为逗号(,)分割数据...
  4. 云计算之路-阿里云上:一场暴风雨的袭击
  5. python排序函数set_【Python】排列组合itertools 集合set
  6. 应用化学C4H12Si类四甲基硅结构的神经网络
  7. 3.2 目标点检测-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  8. 第三章 线性代数回顾-机器学习老师板书-斯坦福吴恩达教授
  9. 3.6 BatchNorm 为什么起作用-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  10. 【Android工具】好软件推荐,安卓手机免费好用的SSH客户端——JuiceSSH