Android应用程序包扫描过程源码分析
在Android服务之PackageManagerService启动源码分析中介绍了PackageManagerService服务的整个启动过程,启动过程相对来说较为简单,就是构造一个PackageManagerService对象,然后注册到ServiceManager进程中,只是PackageManagerService对象的构造过程比较复杂,任务比较繁重,在前面介绍PackageManagerService构造过程中,介绍到PackageManagerService会扫描系统指定目录下的Apk文件,本文就结合源代码详细介绍PackageManagerService对Apk的整个扫描过程。
Package用于描述一个Apk的信息,一个Apk应用程序可能包括一系列的Activity,Service,Provider等组件,在Package中同样定义了对应的数据结构来保存这些组件信息。
这里不在沾上整个解析过程的源代码,只介绍解析过程使用的方法及数据结构。在
frameworks/base/core/res/res/values/attrs_manifest.xml文件中定义了AndroidManifest文件中的各个标签或属性
通过遍历AndroidManifest文件,并匹配对应的标签来读取指定标签的属性值,各个标签属性读取方式如下:
最后根据属性名称从TypedArray中读取对应属性值,各个标签下的属性名称在frameworks/base/core/res/res/values/attrs_manifest.xml文件已经定义。下表为各个标签对应的解析函数:
application
parseApplication()
activity
parseActivity()
intent-filter
parseIntent()
meta-data
parseMetaData()
receiver
parseActivity()
service
parseService()
provider
parseProvider()
activity-alias
parseActivityAlias()
meta-data
parseMetaData()
uses-library
parseApplication()
uses-package
parseApplication()
permission-group
parsePermissionGroup()
permission
parsePermission()
permission-tree
parsePermissionTree()
uses-permission
parsePackage()
uses-configuration
parsePackage()
uses-feature
parsePackage()
uses-sdk
parsePackage()
supports-screens
parsePackage()
protected-broadcast
parsePackage()
instrumentation
parseInstrumentation()
original-package
parsePackage()
adopt-permissions
parsePackage()
uses-gl-texture
parsePackage()
compatible-screens
parsePackage()
eat-comment
parsePackage()
在Package类中为每个标签定义了对应的数据结构来保存数据信息,解析XML的目的就是读取AndroidManifest文件中的内容到Package对象中。Package成员
定义的属性
XML中的标签
mVersionCode
AndroidManifest
versionCode
versionName
sharedUserId
sharedUserLabel
installLocation
manifest
mVersionName
mSharedUserId
mSharedUserLabel
installLocation
applicationInfo
AndroidManifestApplication
application
创建PermissionGroup对象并将信息保存该对象的成员Info中,同时将创建的PermissionGroup对象添加到permissionGroups中
AndroidManifestPermissionGroup
permission-group
创建Permission对象并将信息保存该对象的成员Info中,同时将创建的Permission对象添加到permissions中
AndroidManifestPermission
permission
创建Permission对象并将信息保存该对象的成员Info中,同时将创建的Permission对象添加到permissions中
AndroidManifestPermissionTree
permission-tree
requestedPermissions 保存权限名称
AndroidManifestUsesPermission
uses-permission
requestedPermissionsRequired
创建ConfigurationInfo对象,并将信息保存到该对象中,同时将该对象添加到configPreferences中
AndroidManifestUsesConfiguration
uses-configuration
创建FeatureInfo对象,并将信息保存到该对象中,同时将该对象添加到reqFeatures中
AndroidManifestUsesFeature
uses-feature
applicationInfo.targetSdkVersion
AndroidManifestUsesSdk
uses-sdk
applicationInfo
AndroidManifestSupportsScreens
supports-screens
protectedBroadcasts
AndroidManifestProtectedBroadcast
protected-broadcast
instrumentation
AndroidManifestInstrumentation
instrumentation
mOriginalPackages
AndroidManifestOriginalPackage
original-package
mAdoptPermissions
AndroidManifestOriginalPackage
adopt-permissions
mAppMetaData
AndroidManifestMetaData
meta-data
usesLibraries
usesOptionalLibraries
AndroidManifestUsesLibrary
uses-library
activities
AndroidManifestActivityAlias
activity-alias
AndroidManifestActivity
activity
receivers
AndroidManifestActivity
receiver
services
AndroidManifestService
service
providers
provider


