java.util.jar
源代码位置:libcore/luni。
类名 |
说明 |
JarFile |
继承ZipFile,额外处理认证细节,包含一个JarVerifier实例 |
JarFile. JarFileInputStream |
继承FilterInputStream,重载read方法,增加验证功能 |
JarFile. JarFileEnumerator |
枚举出JarEntry |
JarEntry |
继承ZipEntry,额外处理Attributes、Certificates、CodeSigners |
JarVerifier |
|
JarVerifier. VerifierEntry |
继承OutputStream,write时计算hash。最后校验 |
StrictJarFile |
使用JarVerifier、JarFile |
com.android.defcontainer
源代码位于:framework/base/packages/DefaultContainerService。
android.content
类名 |
说明 |
android.content.res
类型说明:
类名 |
说明 |
Resources |
|
AssetManager |
|
Configuration |
|
CompatibilityInfo |
|
StringBlock |
|
XmlBlock |
android.content.pm
类型说明:
类名 |
说明 |
PackageItemInfo |
包的基本信息,包括标题、图标和meta-data。 |
ApplicationInfo |
继承PackageItemInfo,包(应用)的信息。 |
ComponentInfo |
继承PackageItemInfo,活动(Activity)、服务(Service)组件的公共部分,包括进程、是否可用、是否外部可用。 |
ActivityInfo |
继承ComponentInfo |
ServiceInfo |
继承ComponentInfo |
ProviderInfo |
继承ComponentInfo |
ResolveInfo |
保存过滤器解析的信息,与Activity、Service、Provider中的一个对应。 |
PermissionInfo |
继承PackageItemInfo。描述组件导出的的权限。 |
PermissionGroupInfo |
继承PackageItemInfo。描述权限组。权限声明加入某个权限组,统一展现给用户。 |
PathPermission |
描述内容提供者组件中数据子集(子路径)的权限。 |
Signature |
包里面的签名 |
VerifierInfo |
包校验信息,包含一个公钥 |
KeySet |
代表一个公钥集,对外暴露为句柄Binder |
PackageStats |
|
PackageUserState |
应用对应用户的状态,停止,启用禁用的组件 |
UserInfo |
用户信息和flags |
IntentFilter |
代表一个意图过滤器 |
ResolveInfo |
解析一个意图返回的信息,派生类需要实现: newArray、isFilterStopped、isPackageForFilter、allowFilterResult、newResult |
PackageParser |
应用信息解析器 |
PackageParser. Package |
解析出来的应用信息 |
PackageParser. Permission |
解析出来的权限信息 |
PackageParser. IntentInfo |
继承IntentFilter,增加label、icon信息 |
PackageParser. Component<II> |
II需要继承PackageParser.IntentInfo |
PackageParser. Activity |
继承PackageParser.Component<ActivityIntentInfo> |
PackageParser. Service |
继承PackageParser.Component<ActivityIntentInfo> |
PackageParser. Provider |
继承PackageParser.Component<ActivityIntentInfo> |
PackageParser. ActivityIntentInfo |
继承PackageParser.IntentInfo, 包含PackageParser.Activity实例 |
PackageParser. ServiceIntentInfo |
继承PackageParser.IntentInfo, 包含PackageParser. Service实例 |
PackageParser. ProviderIntentInfo |
继承PackageParser.IntentInfo, 包含PackageParser. Provider实例 |
RegisteredServicesCache<V> |
com.android.internal.content
类名 |
说明 |
PackageMonitor |
处理PackageManager广播通知,转换为调用派生类的抽象方法 |
NativeLibraryHelper |
处理APK的本地库 |
NativeLibraryHelper. ApkHandle |
代表JNI层打开的APK |
com.android.server.pm
类型说明:
说明 |
|
PackageSignatures |
应用包含的多个签名Signature,多个应用可能包含同一个签名 |
PackageKeySetData |
应用包含的多个签名集KeySet,有签名的(Signing)和定义的(Defined)的KeySet,Defined的KeySet有名称(Alias) |
GrantedPermissions |
PackageSettingBase和SharedUserSetting的公共基类 |
PackageSettingBase |
描述一个应用的信息:Signatures、KeySet、UserState,以及原始应用的引用 继承GrantedPermissions |
PackageSetting |
继承PackageSettingBase,增加解析出来的元数据和共享信息SharedUserSetting |
PendingPackage |
继承PackageSettingBase,增加sharedId成员 |
SharedUserSetting |
应用共享信息,包含共享的的应用PackageSetting和一个独立的签名信息PackageSignatures 继承GrantedPermissions,pkgFlags是所有应用的或 |
BasePermission |
应用自定义的权限,内部包含解析出来的权限数据 |
Settings |
组织所有应用以及相关信息 |
KeySetManager |
首先给PublicKey编号ID,存储在mPublicKeys中,PublicKey集合(Set<KeySet>)转换为ID集合,对这个集合再次编号,存储在mKeySetMapping中,同时对外返回类似句柄的KeySet。大部分的处理与应用的KeySet(PackageKeySetData)相关。 |
UserManagerService |
管理用户信息,用户限制(Bundle,以DISALLOW_*为Key) |
UserManagerService. RestrictionsPinState |
用户密码和用户登陆时间记录 |
IntentResolver<F, R> |
F继承IntentFilter,R一般就是ResolveInfo |
PackageManagerService |
|
PackageManagerService.ActivityIntentResolver |
继承IntentResolver<PackageParser.ProviderIntentInfo, ResolveInfo>,用于检索Activity和Receiver。 |
PackageManagerService.ServiceIntentResolver |
|
PackageManagerService.ProviderIntentResolver |
|
PackageManagerService.SharedLibraryEntry |
共享库信息,包含path、apk成员 |
Installer |
通过UNIX域套接字与installd交互 |
用户信息存放结构:
- /data/(android_data_dir,ENV:ANDROID_DATA)
- system/
- users/
- userlist.xml
- 0.xml(UserInfo)
- 0/
- res_<package>.xml(应用限制)
- 10.xml
- users/
- secure/(SECURE_DATA_DIRECTORY,ENV: ANDROID_SECURE_DATA,当属性”persist.security.efs.enabled”为true时,否则父目录/data/)
- system/
Settings数据成员:
名称 |
类型 |
说明 |
mPackages |
HashMap<String, PackageSetting> |
应用名 -> 应用配置 |
mDisabledSysPackages |
HashMap<String, PackageSetting> |
应用名 -> 应用配置 |
mVerifierDeviceIdentity |
VerifierDeviceIdentity |
|
mPreferredActivities |
SparseArray<PreferredIntentResolver> |
|
mSharedUsers |
HashMap<String, SharedUserSetting> |
共享用户名 -> 共享信息 |
mUserIds |
ArrayList<Object> |
应用UID,范围10000~19999,用户ID -> Object,这个Object只是用来判断Uid是否被使用 |
mOtherUserIds |
SparseArray<Object> |
范围 < 10000,用户ID -> Object |
mPastSignatures |
ArrayList<Signature> |
|
mPermissions |
HashMap<String, BasePermission> |
权限名 -> 权限 |
mPermissionTrees |
HashMap<String, BasePermission> |
|
mPackagesToBeCleaned |
ArrayList<PackageCleanItem> |
|
mRenamedPackages |
HashMap<String, String> |
|
mPendingPackages |
ArrayList<PendingPackage> |
|
mKeySetManager |
KeySetManager |
Settings方法成员:
名称 |
类型 |
说明 |
addPackageSettingLPw |
void (PackageSetting, String, SharedUserSetting) |
加应用 添加到mPackages,关联sharedUser,更新appId |
insertPackageSettingLPw |
void (PackageSetting, PackageParser.Package) |
通过解析的Package添加应用 更新codePath、resourcePath、nativeLibraryPathString、versionCode、signatures、pkgFlags,更新sharedUser.signatures,addPackageSettingLPw |
getPackageLPw |
PackageSetting (String, PackageSetting) |
通过一系列配置以及origPackage添加应用 1、删除老的如果sharedUser改变 |
- addPackageLPw()
- 根据name查找mPackages,如果已经存在
- 如果uid一样,返回现有的PackageSetting
- 否则返回null
- 否则不存在
- 创建新的,addUserIdLPw,插入mPackages
- 根据name查找mPackages,如果已经存在
- getPackageLPw()
- 根据name获取已有的PackageSetting
- 如果找到
- 检查codePath是否一致,如果codePath不一致,使用新的设置。
- 检查sharedUser是否一致,如果不一致,认为没有找到。
- 如果没有找到(包括sharedUser不一致)
- 如果origPackage,创建新的,从origPackage复制一部分属性
- 否则,创建新的
- 如果不是系统应用,并且allowInstall ,setUserState、writePackageRestrictionsLPr
- 如果sharedUser不为空,用其uid作为应用id
- 否则
- 如果有停用的同名系统应用,从其复制一部分属性
- 否则申请一个新的uid作为应用id
- 如果add,addPackageSettingLPw
- 否则找到了
- 如果installUser并且allowInstall,setInstalled,writePackageRestrictionsLPr
- writePackageRestrictionsLPr(userId)
- 写UserState到磁盘文件
- 目标文件/data/system/users/userId/package-restrictions.xml
- 临时备份文件/data/system/users/userId/package-restrictions-backup.xml
- insertPackageSettingLPw(p, pkg)
- 用pkg里面的属性填充PackageSetting
- addPackageSettingLPw(p, name, sharedUser)
- 插入到mPackages
- 如果sharedUser不为空
- sharedUser与原有的不一样
- 从原有的sharedUser删除p
- 增加p到sharedUser,赋值p的sharedUser和appi、Id
- sharedUser与原有的不一样
- isEnabledLPr(componentInfo, flags, userId)
- GET_DISABLED_UNTIL_USED_COMPONENTS && COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
- COMPONENT_ENABLED_STATE_DISABLED || COMPONENT_ENABLED_STATE_DISABLED_USER || COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED || (COMPONENT_ENABLED_STATE_DEFAULT && ! packageSettings.pkg.applicationInfo.enabled)
- enabledComponents
- disabledComponents
- componentInfo.enabled