Android PackageManager概览

 


1. 应用程序层
    调用ContextImpl类的getPackageManager()函数返回一个PackageManager对象,通过该对象调用各种API接口。
    getPackageManager()函数和getSystemService()的过程基本相似,都是从ServiceManager获得指定名称的Ibinder对象,此处名称是"package"——getSystemService("package")。

2. PackageManagerService服务层
    包管理服务运行于SystemServer进程中。
    PackageManagerService使用两个目录下的xml文件保存相关包管理信息
    (1) /system/etc/permissions 目录下
        ① 定义系统中包含了哪些feature。App 在AndroidManifest.xml文件中使用<use-feature>标签声明需要哪些feature。
            <use-feature android:name="android.hardwate.wifi" android:required="true" />    
        ②platform.xml文件。为一些特别的uid和gid分配一些默认的权限        
            a. 给gid分配权限使用<permission>标签    
            <permission name="android.permission.BLUETOOTH_ADMIN" >    
                <group gid="net_bt_admin" />
            </permission>    
            b. 给uid分配权限使用<assign-permission>标签
            <!-- Standard permissions granted to the shell. -->    
            <assign-permission name="android.permission.WRITE_EXTERNAL_STORAGE" uid="shell" />
           


    (2) /data/system/packages.xml,包含App的包名称,安装包路径,使用了哪些系统权限
        总权限声明        
        <packages>        
        <last-platform-version internal="17" external="17" />
        <permission-trees />        
        <permissions>        
            <item name="com.sec.android.app.gallery3d.READ_PICASA" package="com.sec.android.gallery3d" />    
            <item name="com.sec.android.app.gallery3d.WRITE_PICASA" package="com.sec.android.gallery3d" />    
            <item name="com.sec.android.app.gallery3d.WRITE_STROKEDB" package="com.sec.android.gallery3d" />    
            <item name="com.sec.android.app.gallery3d.WRITE_SNS" package="com.sec.android.gallery3d" />    
            <item name="com.sec.android.app.gallery3d.READ_SNS" package="com.sec.android.gallery3d" />    
        </permissions>

        每个package的信息。每个package中还可以使用<perms>声明权限
        <package         
            name="com.sec.android.gallery3d"     
            codePath="/system/app/SecGallery2013.apk"     
            nativeLibraryPath="/data/app-lib/SecGallery2013"     
            flags="1621061"     
            ft="143fbeddf38"     
            it="143fbeddf38"     
            ut="143fbeddf38"     
            version="17"     
            userId="10088">    
            <sigs count="1">    
                <cert index="3" key="308204a830820390a003020102020900936eacbe07f201df300d06092a864886f70d0101050500308194310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e20566965773110300e060355040a1307416e64726f69643110300e060355040b1307416e64726f69643110300e06035504031307416e64726f69643122302006092a864886f70d0109011613616e64726f696440616e64726f69642e636f6d301e170d3038303232393031333334365a170d3335303731373031333334365a308194310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e20566965773110300e060355040a1307416e64726f69643110300e060355040b1307416e64726f69643110300e06035504031307416e64726f69643122302006092a864886f70d0109011613616e64726f696440616e64726f69642e636f6d30820120300d06092a864886f70d01010105000382010d00308201080282010100d6931904dec60b24b1edc762e0d9d8253e3ecd6ceb1de2ff068ca8e8bca8cd6bd3786ea70aa76ce60ebb0f993559ffd93e77a943e7e83d4b64b8e4fea2d3e656f1e267a81bbfb230b578c20443be4c7218b846f5211586f038a14e89c2be387f8ebecf8fcac3da1ee330c9ea93d0a7c3dc4af350220d50080732e0809717ee6a053359e6a694ec2cb3f284a0a466c87a94d83b31093a67372e2f6412c06e6d42f15818dffe0381cc0cd444da6cddc3b82458194801b32564134fbfde98c9287748dbf5676a540d8154c8bbca07b9e247553311c46b9af76fdeeccc8e69e7c8a2d08e782620943f99727d3c04fe72991d99df9bae38a0b2177fa31d5b6afee91f020103a381fc3081f9301d0603551d0e04160414485900563d272c46ae118605a47419ac09ca8c113081c90603551d230481c13081be8014485900563d272c46ae118605a47419ac09ca8c11a1819aa48197308194310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e20566965773110300e060355040a1307416e64726f69643110300e060355040b1307416e64726f69643110300e06035504031307416e64726f69643122302006092a864886f70d0109011613616e64726f696440616e64726f69642e636f6d820900936eacbe07f201df300c0603551d13040530030101ff300d06092a864886f70d010105050003820101007aaf968ceb50c441055118d0daabaf015b8a765a27a715a2c2b44f221415ffdace03095abfa42df70708726c2069e5c36eddae0400be29452c084bc27eb6a17eac9dbe182c204eb15311f455d824b656dbe4dc2240912d7586fe88951d01a8feb5ae5a4260535df83431052422468c36e22c2a5ef994d61dd7306ae4c9f6951ba3c12f1d1914ddc61f1a62da2df827f603fea5603b2c540dbd7c019c36bab29a4271c117df523cdbc5f3817a49e0efa60cbd7f74177e7a4f193d43f4220772666e4c4d83e1bd5a86087cf34f2dec21e245ca6c2bb016e683638050d2c430eea7c26a1c49d3760a58ab7f1a82cc938b4831384324bd0401fa12163a50570e684d" />
            </sigs>    
        </package>

    除了Pms外,还有两个辅助服务用于程序安装
        ① DefaultContainerService,主要把安装程序复制到程序目录中
        ② Installer服务,不是Binder,是Socket客户端,Pms直接和该Socket客户端交互。Socket服务端负责 解压工作和数据目录的创建。
            例如从APK中提取出dex文件,删除dalvik-cache下的dex文件,创建程序专属数据目录等。

3. 数据文件层
    (1) 程序文件
        ① 系统App保存在/system/app目录下
        ② 第三方App保存在/data/app目录下
            安装前,可以任意命名,保存在任意的地方;安装后,PmS会把apk文件放在 /data/app目录下,文件名称以包名命名,并自动追加一个“-x”的后缀
           
            第二次安装时,数字1会变成2,第三次安装,2变成1,像乒乓机制。
        ③ /data/dalvik-cache目录中保存了程序中的执行代码。
           

           
            apk实际上是一个jar压缩类型的文件,压缩包中包含了各种资源文件,资源索引文件,AndroidManifest文件及程序文件
            应用程序运行前,PmS从apk中提取出代码文件(即dex文件,存在该目录下,以便快速运行)

    (2)framework库文件
        这些库文件存在于/system/framework目录下,类型是apk或者jar
        系统开机后,dalvik虚拟机加载这些库文件
        在PmS启动时,如果这些jar或者apk还没有被转化为dex文件,PmS会将这些库文件转化为dex文件,并保存在/data/dalvik-cache目录下

    (3)App使用的数据文件
        ① 保存方式, App可以 参数存储、数据库存储、文件存储
        ② 存储目录, 一般保存在/data/data/xxx目录下, xxx是包名。
           

        ③ 除了/data/data目录外,系统还提供了三个额外的目录
            a. /data/secure 保存加密数据。Framework会提供一种加密的类接口,所有的加密文件都将存放到该目录下。
            b. /data/drm 存放 包含数字版权的数据文件。Framework会提供Drm相关类接口,用于间接访问该目录中的文件
            c. /data/app-private, 与/data/drm作用相同。Framework可能没有使用/data/drm,而是使用/data/app-private代替

 

posted @ 2015-10-14 14:57  carlo-z  阅读(1093)  评论(0编辑  收藏  举报