Android 框架实现分析 - 应用 - Jave层
作者:互联网
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
标签:Jave,PackageParser,框架,继承,信息,sharedUser,应用,Android,PackageSetting 来源: https://blog.csdn.net/luansxx/article/details/121009870