android 的包管理

#移动开发 #Android

1. 说明
包管理(Package manager)非常重要,它关系着软件包的安装,卸载,查看和使用,它是运行在后台的一个服务,名叫

PackageManagerService,包括对软件包的解包,验证,安装等

2. 系统软件包管理信息存储在哪
/data/system/packages.xml
通过它可以看到系统安装的所有软件包,以及软件包的信息

3. 包管理相关源码在哪
frameworks/base/services/java/com/android/server/PackageManagerService.java

4. 系统自带的软件能升级吗(即安装在系统分区 system 中的包,如电话,短信) 可以升级,如果升级 /system/app 目录中的包,PackageManagerServer.java 对此情况进行处理,被升级的包出现

package.xml 的 updated-package 字段中,新的包信息会写在 package 字段中,卸载新包后,原包会恢复到

package 字段中。启动时新的包会优先地被启动

5. 为什么安装软件时会报错

  1. 版本不匹配
    比如在 2.2 的 SDK 上编译的软件,不能在 1.6 上安装
    AndroidManifest.xml 中可以对版本所安装系统的版本进行指定

  2. 签名信息不匹配
    软件升级时会做签名信息对比,如果前后两个包签名不一致,则不能安装

  3. 包完整性不满足
    签名是对包中每个文件进行的,它的压缩格式是 zip,如果手工解包后替换了某文件再打包,被替换的文件与签名验证不一致,则不能安装

  4. 格式不对
    有些从网上下载的包可能打了多层压缩,比如又将 apk 打包成了 rar 格式,建议解压缩看一下格式再安装

6. 包的权限

  1. 软件在 AndroidMenifest.xml 中都会指明其需要的权限,安装包时图形界面也通常显示出它所需要的权限,供用户判断是否安装

  2. 特殊情况
    有些软件没有说明需要访问 SD 卡和打电话的权限,但安装后却出现此权限。 当使用旧的 SDK 所做的包向新的 SDK 安装时,可能出现这种情况,见

framework/base/core/java/android/content/pm/PackageParser.java 中的

NEW_PERMISSION,此处判断编译使用的 SDK 版本是否在 android1.6 之前 (DONUT)

,如果在之前就加入这两个权限。

(转载请注明出处: http://xy0811.spaces.live.com)