android的包管理
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. 为什么安装软件时会报错
版本不匹配
比如在 2.2 的 SDK 上编译的软件,不能在 1.6 上安装
AndroidManifest.xml 中可以对版本所安装系统的版本进行指定签名信息不匹配
软件升级时会做签名信息对比,如果前后两个包签名不一致,则不能安装包完整性不满足
签名是对包中每个文件进行的,它的压缩格式是 zip,如果手工解包后替换了某文件再打包,被替换的文件与签名验证不一致,则不能安装格式不对
有些从网上下载的包可能打了多层压缩,比如又将 apk 打包成了 rar 格式,建议解压缩看一下格式再安装
6. 包的权限
软件在 AndroidMenifest.xml 中都会指明其需要的权限,安装包时图形界面也通常显示出它所需要的权限,供用户判断是否安装
特殊情况
有些软件没有说明需要访问 SD 卡和打电话的权限,但安装后却出现此权限。 当使用旧的 SDK 所做的包向新的 SDK 安装时,可能出现这种情况,见
framework/base/core/java/android/content/pm/PackageParser.java 中的
NEW_PERMISSION,此处判断编译使用的 SDK 版本是否在 android1.6 之前 (DONUT)
,如果在之前就加入这两个权限。
(转载请注明出处: http://xy0811.spaces.live.com)