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. C语言函数以及函数的使用
  2. 2013.01.03 (2)——— android开发实例之仿QQExpandableListView
  3. 45个android实例源码
  4. Error--->android工程导入找不到R文件
  5. 在AndroidManifest.xml文件中的android:windowSoftInputMode属性
  6. Gradle离线配置、.android、.AndroidStudio、.gradle、.m2缓存文
  7. Android 获取AndroidManifest.xml文件versionCode,versionName属
  8. Android 密度转换实例
  9. Android客户端上传文件,C#服务端接收文件

随机推荐

  1. Android(安卓)使用ADB命令安装、卸载软件
  2. Android(安卓)SDK更新的问题
  3. android:installLocation 用法科普
  4. android:installLocation简析
  5. Android中JNI的使用方法
  6. [Android(安卓)博客]收集一些不错的,关于a
  7. 最新android 应用源码下载
  8. android 如何获得系统权限 android.uid.s
  9. android 用代码画虚线边框背景
  10. Android(安卓)Studio第十八期 - Snaphelp