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

简介:

    Step 12. PackageManagerService.scanPackageLI

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

[java]  view plain copy
  1. class PackageManagerService extends IPackageManager.Stub {  
  2.     ......  
  3.   
  4.     // Keys are String (package name), values are Package.  This also serves  
  5.     // as the lock for the global state.  Methods that must be called with  
  6.     // this lock held have the prefix "LP".  
  7.     final HashMap<String, PackageParser.Package> mPackages =  
  8.         new HashMap<String, PackageParser.Package>();  
  9.   
  10.     ......  
  11.   
  12.     // All available activities, for your resolving pleasure.  
  13.     final ActivityIntentResolver mActivities =  
  14.     new ActivityIntentResolver();  
  15.   
  16.     // All available receivers, for your resolving pleasure.  
  17.     final ActivityIntentResolver mReceivers =  
  18.         new ActivityIntentResolver();  
  19.   
  20.     // All available services, for your resolving pleasure.  
  21.     final ServiceIntentResolver mServices = new ServiceIntentResolver();  
  22.   
  23.     // Keys are String (provider class name), values are Provider.  
  24.     final HashMap<ComponentName, PackageParser.Provider> mProvidersByComponent =  
  25.         new HashMap<ComponentName, PackageParser.Provider>();  
  26.   
  27.     ......  
  28.   
  29.     private PackageParser.Package scanPackageLI(PackageParser.Package pkg,  
  30.             int parseFlags, int scanMode, long currentTime) {  
  31.         ......  
  32.   
  33.         synchronized (mPackages) {  
  34.             ......  
  35.   
  36.             // Add the new setting to mPackages  
  37.             mPackages.put(pkg.applicationInfo.packageName, pkg);  
  38.   
  39.             ......  
  40.   
  41.             int N = pkg.providers.size();  
  42.             int i;  
  43.             for (i=0; i<N; i++) {  
  44.                 PackageParser.Provider p = pkg.providers.get(i);  
  45.                 p.info.processName = fixProcessName(pkg.applicationInfo.processName,  
  46.                     p.info.processName, pkg.applicationInfo.uid);  
  47.                 mProvidersByComponent.put(new ComponentName(p.info.packageName,  
  48.                     p.info.name), p);  
  49.   
  50.                 ......  
  51.             }  
  52.   
  53.             N = pkg.services.size();  
  54.             for (i=0; i<N; i++) {  
  55.                 PackageParser.Service s = pkg.services.get(i);  
  56.                 s.info.processName = fixProcessName(pkg.applicationInfo.processName,  
  57.                     s.info.processName, pkg.applicationInfo.uid);  
  58.                 mServices.addService(s);  
  59.   
  60.                 ......  
  61.             }  
  62.   
  63.             N = pkg.receivers.size();  
  64.             r = null;  
  65.             for (i=0; i<N; i++) {  
  66.                 PackageParser.Activity a = pkg.receivers.get(i);  
  67.                 a.info.processName = fixProcessName(pkg.applicationInfo.processName,  
  68.                     a.info.processName, pkg.applicationInfo.uid);  
  69.                 mReceivers.addActivity(a, "receiver");  
  70.                   
  71.                 ......  
  72.             }  
  73.   
  74.             N = pkg.activities.size();  
  75.             for (i=0; i<N; i++) {  
  76.                 PackageParser.Activity a = pkg.activities.get(i);  
  77.                 a.info.processName = fixProcessName(pkg.applicationInfo.processName,  
  78.                     a.info.processName, pkg.applicationInfo.uid);  
  79.                 mActivities.addActivity(a, "activity");  
  80.                   
  81.                 ......  
  82.             }  
  83.   
  84.             ......  
  85.         }  
  86.   
  87.         ......  
  88.   
  89.         return pkg;  
  90.     }  
  91.   
  92.     ......  
  93. }  

        这个函数主要就是把前面解析应用程序得到的package、provider、service、receiver和activity等信息保存在PackageManagerService服务中了。

        这样,在Android系统启动的时候安装应用程序的过程就介绍完了,但是,这些应用程序只是相当于在PackageManagerService服务注册好了,如果我们想要在Android桌面上看到这些应用程序,还需要有一个Home应用程序,负责从PackageManagerService服务中把这些安装好的应用程序取出来,并以友好的方式在桌面上展现出来,例如以快捷图标的形式。在Android系统中,负责把系统中已经安装的应用程序在桌面中展现出来的Home应用程序就是Launcher了,在下一篇文章中,我们将介绍Launcher是如何启动的以及它是如何从PackageManagerService服务中把系统中已经安装好的应用程序展现出来的,敬请期待。





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

目录
相关文章
|
24天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
3月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
51 2
|
2月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
60 15
Android 系统缓存扫描与清理方法分析
|
2月前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
54 5
|
2月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
3月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
143 3
|
2月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
3月前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
3月前
|
存储 XML API
安卓应用程序开发:从新手到专家的旅程
【8月更文挑战第33天】在这篇文章中,我们将一起踏上一段激动人心的旅程,探索如何从一个对安卓应用程序开发一无所知的新手,成长为一个能够独立开发复杂应用程序的专家。我们将通过实际案例和代码示例,深入理解安卓开发的各个方面,包括用户界面设计、数据存储、网络通信等。无论你是刚刚入门,还是已经有一些基础,这篇文章都将为你提供宝贵的知识和技能,帮助你在安卓开发的道路上更进一步。
|
3月前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析
本文将探讨安卓和iOS这两大移动操作系统在开发环境上的差异,从工具、语言、框架到生态系统等多个角度进行比较。我们将深入了解各自的优势和劣势,并尝试为开发者提供一些实用的建议,以帮助他们根据自己的需求选择最适合的开发平台。
51 1