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),如果在之前就加入这两个权限。