Android应用程序安装过程源代码分析(4)
16lz
2021-12-04
Step 12.PackageManagerService.scanPackageLI
这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中:
[java] view plain copy- classPackageManagerServiceextendsIPackageManager.Stub{
- ......
- //KeysareString(packagename),valuesarePackage.Thisalsoserves
- //asthelockfortheglobalstate.Methodsthatmustbecalledwith
- //thislockheldhavetheprefix"LP".
- finalHashMap<String,PackageParser.Package>mPackages=
- newHashMap<String,PackageParser.Package>();
- ......
- //Allavailableactivities,foryourresolvingpleasure.
- finalActivityIntentResolvermActivities=
- newActivityIntentResolver();
- //Allavailablereceivers,foryourresolvingpleasure.
- finalActivityIntentResolvermReceivers=
- newActivityIntentResolver();
- //Allavailableservices,foryourresolvingpleasure.
- finalServiceIntentResolvermServices=newServiceIntentResolver();
- //KeysareString(providerclassname),valuesareProvider.
- finalHashMap<ComponentName,PackageParser.Provider>mProvidersByComponent=
- newHashMap<ComponentName,PackageParser.Provider>();
- ......
- privatePackageParser.PackagescanPackageLI(PackageParser.Packagepkg,
- intparseFlags,intscanMode,longcurrentTime){
- ......
- synchronized(mPackages){
- ......
- //AddthenewsettingtomPackages
- mPackages.put(pkg.applicationInfo.packageName,pkg);
- ......
- intN=pkg.providers.size();
- inti;
- for(i=0;i<N;i++){
- PackageParser.Providerp=pkg.providers.get(i);
- p.info.processName=fixProcessName(pkg.applicationInfo.processName,
- p.info.processName,pkg.applicationInfo.uid);
- mProvidersByComponent.put(newComponentName(p.info.packageName,
- p.info.name),p);
- ......
- }
- N=pkg.services.size();
- for(i=0;i<N;i++){
- PackageParser.Services=pkg.services.get(i);
- s.info.processName=fixProcessName(pkg.applicationInfo.processName,
- s.info.processName,pkg.applicationInfo.uid);
- mServices.addService(s);
- ......
- }
- N=pkg.receivers.size();
- r=null;
- for(i=0;i<N;i++){
- PackageParser.Activitya=pkg.receivers.get(i);
- a.info.processName=fixProcessName(pkg.applicationInfo.processName,
- a.info.processName,pkg.applicationInfo.uid);
- mReceivers.addActivity(a,"receiver");
- ......
- }
- N=pkg.activities.size();
- for(i=0;i<N;i++){
- PackageParser.Activitya=pkg.activities.get(i);
- a.info.processName=fixProcessName(pkg.applicationInfo.processName,
- a.info.processName,pkg.applicationInfo.uid);
- mActivities.addActivity(a,"activity");
- ......
- }
- ......
- }
- ......
- returnpkg;
- }
- ......
- }
这个函数主要就是把前面解析应用程序得到的package、provider、service、receiver和activity等信息保存在PackageManagerService服务中了。
这样,在Android系统启动的时候安装应用程序的过程就介绍完了,但是,这些应用程序只是相当于在PackageManagerService服务注册好了,如果我们想要在Android桌面上看到这些应用程序,还需要有一个Home应用程序,负责从PackageManagerService服务中把这些安装好的应用程序取出来,并以友好的方式在桌面上展现出来,例如以快捷图标的形式。在Android系统中,负责把系统中已经安装的应用程序在桌面中展现出来的Home应用程序就是Launcher了,在下一篇文章中,我们将介绍Launcher是如何启动的以及它是如何从PackageManagerService服务中把系统中已经安装好的应用程序展现出来的,敬请期待。
更多相关文章
- Android客户端上传文件,C#服务端接收文件
- Android拍照上传至PHP服务器并写入MySql数据库(下)
- android framework添加自定义服务,实现java层api调用
- android属性
- Android(安卓)Service 示例
- android上传图片至服务器
- Android应用程序键盘(Keyboard)消息处理机制分析(12)
- Android开机自动启动服务
- android客户端利用sokcet通信和向Java服务端发请求,Java服务端把