Android应用程序安装位置

之所以写这篇文章,是因为原来开发的一项目,被一位老奶奶说安装包太大,她的内存空间不够。明明只有10几兆,她就是不愿意装进内部存储里面。没办法,只好解决一下。百度了一番,看到博客上很多都说在 文件中添加android:installLocation=”auto”属性。然后我就兴冲冲的加上去了。问题也解决了。
原来看官网的不多,后来看了官网的api讲解,发现原来很多博客是误解。我翻译了一下官网的英文,只希望不给更多人带来误解。

一、英文官网地址

App Install Location
英文比较好的可自行上官网查看,英文差一点的,可以借助翻译工具查看。如果不想看英文的,想更快的可以看我的翻译。当然我也是借助工具翻译的。

二、翻译

应用程序安装位置

从API Level 8开始,您可以允许将应用程序安装在外部存储设备(例如设备的SD卡)上。 这是一个可选功能,您可以使用android:installLocation清单属性为您的应用程序声明。 如果不声明此属性,则应用程序将仅安装在内部存储上,并且无法移动到外部存储。

要允许系统在外部存储上安装您的应用程序,请修改您的清单文件,以在元素中包含android:installLocation属性,值为“preferExternal”或“auto”。 例如:
这里写图片描述
如果声明“preferExternal”,请求您的应用程序安装在外部存储上,但系统不保证您的应用程序将安装在外部存储上。 如果外部存储器已满,系统会将其安装在内部存储器上。 用户还可以在两个位置之间移动应用程序。

如果声明为“auto”,则表示您的应用程序可能安装在外部存储设备上,但您没有安装位置的首选项。 系统将根据几个因素决定在哪里安装您的应用程序。 用户还可以在两个位置之间移动应用程序。

当您的应用程序安装在外部存储设备上时:

只要外部存储器安装在设备上,对应用程序性能没有影响。
.apk文件保存在外部存储上,但所有私有用户数据,数据库,优化的.dex文件和提取的本地代码都保存在内部设备内存中。
存储应用程序的唯一容器使用随机生成的密钥加密,只能由最初安装它的设备解密。 因此,安装在SD卡上的应用程序仅适用于一个设备。
用户可以通过系统设置将应用程序移动到内部存储。

警告:当用户启用USB大容量存储与计算机共享文件或通过系统设置卸载SD卡时,外部存储将从设备中卸载,并且外部存储上运行的所有应用程序将立即被终止。

向后兼容性

您的应用程序在外部存储上安装的功能是仅在运行API Level 8(Android 2.2)或更高版本的设备上可用的功能。在API级别8之前构建的现有应用程序将始终安装在内部存储上,并且无法移动到外部存储(即使在具有API级别8的设备上)。但是,如果您的应用程序旨在支持低于8的API级别,则可以选择为API级别8或更高版本的设备支持此功能,并仍然与使用低于8的API级别的设备兼容。

扫描二维码关注公众号,回复: 1502757 查看本文章

允许在外部存储上安装,并保持与低于API级别8的版本兼容:

1.在元素中包含值为“auto”或“preferEternal”的android:installLocation属性。
2.将android:minSdkVersion属性保留为原样(小于“8”),并确保您的应用程序代码仅使用与该级别兼容的API。
3.为了编译您的应用程序,将您的构建目标更改为API级别8.这是必要的,因为较旧的Android库不理解android:installLocation属性,并且不会在应用程序存在时编译它。

当应用程序安装在API级别低于8的设备上时,将忽略android:installLocation属性,并将应用程序安装在内部存储上。

警告:虽然旧的平台会忽略此类XML标记,但是您的minSdkVersion小于“8”时,必须注意不要使用API Level 8中引入的编程API,除非您执行必要的工作来提供向后兼容性 你的代码。

不应在外部存储上安装的应用程序

当用户启用USB大容量存储器与其计算机共享文件(或以其他方式卸载或删除外部存储器)时,安装在外部存储器上并且当前运行的任何应用程序将被终止。 系统有效地不知道应用程序,直到大容量存储器被禁用,并且外部存储器被重新安装在设备上。 除了杀死应用程序并使其不可用于用户之外,这可以以更严重的方式破坏一些类型的应用程序。 为了使您的应用程序始终如预期般运行,如果使用以下任何功能,则不应允许您的应用程序安装在外部存储上,原因是卸载外部存储设备时引发的后果:

服务
您的正在运行的服务将被终止,并且在重新安装外部存储时不会重新启动。 但是,您可以注册ACTION_EXTERNAL_APPLICATIONS_AVAILABLE广播Intent,这将在安装在外部存储上的应用程序再次可用于系统时通知您的应用程序。 此时,您可以重新启动服务。

报警服务
您在AlarmManager中注册的报警将被取消。 重新安装外部存储器时,必须手动重新注册任何报警。

输入法引擎
您的IME将替换为默认的IME。 重新安装外部存储设备时,用户可以打开系统设置以再次启用IME。

动态壁纸
您运行的动态壁纸将替换为默认动态壁纸。 重新安装外部存储设备时,用户可以再次选择您的动态壁纸。

应用程序小部件
您的应用程序小部件将从主屏幕中删除。 重新安装外部存储时,在系统重置主应用程序(通常直到系统重新启动)之前,您的应用程序窗口小部件将不可供用户选择。

账户管理
使用AccountManager创建的帐户将消失,直到重新装载外部存储设备。

同步适配器
您的AbstractThreadedSyncAdapter及其所有同步功能将无法工作,直到重新安装外部存储。

设备管理员
您的DeviceAdminReceiver及其所有管理功能将被禁用,这可能会对设备功能造成不可预见的后果,在重新安装外部存储设备后,这些功能可能会持续。

广播接收者接收“启动完成”广播
系统在外部存储器安装到设备之前传送ACTION_BOOT_COMPLETED广播。 如果您的应用程序安装在外部存储设备上,它将永远不会接收此广播。

如果您的应用程序使用上面列出的任何功能,您不应该允许您的应用程序安装在外部存储设备上。 默认情况下,系统不会允许您的应用程序安装在外部存储上,因此您不需要担心现有的应用程序。 然而,如果你确定你的应用程序永远不应该安装在外部存储,那么你应该通过声明android:installLocation值为“internalOnly”清楚。 虽然这不会更改默认行为,但它明确声明您的应用程序只应安装在内部存储上,并作为提醒您和其他开发人员的此决定。

应在外部存储上安装的应用程序
简单来说,没有使用上一节中列出的功能的任何东西在安装在外部存储上时是安全的。 大型游戏通常是应该允许在外部存储上安装的应用程序类型,因为游戏在非活动时通常不提供附加服务。 当外部存储器变得不可用并且游戏过程被杀死时,当存储器再次变得可用并且用户重新开始游戏时(假设游戏在正常的活动生命周期期间正确地保存其状态),应当没有可见的效果。

如果您的应用程序需要几个兆字节的APK文件,您应该仔细考虑是否启用该应用程序安装在外部存储上,以便用户可以保留其内部存储空间。

三、要点解释

看完翻译后,是不是感觉明朗很多。再次回到我原来开发时那个问题,直接选择了auto,这样是不对的,这也是很多博客中写的比较误解的地方。

auto是可能安装在外部存储设备上,没有首选项,系统根据几个因素选择安装位置。

preferExternal有优先级,先安装外存,当外存不足时安装内部存储上。

还有就是不应安装在外部存储的注意事项,一定要注意。

谢谢观看,个人觉得官网是最好的学习资料,具有权威性,当大家看到博客存在疑惑时,请去官网寻找正确的答案。

猜你喜欢

转载自blog.csdn.net/u012489412/article/details/54341202
今日推荐