Step 7.PackageManagerService.main

这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中: [cpp] view plain copy
  1. classPackageManagerServiceextendsIPackageManager.Stub{
  2. ......
  3. publicstaticfinalIPackageManagermain(Contextcontext,booleanfactoryTest){
  4. PackageManagerServicem=newPackageManagerService(context,factoryTest);
  5. ServiceManager.addService("package",m);
  6. returnm;
  7. }
  8. ......
  9. }
这个函数创建了一个PackageManagerService服务实例,然后把这个服务添加到ServiceManager中去,ServiceManager是Android系统Binder进程间通信机制的守护进程,负责管理系统中的Binder对象,具体可以参考 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路 一文。 在创建这个PackageManagerService服务实例时,会在PackageManagerService类的构造函数中开始执行安装应用程序的过程: [java] view plain copy
  1. classPackageManagerServiceextendsIPackageManager.Stub{
  2. ......
  3. publicPackageManagerService(Contextcontext,booleanfactoryTest){
  4. ......
  5. synchronized(mInstallLock){
  6. synchronized(mPackages){
  7. ......
  8. FiledataDir=Environment.getDataDirectory();
  9. mAppDataDir=newFile(dataDir,"data");
  10. mSecureAppDataDir=newFile(dataDir,"secure/data");
  11. mDrmAppPrivateInstallDir=newFile(dataDir,"app-private");
  12. ......
  13. mFrameworkDir=newFile(Environment.getRootDirectory(),"framework");
  14. mDalvikCacheDir=newFile(dataDir,"dalvik-cache");
  15. ......
  16. //Findbaseframeworks(resourcepackageswithoutcode).
  17. mFrameworkInstallObserver=newAppDirObserver(
  18. mFrameworkDir.getPath(),OBSERVER_EVENTS,true);
  19. mFrameworkInstallObserver.startWatching();
  20. scanDirLI(mFrameworkDir,PackageParser.PARSE_IS_SYSTEM
  21. |PackageParser.PARSE_IS_SYSTEM_DIR,
  22. scanMode|SCAN_NO_DEX,0);
  23. //Collectallsystempackages.
  24. mSystemAppDir=newFile(Environment.getRootDirectory(),"app");
  25. mSystemInstallObserver=newAppDirObserver(
  26. mSystemAppDir.getPath(),OBSERVER_EVENTS,true);
  27. mSystemInstallObserver.startWatching();
  28. scanDirLI(mSystemAppDir,PackageParser.PARSE_IS_SYSTEM
  29. |PackageParser.PARSE_IS_SYSTEM_DIR,scanMode,0);
  30. //Collectallvendorpackages.
  31. mVendorAppDir=newFile("/vendor/app");
  32. mVendorInstallObserver=newAppDirObserver(
  33. mVendorAppDir.getPath(),OBSERVER_EVENTS,true);
  34. mVendorInstallObserver.startWatching();
  35. scanDirLI(mVendorAppDir,PackageParser.PARSE_IS_SYSTEM
  36. |PackageParser.PARSE_IS_SYSTEM_DIR,scanMode,0);
  37. mAppInstallObserver=newAppDirObserver(
  38. mAppInstallDir.getPath(),OBSERVER_EVENTS,false);
  39. mAppInstallObserver.startWatching();
  40. scanDirLI(mAppInstallDir,0,scanMode,0);
  41. mDrmAppInstallObserver=newAppDirObserver(
  42. mDrmAppPrivateInstallDir.getPath(),OBSERVER_EVENTS,false);
  43. mDrmAppInstallObserver.startWatching();
  44. scanDirLI(mDrmAppPrivateInstallDir,PackageParser.PARSE_FORWARD_LOCK,
  45. scanMode,0);
  46. ......
  47. }
  48. }
  49. }
  50. ......
  51. }
这里会调用scanDirLI函数来扫描移动设备上的下面这五个目录中的Apk文件
/system/framework /system/app /vendor/app /data/app /data/app-private Step 8.PackageManagerService.scanDirLI
这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中: [java] view plain copy
  1. classPackageManagerServiceextendsIPackageManager.Stub{
  2. ......
  3. privatevoidscanDirLI(Filedir,intflags,intscanMode,longcurrentTime){
  4. String[]files=dir.list();
  5. ......
  6. inti;
  7. for(i=0;i<files.length;i++){
  8. Filefile=newFile(dir,files[i]);
  9. if(!isPackageFilename(files[i])){
  10. //Ignoreentrieswhicharenotapk's
  11. continue;
  12. }
  13. PackageParser.Packagepkg=scanPackageLI(file,
  14. flags|PackageParser.PARSE_MUST_BE_APK,scanMode,currentTime);
  15. //Don'tmessaroundwithappsinsystempartition.
  16. if(pkg==null&&(flags&PackageParser.PARSE_IS_SYSTEM)==0&&
  17. mLastScanError==PackageManager.INSTALL_FAILED_INVALID_APK){
  18. //Deletetheapk
  19. Slog.w(TAG,"Cleaningupfailedinstallof"+file);
  20. file.delete();
  21. }
  22. }
  23. }
  24. ......
  25. }
对于目录中的每一个文件,如果是以后Apk作为后缀名,那么就调用scanPackageLI函数来对它进行解析和安装。 Step 9.PackageManagerService.scanPackageLI
这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中: [java] view plain copy
  1. classPackageManagerServiceextendsIPackageManager.Stub{
  2. ......
  3. privatePackageParser.PackagescanPackageLI(FilescanFile,
  4. intparseFlags,intscanMode,longcurrentTime){
  5. ......
  6. StringscanPath=scanFile.getPath();
  7. parseFlags|=mDefParseFlags;
  8. PackageParserpp=newPackageParser(scanPath);
  9. ......
  10. finalPackageParser.Packagepkg=pp.parsePackage(scanFile,
  11. scanPath,mMetrics,parseFlags);
  12. ......
  13. returnscanPackageLI(pkg,parseFlags,scanMode|SCAN_UPDATE_SIGNATURE,currentTime);
  14. }
  15. ......
  16. }
这个函数首先会为这个Apk文件创建一个PackageParser实例,接着调用这个实例的parsePackage函数来对这个Apk文件进行解析。这个函数最后还会调用另外一个版本的scanPackageLI函数把来解析后得到的应用程序信息保存在PackageManagerService中。

更多相关文章

  1. ContentProvider 翻译
  2. 网络时间同步
  3. Android获取手机信息
  4. android studio 常见问题
  5. 关于标准android中视频播放器中的快进和快退的步长时间设置
  6. OpenGL,Android注意事项初始化顺序 NullPointer
  7. Android(安卓)NDK 开发
  8. Linux系统Android(安卓)SDK 下载版本,报错Warning: File /root/.a
  9. android之android.os.NetworkOnMainThreadException错误

随机推荐

  1. Android(安卓)build.gradle buildConfigF
  2. VMware安装Android虚拟机及adb调试
  3. Android七大布局
  4. Android访问服务器出现W/System.err(9302
  5. 一个不错的启动菜单显示屏动画效果
  6. Android消息机制
  7. Ubuntu 16.04编译Android,make 版本过高
  8. 针对Android(安卓)模拟器启动慢的问题
  9. android特效展示一:ListView
  10. android WiFi ASSOC_REJECT 流程跟踪