Step 12.PackageManagerService.scanPackageLI

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

[java] view plain copy
  1. classPackageManagerServiceextendsIPackageManager.Stub{
  2. ......
  3. //KeysareString(packagename),valuesarePackage.Thisalsoserves
  4. //asthelockfortheglobalstate.Methodsthatmustbecalledwith
  5. //thislockheldhavetheprefix"LP".
  6. finalHashMap<String,PackageParser.Package>mPackages=
  7. newHashMap<String,PackageParser.Package>();
  8. ......
  9. //Allavailableactivities,foryourresolvingpleasure.
  10. finalActivityIntentResolvermActivities=
  11. newActivityIntentResolver();
  12. //Allavailablereceivers,foryourresolvingpleasure.
  13. finalActivityIntentResolvermReceivers=
  14. newActivityIntentResolver();
  15. //Allavailableservices,foryourresolvingpleasure.
  16. finalServiceIntentResolvermServices=newServiceIntentResolver();
  17. //KeysareString(providerclassname),valuesareProvider.
  18. finalHashMap<ComponentName,PackageParser.Provider>mProvidersByComponent=
  19. newHashMap<ComponentName,PackageParser.Provider>();
  20. ......
  21. privatePackageParser.PackagescanPackageLI(PackageParser.Packagepkg,
  22. intparseFlags,intscanMode,longcurrentTime){
  23. ......
  24. synchronized(mPackages){
  25. ......
  26. //AddthenewsettingtomPackages
  27. mPackages.put(pkg.applicationInfo.packageName,pkg);
  28. ......
  29. intN=pkg.providers.size();
  30. inti;
  31. for(i=0;i<N;i++){
  32. PackageParser.Providerp=pkg.providers.get(i);
  33. p.info.processName=fixProcessName(pkg.applicationInfo.processName,
  34. p.info.processName,pkg.applicationInfo.uid);
  35. mProvidersByComponent.put(newComponentName(p.info.packageName,
  36. p.info.name),p);
  37. ......
  38. }
  39. N=pkg.services.size();
  40. for(i=0;i<N;i++){
  41. PackageParser.Services=pkg.services.get(i);
  42. s.info.processName=fixProcessName(pkg.applicationInfo.processName,
  43. s.info.processName,pkg.applicationInfo.uid);
  44. mServices.addService(s);
  45. ......
  46. }
  47. N=pkg.receivers.size();
  48. r=null;
  49. for(i=0;i<N;i++){
  50. PackageParser.Activitya=pkg.receivers.get(i);
  51. a.info.processName=fixProcessName(pkg.applicationInfo.processName,
  52. a.info.processName,pkg.applicationInfo.uid);
  53. mReceivers.addActivity(a,"receiver");
  54. ......
  55. }
  56. N=pkg.activities.size();
  57. for(i=0;i<N;i++){
  58. PackageParser.Activitya=pkg.activities.get(i);
  59. a.info.processName=fixProcessName(pkg.applicationInfo.processName,
  60. a.info.processName,pkg.applicationInfo.uid);
  61. mActivities.addActivity(a,"activity");
  62. ......
  63. }
  64. ......
  65. }
  66. ......
  67. returnpkg;
  68. }
  69. ......
  70. }

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

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

更多相关文章

  1. C语言函数以及函数的使用
  2. Android 调用系统浏览器 出现activitynotfoundexception 解决办
  3. Android为每个应用程序分配的内存大小是多
  4. 一对一直播系统开发Android ProgressBar圆形进度条颜色设置
  5. Android实现自己的回调函数
  6. Android编译系统(三):官方文档Android Build System
  7. 系统屋索引
  8. SystemUI9.0系统应用图标加载流程
  9. android 判断系统是否有Navigation Bar

随机推荐

  1. 系统自带的主题与样式(theme and style)
  2. Android常见inputType
  3. Android(安卓)Bitmap最全基本操作:与Drawa
  4. Android系统自带theme
  5. android 相对布局属性
  6. warning: found plain 'id' attribute; d
  7. android:inputType常用取值
  8. android 相对布局属性
  9. Android平台开发-3G function porting-3G
  10. 安卓布局,比较详细也比较乱