-
关键目录
- 应用信息存放结构:
- /etc/
- permissions/
- *.xml(系统权限信息)
- permissions/
- /data/(android_data_dir,ENV:ANDROID_DATA)
- app/(android_app_dir,APP_SUBDIR)
- app-private/(android_app_private_dir,PRIVATE_APP_SUBDIR)
- app-lib/(android_app_lib_dir,APP_LIB_SUBDIR)
- com.pptv.atv/
- app-asec/
- data/(主用户数据,PRIMARY_USER_PREFIX)
- com.pptv.atv/
- lib/(PKG_LIB_POSTFIX)
- com.pptv.atv/
- user/(其他用户数据,SECONDARY_USER_PREFIX)
- 0 -> /data/data/
- 10/(用户ID)
- com.pptv.atv/
- dalvik-cache/
- media/(android_media_dir,MEDIA_SUBDIR)
- /mnt/asec/(android_asec_dir,ENV: ASEC_MOUNTPOINT)
- /system/(android_system_dirs[0],ENV: ANDROID_ROOT)
- /vendor/app/(android_system_dirs[1])
-
搜索目录
- 首先搜索系统目录,解析参数都有PARSE_IS_SYSTEM|PARSE_IS_SYSTEM_DIR,搜索的系统目录有:
- /vendor/overlay
- SCAN_TRUSTED_OVERLAY
- /system/framework
- PARSE_IS_PRIVILEGED
- SCAN_NO_DEX
- /system/priv-app
- PARSE_IS_PRIVILEGED
- /system/app
- /vendor/app
- 当mOnlyCore为假时,还会搜索下面的目录:
- /data/app
- /data/app-private
- PARSE_FORWARD_LOCK
-
安装目录
-
权限情况
- 所有者: system system
- 所有者(软连接): install install
- 读写标志位: 755
- 读写标志位(软连接): 777
- 读写标志位(文件): 644
- 修改时间(目录): 1970-01-02 00:30
- 修改时间(软连接): 1970-01-02 00:30
- 修改时间(文件): Apk里面的时间
预装(MediaBoxLauncher)
- /system/
- app/
- MediaBoxLauncher.apk
- lib/
- app/
- /data/ (读写标志位:775)
- dalvik-cache/
- system@app@MboxSetting.apk@classes.dex (用户:system 组:u0_a31000)
- data/ (读写标志位:775)
- com.amlogic.mediaboxlauncher/ (读写标志位:751)
- lib -> /data/app-lib/com.amlogic.mediaboxlauncher (无效的符号链接)
- com.amlogic.mediaboxlauncher/ (读写标志位:751)
- user/ (读写标志位:711)
- 0 -> /data/data/ (用户组:root)
- dalvik-cache/
通过包管理器安装(PPTV)
- /data/
- app/
- com.pplive.androidtv-1.apk (自动修改名字为包名)
- dalvik-cache/
- data@app@com.pplive.androidtv-1.apk@classes.dex (用户:system 组:all_a47)
- data/
- com.pplive.androidtv/ (用户组:u0_a47,读写标志位:751)
- lib -> /data/app-lib/com.pplive.androidtv-1
- com.pplive.androidtv/ (用户组:u0_a47,读写标志位:751)
- app-lib/
- com.pplive.androidtv-1/
- libpplive_dmr_jni.so
- com.pplive.androidtv-1/
- app/
拷贝到/data/app目录重启安装(MX Player)
- /data/
- app/
- MX_Player_v1.7.13_7po.apk
- dalvik-cache/
- data@app@MX_Player_v1.7.13_7po.apk@classes.dex (用户:system 组:all_a49)
- data/
- com.mxtech.videoplayer.ad/ (用户组:u0_a49)
- lib -> /data/app-lib/MX_Player_v1.7.13_7po (符号链接,install 用户、组)
- com.mxtech.videoplayer.ad/ (用户组:u0_a49)
- app-lib/
- MX_Player_v1.7.13_7po/
- libavcodec.so
- MX_Player_v1.7.13_7po/
- app/
数据目录
- 应用的数据目录为:/data/data/<packageName>,平台应用(名称:android)除外,其数据目录为:/data/system。
- 如果数据目录已经存在,但是UID与应用ID不同,此时有两种情况:1)目录UID为0,可能是上次安装中途宕机,修复UID;2)对于系统应用或者启动扫描中发现的应用,删除重建。
UID分配
|
|
|
|
|
|
|
|
|
|
内建共享库
|
- 内建共享库是java library,内建共享库一部分定义在etc/permissions/*.xml中,如:
- 另一部分由System App定义,此时SharedLibraryEntry只记录packageName。
- 对于非PARSE_IS_SYSTEM_DIR,调用updateSharedLibrariesLPw()将usesLibraries、usesOptionalLibraries转换为库路径:usesLibraryFiles。
- 应用使用共享库的代码:
- LoadedApk.getClassLoader()
应用重命名
- Manifest的“original-package”指定老名字,可以多个。
- 只有系统应用可以重命名,不能改变SharedUserId。重命名其实是保持老的名字,重命名情况记录在Settings.mRenamedPackages(Map)中,以新名字为索引,老名字为值。
- 因为有重命名机制,所以在判断覆盖安装时,要判断将要安装应用的老名字的应用是否存在。
- 老名字记录在mTransferedPackages中,PackageSetting的origPackage成员不一直跟踪老的包。
本地库
- 本地库目录一般为:/data/data/<apk name>/lib。
签名
- Signing Your Apps
- android应用程序的签名(Signature)
- Android的权限机制之—— “沙箱”机制sharedUserId和签名
- Android 安全架构及权限控制机制剖析
- 浅析Android权限机制(一)
- Android服务之PackageManagerService启动源码分析4
- Android4.2多用户模式的结构与实现
Apk文件中:
- 在JarFile打开Jar包时,首先收集并读取下列项目:
- META-INF/MANIFEST.MF
- *.SF/*.DSA/*.RSA/*.EC
- 然后验证证书,对每一个*.DSA/*.RSA/*.EC文件,都对应一个*.SF签名文件,验证并记录(以签名文件为索引):
- 证书链Certificate[]
- 签名项目HashMap<String, Attributes>(每个使用该证书签名的文件都有一项)
- 对于Apk包,所有的文件都应该用同一个证书签名,在PackageParser中,对于SYSTEM Apk只验证AndroidManifest.xml;在Package的mSignatures记录证书的Encode字节,mSigningKeys记录证书的公钥。
- 除了验证证书公钥集mSigningKey,应用可以自定义多个公钥集mKeySetMapping。
- KeySetManager管理所有的公钥和公钥集,首先给PublicKey编号ID,存储在mPublicKeys中,PublicKey集合(Set<KeySet>)转换为ID集合,对这个集合再次编号,存储在mKeySetMapping中,同时对外返回类似句柄的KeySet。
- 签名检查(compareSignatures)检查Signatures完全相同。
组件
- 四大组件包括“内容提供者”、“服务”、“广播”、“活动”;分别记录到mProviders、mServices、mBroadcasts、mActivities中,用于将来被Intent检索。
- 内容提供者还被记录到mProvidersByAuthority中。对于syncable的内容提供者,只有第一个Authority的syncable有效。
- 保护广播记录在mProtectedBroadcasts中。
- Android理解:显式和隐式Intent
- Android Activity和Intent机制学习笔记
- 通过下面四个成员分别保存四类组件的所有对象。
- mActivities : ActivityIntentResolver
- mReceivers : ActivityIntentResolver
- mServices : ServiceIntentResolver
- mProviders : ProviderIntentResolver
- 在scanPackageLI函数中安装包的时候,将组件分别加入到对应的集合中。
权限
- 类型:
- TYPE_NORMAL,应用定义
- TYPE_BUILTIN,预定义权限
- TYPE_DYNAMIC
预定义权限在frameworks/base/data/etc/platform.xml以及其他权限描述文件中描述。
|
在运行时,搜索/system/etc/permissions/下的所有xml文件并解析(platform.xml总是最后解析)。其中权限“permission”记录到Settings.mPermissions中,系统权限的授权“assign-permission”记录到mSystemPermissions中,以UID为索引,值为HashSet<String>类型,包含多个权限名称。
Android 系统在 system/core/private/android_filesystem_config.h 中定义了用户、用户组的具体ID号。
|
应用可以自定义权限。权限组记录在mPermissionGroups中,而权限和权限树记录在Settings的mPermissions和mPermissionTrees中。
权限检查时(checkUidPermission),对于普通应用(或者共享的UID),通过GrantedPermissions检查权限,系统UID通过系统权限的授权记录检查权限。
ActivityManager权限检查流程:
- UID为0或者SYSTEM_UID(1000),直接通过
- UID为Isolated,失败
- 权限使用者与所有者相同,通过
- 权限没有导出,失败
- PackageManager检查
授权:
- PROTECTION_NORMAL || PROTECTION_DANGEROUS
- required
- origPermissions.contains(perm)
- isSystemApp(ps) && !isUpdatedSystemApp(ps)
- PROTECTION_SIGNATURE
- SIGNATURE_MATCH(bp.packageSetting.signatures.mSignatures, pkg.mSignatures)
- SIGNATURE_MATCH(mPlatformPackage.mSignatures,pkg.mSignatures)
- PROTECTION_FLAG_SYSTEM
- isSystemApp(pkg)
- isUpdatedSystemApp(pkg)
- origGp.grantedPermissions.contains(perm)
- sysPs.pkg.requestedPermissions
- isPrivilegedApp()
- isUpdatedSystemApp(pkg)
- isSystemApp(pkg)
- PROTECTION_FLAG_DEVELOPMENT
- origPermissions.contains(perm)
权限收养:
- Manifest的“adopt-permissions”指定从哪个应用收养权限
- 只有系统应用更新时,可以收养权限
- 实际操作是:改变权限的所有者
Instrumentation
记录在mInstrumentation中。
资源覆盖
通过在Manifest中定义“overlay”小节覆盖其他应用的资源,目前只对/vender/overlay目录的存在的应用,该机制有效。
资源覆盖情形记录在mOverlays两层映射中。第一层以覆盖目标(OverlayTarget)为索引,第二层以覆盖源为索引,以PackageParser.Package为值。
通过installd(调用idmap)建立资源ID映射,映射保存在/data/resource-cache/a@b@c.apk@idmap中。
覆盖目标的applicationInfo.resourceDirs被设置为覆盖源的sourceDir的有序集合,按照mOverlayPriority排序。
在system/core/libutils/README中有对资源覆盖的详细描述。
框架设计
|
|
|
|
应用状态
应用状态对应于用户,每个用户有一个状态集PackageUserState。应用状态包括:
- stopped
- notLaunched
- installed
- blocked
- enabled
安装位置
com.android.defcontainer.DefaultContainerService的getMinimalPackageInfo获取建议安装位置。源代码位于:frameworks/base/packages/DefaultContainerService。
其中recommendAppInstallLocation的逻辑为:
- 指定安装在内部/外部
- PREFER_INTERNAL
- PREFER_EXTERNAL
- 应用需要安装在内部/外部/自动
- PREFER_INTERNAL
- PREFER_EXTERNAL(checkBoth)
- PREFER_INTERNAL(checkBoth)【默认内部】
- 用户设置安装在内部/外部/自动
- PREFER_INTERNAL
- PREFER_EXTERNAL(checkBoth)
- PREFER_INTERNAL【没有如何指示】
- emulated【模拟外部存储】
- fitsOnInternal【下列条件成立】
- checkBoth或者PREFER_INTERNAL
- 内部存储没有超过上限
- fitsOnSd【下列条件成立】
- 不是模拟外部存储
- checkBoth或者PREFER_EXTERNAL
- 外部存储没有超过上限
- 如果PREFER_INTERNAL
- 如果fitsOnInternal
- 》建议安装在内部
- 如果fitsOnInternal
- 否则不是模拟外部存储并且PREFER_EXTERNAL
- 如果fitsOnSd
- 》建议安装在外部
- 如果fitsOnSd
- 如果checkBoth
- 如果fitsOnInternal
- 》建议安装在内部
- 如果fitsOnInternal
- 否则不是模拟外部存储并且fitsOnSd
- 》建议安装在外部
- 》失败
完整逻辑在installLocationPolicy实现:
- 如果是已经存在的应用
- 如果是系统应用
- 》确定安装在内部
- 否则
- 如果指定安装在外部
- 》确定安装在外部
- 如果应用需要安装在内部
- 》确定安装在内部
- 否则如果需要安装在外部
- 否则
- 之前安装在外部
- 》确定安装在外部
- 》确定安装在内部
- 之前安装在外部
- 如果指定安装在外部
- 如果是系统应用
- 如果指定安装在外部
- 》确定安装在外部
- 》参照建议的安装位置
安装应用
PackageManagerServices.installPackage()
- installPackageWithVerification()
- installPackageWithVerificationAndEncryption()
- if (isUserRestricted(DISALLOW_INSTALL_APPS))
- return
- new InstallParams()
- PackageHandler.obtainMessage(INIT_COPY)
- PackageHandler.sendMessage()
- if (isUserRestricted(DISALLOW_INSTALL_APPS))
- installPackageWithVerificationAndEncryption()
PackageManagerServices.InstallParams.handleStartCopy()
- DeviceStorageMonitorService.getMemoryLowThreshold()
- Context.grantUriPermission()
- if (encryptionParams || !"file")
- createTempPackageFile()【/data/app-private/vmdlxxx.tmp】
- IMediaContainerService.copyResource()
- IMediaContainerService.getMinimalPackageInfo()
- if (RECOMMEND_FAILED_INSUFFICIENT_STORAGE)
- IMediaContainerService.calculateInstalledSize()
- Installer.freeCache()
- IMediaContainerService.getMinimalPackageInfo()
- Context.revokeUriPermission()
- installLocationPolicy()
- PackageManagerServices.createInstallArgs()
- new AsecInstallArgs
- new FileInstallArgs
- if (mRequiredVerifierPackage)
- getPackageUid()
- new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION)
- PackageManagerServices.queryIntentReceivers()
- new PackageVerificationState()
- mPendingVerification.append()
- PackageManagerServices.matchVerifiers()
- for (sufficientVerifiers)
- Context.sendBroadcastAsUser();
- matchComponentForVerifier()
- Context.sendOrderedBroadcastAsUser()
- else
- InstallArgs.copyApk()
- createCopyFile()
- File.createNewFile()【/data/app/vmdlyyy.tmp】
- setPermissions()
- IMediaContainerService.copyResource()
- if (isFwdLocked())
- PackageHelper.extractPublicFiles()【拷贝manifest, resources.arsc and res directory到新zip文件【/data/app/vmdlyyy.zip.tmp】】
- NativeLibraryHelper.removeNativeBinariesFromDirLI()【删除旧文件】
- copyNativeLibrariesForInternalApp()
- File.mkdir()【/data/app-lib/vmdlyyy/】
- new NativeLibraryHelper.ApkHandle()
- NativeLibraryHelper.findSupportedAbi()
- NativeLibraryHelper.copyNativeBinariesIfNeededLI()
- InstallArgs.copyApk()
PackageManagerServices.InstallParams.handleReturnCode()
- PackageManagerServices.processPendingInstall()【见步骤三】
PackageManagerServices.processPendingInstall()
- mHandler.post(new Runnable())【异步执行】
- new PackageInstalledInfo()
- new PackageRemovedInfo()
- InstallArgs.doPreInstall()
- installPackageLI()【见步骤四】
- InstallArgs.doPostInstall()
- new PostInstallData()
- mRunningInstalls.put()
- if (doRestore)
- IBackupManager.restoreAtInstall()
- if (!doRestore)
- mHandler.sendMessage(POST_INSTALL)
PackageManagerServices.installPackageLI()
- new PackageParser()
- PackageParser.parsePackage()【解析】
- PackageParser.collectCertificates()【收集签名】
- replace=?【判断是否覆盖安装】
- InstallArgs.doRename()【临时文件重命名为正式名称】
- setApplicationInfoPaths()【设置路径到ApplicationInfo】
- if (replace)
- replacePackageLI()见步骤七】
- else
- installNewPackageLI()【见步骤六】
- PackageSetting.queryInstalledUsers()
PackageManagerServices.installNewPackageLI()
- scanPackageLI()【见步骤八】
- updateSettingsLI()【见步骤九】
- if (!INSTALL_SUCCEEDED)
- deletePackageLI()
PackageManagerServices.replacePackageLI()
- synchronized(mPackages)
- mPackages.get()【查找老的】
- if (compareSignatures())【检查签名一致】
- return INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
- Settings.mPackages.get()
- UserManager.getUserIds()
- if (isSystemApp())【系统应用】
- replaceSystemPackageLI()
- synchronized (mPackages)
- mPackages.get()
- Settings.mPackages.get()
- killApplication()
- removePackageLI()【见步骤十】
- synchronized (mPackages)
- if (!Settings.disableSystemPackageLPw())【二次替换】
- createInstallArgs()
- if (!Settings.disableSystemPackageLPw())【二次替换】
- scanPackageLI()【见步骤八】
- updateSettingsLI()【见步骤九】
- if (!INSTALL_SUCCEEDED)
- if (newPackage)
- removeInstalledPackageLI()【见步骤十】
- scanPackageLI()
- synchronized(mPackages)
- if (updatedSettings) 【调用过updateSettingsLI】
- Settings.enableSystemPackageLPw()
- Settings.setInstallerPackageName()
- Settings.writeLPr()
- if (updatedSettings) 【调用过updateSettingsLI】
- if (newPackage)
- synchronized (mPackages)
- replaceSystemPackageLI()
- else【非系统应用】
- replaceNonSystemPackageLI()
- if (!deletePackageLI(DELETE_KEEP_DATA)) 【见步骤十】
- INSTALL_FAILED_REPLACE_COULDNT_DELETE
- else
- scanPackageLI()【见步骤八】
- if (newPackage)
- updateSettingsLI()【见步骤九】
- else
- INSTALL_FAILED_INVALID_APK
- if (!INSTALL_SUCCEEDED) 【替换失败,需要恢复】
- if(updatedSettings)【调用过updateSettingsLI】
- deletePackageLI(DELETE_KEEP_DATA) 【见步骤十】
- if(deletedPkg)
- scanPackageLI()【见步骤八】
- synchronized (mPackages)
- updatePermissionsLPw()【】
- Settings.writeLPr()
- if(updatedSettings)【调用过updateSettingsLI】
- if (!deletePackageLI(DELETE_KEEP_DATA)) 【见步骤十】
- replaceNonSystemPackageLI()
PackageManagerServices.scanPackageLI()
- if (mCustomResolverComponentName==pkg.packageName)
- setUpCustomResolverActivity()
- synchronized (mPackages)
- if (!PARSE_IS_SYSTEM_DIR)
- updateSharedLibrariesLPw()【查找引用的共享库】
- if (pkg.mSharedUserId)
- Settings.getSharedUserLPw()【获取共享用户,没有创建新的】
- if (pkg.mOriginalPackages)
- if (pkg.mOriginalPackages.contains(renamed))【已经改名过】
- PackageParser.Package.setPackageName()
- else【寻找origPackage】
- for (pkg.mOriginalPackages)
- Settings.peekPackageLPr()
- verifyPackageUpdateLPr()
- if (origPackage.sharedUser)
- 【判断sharedUser相同】
- for (pkg.mOriginalPackages)
- if (pkg.mOriginalPackages.contains(renamed))【已经改名过】
- Settings.getPackageLPw()【获取或者创建PackageSetting,不添加】
- if (pkgSetting.origPackage)【第一次改名】
- PackageParser.Package.setPackageName()
- if (!verifySignaturesLP())【签名验证失败,改变了】
- if (!PARSE_IS_SYSTEM_DIR)【非系统预装应用不可以改变签名】
- return null
- if (pkgSetting.sharedUser)【系统预装改变签名,sharedUser不能变】
- if (compareSignatures()!= SIGNATURE_MATCH)
- return null
- if (compareSignatures()!= SIGNATURE_MATCH)
- if (!PARSE_IS_SYSTEM_DIR)【非系统预装应用不可以改变签名】
- if (SCAN_NEW_INSTALL)【新装应用,检查providers的authority冲突】
- if (pkg.mAdoptPermissions)【权限收养】
- for (pkg.mAdoptPermissions)
- if (verifyPackageUpdateLPr())
- Settings.transferPermissionsLPw()
- if (verifyPackageUpdateLPr())
- for (pkg.mAdoptPermissions)
- if (!PARSE_IS_SYSTEM_DIR)
- <end synchronized>
- if (mPlatformPackage == pkg)
- system package special dataDir【/data/system/】
- else
- getDataPathForPackage()【/data/data/com.xxx.yyy/】
- if (dataPath.exists())
- if (currentUid != pkg.applicationInfo.uid)
- if (currentUid == 0)
- Installer.fixUid()
- if (PARSE_IS_SYSTEM || SCAN_BOOTING)
- removeDataDirsLI()
- createDataDirsLI()
- if (currentUid == 0)
- if (currentUid != pkg.applicationInfo.uid)
- else
- createDataDirsLI()
- setInternalAppNativeLibraryPath()
- if (pkg.applicationInfo.nativeLibraryDir())
- if (isSystemApp(pkg) && !isUpdatedSystemApp(pkg))
- NativeLibraryHelper.removeNativeBinariesFromDirLI()
- else if (!isForwardLocked(pkg) && !isExternal(pkg))
- copyNativeLibrariesForInternalApp()【好像InstallArgs.copyApk已经做过这些操作了】
- synchronized (mInstallLock)
- for (UserManager.getUserIds())
- Installer.linkNativeLibraryDirectory()
- for (UserManager.getUserIds())
- if (isSystemApp(pkg) && !isUpdatedSystemApp(pkg))
- synchronized (mPackages)
- if (FLAG_SYSTEM)
- if (pkg.libraryNames)【系统应用有共享库】
- for (pkg.libraryNames)
- new SharedLibraryEntry()
- if (!SCAN_BOOTING)
- updateAllSharedLibrariesLPw()
- for (pkg.libraryNames)
- if (pkg.libraryNames)【系统应用有共享库】
- if (FLAG_SYSTEM)
- if (INSTALL_REPLACE_EXISTING)
- if (isForwardLocked(pkg) || isExternal(pkg))
- sendResourcesChangedBroadcast()
- killApplication()
- if (isForwardLocked(pkg) || isExternal(pkg))
- synchronized (mPackages)【后面不会失败】
- if (SCAN_MONITOR)
- mAppDirs.put(pkg.mPath, pkg)
- Settings.insertPackageSettingLPw()
- mPackages.put()
- mSettings.mPackagesToBeCleaned【从中删除当前pkgName项】
- KeySetManager.addSigningKeySetToPackage()
- for (pkg.mKeySetMapping)
- KeySetManager.addDefinedKeySetToPackage()
- mProvidersByAuthority
- mServices
- mReceivers
- mActivities
- mPermissionGroups
- mSettings.mPermissionTrees
- mSettings.mPermissions
- mInstrumentation
- mProtectedBroadcasts
- mOverlays
- if (pkg.mOverlayTarget)
- createIdmapForPackagePairLI()
- else if (mOverlays.containsKey(pkg.packageName)
- createIdmapsForPackageLI()
- for (mOverlays.get())
- createIdmapForPackagePairLI()
- for (mOverlays.get())
- createIdmapsForPackageLI()
- if (pkg.mOverlayTarget)
- if (SCAN_MONITOR)
PackageManagerServices.updateSettingsLI()
- Settings.setInstallStatus(PKG_INSTALL_INCOMPLETE)
- Settings.writeLPr()
- moveDexFilesLI()
- updatePermissionsLPw()
- for (Settings.mPermissionTrees)
- if (!hasPermission())
- it.remove()
- if (!hasPermission())
- for (Settings.mPermissions)
- if (!hasPermission())
- it.remove()
- if (!hasPermission())
- if (UPDATE_PERMISSIONS_ALL)
- for (mPackages)
- grantPermissionsLPw()
- for (mPackages)
- if (pkgInfo)
- grantPermissionsLPw()
- for (Settings.mPermissionTrees)
- if (isSystemApp())
- for (res.origUsers)
- PackageSetting.setEnabled()
- for (allUsers)
- PackageSetting.setInstalled()
- for (res.origUsers)
- Settings.setInstallStatus(PKG_INSTALL_COMPLETE)
- Settings.setInstallerPackageName()
- Settings.writeLPr()
PackageManagerServices.deletePackageLI()
数据
- mHandlerThread : HandlerThread(后台线程)
- mHandler : PackageHandler
- mBound : boolean
- mPendingInstalls : ArrayList<HandlerParams>
- mContext : Context
- mFactoryTest : boolean
- mOnlyCore : boolean
- mNoDexOpt : Boolean
- mMetrics : DisplayMetrics
- mDefParseFlags : int
- mSeparateProcesses : String[]
- 目录
- mAppDataDir : File
- mUserAppDataDir : File
- mAsecInternalPath : String
- mAppInstallDir : File
- mAppLibInstallDir : File
- mDrmAppPrivateInstallDir : File
- mInstallLock : Object
- FileObserver
- mFrameworkInstallObserver
- mSystemInstallObserver
- mPrivilegedInstallObserver
- mVendorInstallObserver
- mVendorOverlayInstallObserver
- mAppInstallObserver
- mDrmAppInstallObserver
- mInstaller : Installer
- mAppDirs : HashMap<String, PackageParser.Package>(第三方APP安装目录,索引键为zip包CodePath)
- mScanningPath : File(用于错误日志)
- mLastScanError : int(用于错误日志)
- mPackages : HashMap<String, PackageParser.Package>(索引键为包名,也用于LP锁)
- mOverlays : HashMap<String, HashMap<String, PackageParser.Package>>(索引键为包名、包路径)
- mSettings : Settings
- mRestoredSettings : boolean
- 权限(etc/permissions/*.xml)
- mGlobalGids : int[]
- mSystemPermissions : SparseArray<HashSet<String>>
- mSharedLibraries : HashMap<String, SharedLibraryEntry>
- mAvailableFeatures : HashMap<String, FeatureInfo>
- mFoundPolicyFile : boolean
- mTmpSharedLibraries : String[]
- mShouldRestoreconData : boolean
- resolving pleasure
- mActivities : ActivityIntentResolver
- mReceivers : ActivityIntentResolver
- mServices : ServiceIntentResolver
- mProviders : ProviderIntentResolver
- mProvidersByAuthority : HashMap<String, PackageParser.Provider>(索引键为provider base name)
- mInstrumentation : HashMap<ComponentName, PackageParser.Instrumentation>
- mPermissionGroups : HashMap<String, PackageParser.PermissionGroup>(索引键为权限名)
- mTransferedPackages : HashSet<String>
- mProtectedBroadcasts : HashSet<String>(只在系统内有效的广播)
- mPendingVerification : SparseArray<PackageVerificationState>(等待验证的包)
- mDeferredDexOpt : HashSet<PackageParser.Package>
- mPendingVerificationToken : int
- mSystemReady : boolean
- mSafeMode : boolean
- mHasSystemUidErrors : boolean
- mAndroidApplication : ApplicationInfo
- mResolveActivity : ActivityInfo
- mResolveInfo : ResolveInfo
- mResolveComponentName : ComponentName
- mPlatformPackage : PackageParser.Package
- mCustomResolverComponentName : ComponentName
- mResolverReplaced : boolean
- mPendingBroadcasts : PendingPackageBroadcasts
- mUidMap : SparseArray<HashMap<String, ArrayList<String>>>(for each user id, a map of <package name -> components within that package>)
- mContainerService : IMediaContainerService
- sUserManager : UserManagerService
- mDirtyUsers : HashSet<Integer>
- mDefContainerConn : DefaultContainerConnection(连接IMediaContainerService)
- mRunningInstalls : SparseArray<PostInstallData>(keeping of restore-after-install operations)
- PostInstallData
- args : InstallArgs
- res : PackageInstalledInfo
- PostInstallData
- mNextInstallToken : int
- mRequiredVerifierPackage : String
方法
方法名后面的LI表示加上了Install锁,LP表示加上了Package锁。
- getRequiredVerifierLPr()
- isVerificationEnable()
- DEFAULT_VERIFY_ENABLE
- INSTALL_FROM_ADB
- ActivityManager.isRunningInTestHarness()
- Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB
- Settings.Global.PACKAGE_VERIFIER_ENABLE