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. Android客户端上传文件,C#服务端接收文件
  2. Android拍照上传至PHP服务器并写入MySql数据库(下)
  3. android framework添加自定义服务,实现java层api调用
  4. android属性
  5. Android(安卓)Service 示例
  6. android上传图片至服务器
  7. Android应用程序键盘(Keyboard)消息处理机制分析(12)
  8. Android开机自动启动服务
  9. android客户端利用sokcet通信和向Java服务端发请求,Java服务端把

随机推荐

  1. Java堆内存又溢出了!教你一招必杀技
  2. VScode编辑器设置中文的教程,超详细的
  3. 石油数据标准化
  4. 充电先锋营 薪资涨不停~
  5. 石油数据的本质
  6. 前端技巧:谷歌浏览器的font boosting[Text
  7. 在Ubuntu下搭建nextcloud
  8. ubuntu14.04开启root用户
  9. kafka 启动速度为啥越来越慢?
  10. ELK企业日志平台收集Nginx访问日志