因为工作原因,分析了一下2.3的package install的代码,整理了一下关于安装位置选择的流程

安装位置判定的代码主要位于PackageManagerService.java的handleStartCopy()中,代码分析就不再说了

这里只说下选择规则:

安装位置的选择主要有三个方面决定:

1.adb install命令


adb install [-l] [-r] [-s] <file>


概述: 将apk文件拷贝到设备并安装。 选项参数:

  • -l 表示forward-lock the app,这个必须安装到手机内存
  • -r 重新安装,保持程序数据
  • -s 安装到外部存储

2.在APK包中设置



在Android文档的App Install Location里面提到: 自API Level 8开始,可以允许应用安装至扩展存储(例如,SD卡)。这是一个可选功能,可以在应用的manifest属性的 android:installLocation里设定。如果没有设定这个属性,那么应用将被安装到内置存储,而且将不允许移动到扩展存储上。 为了允许系统可以在扩展存储上安装的你的应用,需要修改manifest文件,在 <manifest> 元素中包含android:installLocation 属性,设置其值为”preferExternal” 或 “auto”。

  • 如果定义了 “preferExternal”,意味着要求应用安装至扩展存储,但是系统不能保证应用肯定要安装至扩展存储。如果扩展存储没有空间了,系统将把应用安装到内置存储。用户可以在两个位置之间移动该应用。
  • 如果定义 “auto”,系统会判定很多因素,如果相同的情况下,手机内存安装是优先的。用户同样可以将应用在两个位置之间移动。
  • 如果定义 “internalOnly”,表示应用被指定安装在内部存储上,用户不可以将应用移动到外部存储上。

3.系统“设置”菜单   

有的android2.3手机在 设置->应用程序中有安装位置选择项,有三个选项

  • 自动选择
  • 外部存储优先
  • 只安装手机上

一般可能都会认为这三项是综合考虑的,实际上这三者只有一项起作用,三者的优先级是由高到低,高优先级的项一旦被定义,就不再考虑低优先级的。三者都没定义的话,会优先安装到手机上。