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交互

        用户信息存放结构:

  1. /data/(android_data_dir,ENV:ANDROID_DATA)
    1. system/
      1. users/
        1. userlist.xml
        2. 0.xml(UserInfo)
        3. 0/
          1. res_<package>.xml(应用限制)
        4. 10.xml
    2. secure/(SECURE_DATA_DIRECTORY,ENV: ANDROID_SECURE_DATA,当属性”persist.security.efs.enabled”为true时,否则父目录/data/)

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改变

  1. addPackageLPw()
    1. 根据name查找mPackages,如果已经存在
      1. 如果uid一样,返回现有的PackageSetting
      2. 否则返回null
    2. 否则不存在
      1. 创建新的,addUserIdLPw,插入mPackages
  2. getPackageLPw()
    1. 根据name获取已有的PackageSetting
    2. 如果找到
      1. 检查codePath是否一致,如果codePath不一致,使用新的设置。
      2. 检查sharedUser是否一致,如果不一致,认为没有找到。
    3. 如果没有找到(包括sharedUser不一致)
      1. 如果origPackage,创建新的,从origPackage复制一部分属性
      2. 否则,创建新的
        1. 如果不是系统应用,并且allowInstall ,setUserState、writePackageRestrictionsLPr
      3. 如果sharedUser不为空,用其uid作为应用id
      4. 否则
        1. 如果有停用的同名系统应用,从其复制一部分属性
        2. 否则申请一个新的uid作为应用id
      5. 如果add,addPackageSettingLPw
    4. 否则找到了
      1. 如果installUser并且allowInstall,setInstalled,writePackageRestrictionsLPr
  3. writePackageRestrictionsLPr(userId)
    1. 写UserState到磁盘文件
    2. 目标文件/data/system/users/userId/package-restrictions.xml
    3. 临时备份文件/data/system/users/userId/package-restrictions-backup.xml
  4. insertPackageSettingLPw(p, pkg)
    1. 用pkg里面的属性填充PackageSetting
  5. addPackageSettingLPw(p, name, sharedUser)
    1. 插入到mPackages
    2. 如果sharedUser不为空
      1. sharedUser与原有的不一样
        1. 从原有的sharedUser删除p
      2. 增加p到sharedUser,赋值p的sharedUser和appi、Id
  6. isEnabledLPr(componentInfo, flags, userId)
    1. GET_DISABLED_UNTIL_USED_COMPONENTS && COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
    2. COMPONENT_ENABLED_STATE_DISABLED || COMPONENT_ENABLED_STATE_DISABLED_USER || COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED || (COMPONENT_ENABLED_STATE_DEFAULT && ! packageSettings.pkg.applicationInfo.enabled)
    3. enabledComponents
    4. disabledComponents
    5. componentInfo.enabled
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值