源代码位置: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 |
源代码位于:framework/base/packages/DefaultContainerService。
android.content| 类名 | 说明 |
类型说明:
| 类名 | 说明 |
| Resources | |
| AssetManager | |
| Configuration | |
| CompatibilityInfo | |
| StringBlock | |
| XmlBlock |
类型说明:
| 类名 | 说明 |
| 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需要继承PackageParser.IntentInfo |
| PackageParser. Activity | 继承PackageParser.Component |
| PackageParser. Service | 继承PackageParser.Component |
| PackageParser. Provider | 继承PackageParser.Component |
| PackageParser. ActivityIntentInfo | 继承PackageParser.IntentInfo, 包含PackageParser.Activity实例 |
| PackageParser. ServiceIntentInfo | 继承PackageParser.IntentInfo, 包含PackageParser. Service实例 |
| PackageParser. ProviderIntentInfo | 继承PackageParser.IntentInfo, 包含PackageParser. Provider实例 |
| RegisteredServicesCache |
| 类名 | 说明 |
| PackageMonitor | 处理PackageManager广播通知,转换为调用派生类的抽象方法 |
| NativeLibraryHelper | 处理APK的本地库 |
| NativeLibraryHelper. ApkHandle | 代表JNI层打开的APK |
类型说明:
| 类名 | 说明 |
| 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 |
| UserManagerService | 管理用户信息,用户限制(Bundle,以DISALLOW_*为Key) |
| UserManagerService. RestrictionsPinState | 用户密码和用户登陆时间记录 |
| IntentResolver | F继承IntentFilter,R一般就是ResolveInfo |
| PackageManagerService | |
| PackageManagerService.ActivityIntentResolver | 继承IntentResolver |
| 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_
.xml(应用限制)
- res_
- 10.xml
- users/
- secure/(SECURE_DATA_DIRECTORY,ENV: ANDROID_SECURE_DATA,当属性”persist.security.efs.enabled”为true时,否则父目录/data/)
- system/
Settings数据成员:
| 名称 | 类型 | 说明 |
| mPackages | HashMap | 应用名 -> 应用配置 |
| mDisabledSysPackages | HashMap | 应用名 -> 应用配置 |
| mVerifierDeviceIdentity | VerifierDeviceIdentity | |
| mPreferredActivities | SparseArray | |
| mSharedUsers | HashMap | 共享用户名 -> 共享信息 |
| mUserIds | ArrayList | 应用UID,范围10000~19999,用户ID -> Object,这个Object只是用来判断Uid是否被使用 |
| mOtherUserIds | SparseArray | 范围 < 10000,用户ID -> Object |
| mPastSignatures | ArrayList | |
| mPermissions | HashMap | 权限名 -> 权限 |
| mPermissionTrees | HashMap | |
| mPackagesToBeCleaned | ArrayList | |
| mRenamedPackages | HashMap | |
| mPendingPackages | ArrayList | |
| 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



