|
|
|
|
|
|
|
|
|
|
|
Apk文件中:
预定义权限在frameworks/base/data/etc/platform.xml以及其他权限描述文件中描述。
|
在运行时,搜索/system/etc/permissions/下的所有xml文件并解析(platform.xml总是最后解析)。其中权限“permission”记录到Settings.mPermissions中,系统权限的授权“assign-permission”记录到mSystemPermissions中,以UID为索引,值为HashSet
Android 系统在 system/core/private/android_filesystem_config.h 中定义了用户、用户组的具体ID号。
|
应用可以自定义权限。权限组记录在mPermissionGroups中,而权限和权限树记录在Settings的mPermissions和mPermissionTrees中。
权限检查时(checkUidPermission),对于普通应用(或者共享的UID),通过GrantedPermissions检查权限,系统UID通过系统权限的授权记录检查权限。
ActivityManager权限检查流程:
授权:
权限收养:
记录在mInstrumentation中。
通过在Manifest中定义“overlay”小节覆盖其他应用的资源,目前只对/vender/overlay目录的存在的应用,该机制有效。
资源覆盖情形记录在mOverlays两层映射中。第一层以覆盖目标(OverlayTarget)为索引,第二层以覆盖源为索引,以PackageParser.Package为值。
通过installd(调用idmap)建立资源ID映射,映射保存在/data/resource-cache/a@[email protected]@idmap中。
覆盖目标的applicationInfo.resourceDirs被设置为覆盖源的sourceDir的有序集合,按照mOverlayPriority排序。
在system/core/libutils/README中有对资源覆盖的详细描述。
|
|
|
|
应用状态对应于用户,每个用户有一个状态集PackageUserState。应用状态包括:
com.android.defcontainer.DefaultContainerService的getMinimalPackageInfo获取建议安装位置。源代码位于:frameworks/base/packages/DefaultContainerService。
其中recommendAppInstallLocation的逻辑为:
完整逻辑在installLocationPolicy实现:
PackageManagerServices.installPackage()
PackageManagerServices.InstallParams.handleStartCopy()
PackageManagerServices.InstallParams.handleReturnCode()
PackageManagerServices.processPendingInstall()
PackageManagerServices.installPackageLI()
PackageManagerServices.installNewPackageLI()
PackageManagerServices.replacePackageLI()
PackageManagerServices.scanPackageLI()
PackageManagerServices.updateSettingsLI()
PackageManagerServices.deletePackageLI()
方法名后面的LI表示加上了Install锁,LP表示加上了Package锁。