Android应用程序安装过程源代码分析(3)
16lz
2021-01-23
Step 7.PackageManagerService.main
这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中:[cpp] view plain copy- classPackageManagerServiceextendsIPackageManager.Stub{
- ......
- publicstaticfinalIPackageManagermain(Contextcontext,booleanfactoryTest){
- PackageManagerServicem=newPackageManagerService(context,factoryTest);
- ServiceManager.addService("package",m);
- returnm;
- }
- ......
- }
- classPackageManagerServiceextendsIPackageManager.Stub{
- ......
- publicPackageManagerService(Contextcontext,booleanfactoryTest){
- ......
- synchronized(mInstallLock){
- synchronized(mPackages){
- ......
- FiledataDir=Environment.getDataDirectory();
- mAppDataDir=newFile(dataDir,"data");
- mSecureAppDataDir=newFile(dataDir,"secure/data");
- mDrmAppPrivateInstallDir=newFile(dataDir,"app-private");
- ......
- mFrameworkDir=newFile(Environment.getRootDirectory(),"framework");
- mDalvikCacheDir=newFile(dataDir,"dalvik-cache");
- ......
- //Findbaseframeworks(resourcepackageswithoutcode).
- mFrameworkInstallObserver=newAppDirObserver(
- mFrameworkDir.getPath(),OBSERVER_EVENTS,true);
- mFrameworkInstallObserver.startWatching();
- scanDirLI(mFrameworkDir,PackageParser.PARSE_IS_SYSTEM
- |PackageParser.PARSE_IS_SYSTEM_DIR,
- scanMode|SCAN_NO_DEX,0);
- //Collectallsystempackages.
- mSystemAppDir=newFile(Environment.getRootDirectory(),"app");
- mSystemInstallObserver=newAppDirObserver(
- mSystemAppDir.getPath(),OBSERVER_EVENTS,true);
- mSystemInstallObserver.startWatching();
- scanDirLI(mSystemAppDir,PackageParser.PARSE_IS_SYSTEM
- |PackageParser.PARSE_IS_SYSTEM_DIR,scanMode,0);
- //Collectallvendorpackages.
- mVendorAppDir=newFile("/vendor/app");
- mVendorInstallObserver=newAppDirObserver(
- mVendorAppDir.getPath(),OBSERVER_EVENTS,true);
- mVendorInstallObserver.startWatching();
- scanDirLI(mVendorAppDir,PackageParser.PARSE_IS_SYSTEM
- |PackageParser.PARSE_IS_SYSTEM_DIR,scanMode,0);
- mAppInstallObserver=newAppDirObserver(
- mAppInstallDir.getPath(),OBSERVER_EVENTS,false);
- mAppInstallObserver.startWatching();
- scanDirLI(mAppInstallDir,0,scanMode,0);
- mDrmAppInstallObserver=newAppDirObserver(
- mDrmAppPrivateInstallDir.getPath(),OBSERVER_EVENTS,false);
- mDrmAppInstallObserver.startWatching();
- scanDirLI(mDrmAppPrivateInstallDir,PackageParser.PARSE_FORWARD_LOCK,
- scanMode,0);
- ......
- }
- }
- }
- ......
- }
/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
- classPackageManagerServiceextendsIPackageManager.Stub{
- ......
- privatevoidscanDirLI(Filedir,intflags,intscanMode,longcurrentTime){
- String[]files=dir.list();
- ......
- inti;
- for(i=0;i<files.length;i++){
- Filefile=newFile(dir,files[i]);
- if(!isPackageFilename(files[i])){
- //Ignoreentrieswhicharenotapk's
- continue;
- }
- PackageParser.Packagepkg=scanPackageLI(file,
- flags|PackageParser.PARSE_MUST_BE_APK,scanMode,currentTime);
- //Don'tmessaroundwithappsinsystempartition.
- if(pkg==null&&(flags&PackageParser.PARSE_IS_SYSTEM)==0&&
- mLastScanError==PackageManager.INSTALL_FAILED_INVALID_APK){
- //Deletetheapk
- Slog.w(TAG,"Cleaningupfailedinstallof"+file);
- file.delete();
- }
- }
- }
- ......
- }
这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中:[java] view plain copy
- classPackageManagerServiceextendsIPackageManager.Stub{
- ......
- privatePackageParser.PackagescanPackageLI(FilescanFile,
- intparseFlags,intscanMode,longcurrentTime){
- ......
- StringscanPath=scanFile.getPath();
- parseFlags|=mDefParseFlags;
- PackageParserpp=newPackageParser(scanPath);
- ......
- finalPackageParser.Packagepkg=pp.parsePackage(scanFile,
- scanPath,mMetrics,parseFlags);
- ......
- returnscanPackageLI(pkg,parseFlags,scanMode|SCAN_UPDATE_SIGNATURE,currentTime);
- }
- ......
- }
更多相关文章
- C语言函数以及函数的使用
- 2013.01.03 (2)——— android开发实例之仿QQExpandableListView
- 45个android实例源码
- Error--->android工程导入找不到R文件
- 在AndroidManifest.xml文件中的android:windowSoftInputMode属性
- Gradle离线配置、.android、.AndroidStudio、.gradle、.m2缓存文
- Android 获取AndroidManifest.xml文件versionCode,versionName属
- Android 密度转换实例
- Android客户端上传文件,C#服务端接收文件