Step 12. PackageManagerService.scanPackageLI

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

  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服务中把系统中已经安装好的应用程序展现出来的,敬请期待。