Android开发者指南(7) —— App Install Location

前言html

  本章内容为开发者指南(Dev Guide)/Developing/Appendix/App Install Location,版本为Android3.0 r1,翻译来自"madgoat",欢迎访问它的博客:"http://madgoat.cn",再次感谢"madgoat" !期待你一块儿参与翻译Android的相关资料,联系我over140@gmail.com。
 android

 

声明数据库

  欢迎转载,但请保留文章原始出处:)
 编程

   农民伯伯:http://over140.blog.51cto.com/安全

    Android中文翻译组:http://goo.gl/6vJQlapp

 

原文

  http://developer.android.com/guide/appendix/install-location.htmlide

 

正文
 性能

 

    自API Level 8开始,你能够容许你的应用安装至扩展存储(例如,SD卡)。这是一个可选功能,你能够在你应用的manifest属性android:installLocation里设定。若是你没设定这个属性,那么你的应用将被安装到内置存储,并且将不容许移动到扩展存储上。优化

         为了容许系统能够在扩展存储上安装你的应用,修改你的manifest文件,在 <manifest> 元素中包含android:installLocation 属性,设置其值为"preferExternal""auto"。例如:ui

               <manifest xmlns:android=http://schemas.android.com/apk/res/android

android:installLocation="preferExternal"

    ... >

         若是你定义了 "preferExternal",意味着你要求你的应用安装至扩展存储,可是系统不能保证应用确定会安装至扩展存储。若是扩展存储没有空间了,系统将把应用安装到内置存储。用户能够在两个位置之间移动你的应用。

         若是你定义了 "auto",表示你的应用可能会安装在扩展存储,可是对安装位置没有特别的偏好。系统将基于不少因素决定你的应用安装到哪里。用户一样能够将应用在两个位置之间移动。

         当你的应用安装在扩展存储上:

 * 只要扩展存储已经挂载在设备上,对应用的性能都没有影响。

 * .apk 文件保存在扩展存储上,可是全部的用户私有数据,数据库,优化过的 .dex 文件和释放的原生代码都保存在内置存储空间上。

 * 存储你应用的惟一容器是被一个随机生成的KEY加密存放的,仅仅能被最初安装的设备进行解密操做。所以,安装在SD卡上的应用仅仅针对一个设备能够工做。

 * 用户能够经过系统设置移动你的应用到内置存储。

警告:当用户启用USB大容量存储以共享文件给计算机或者经过系统设置卸载SD卡,外置存储从设备卸载而且全部运行在外置存储的应用马上都被结束。

        

向后兼容Backward Compatibility

         将你的应用安装至扩展存储的功能是运行API Level 8Android 2.2)及以上版本的设备才有效的。使用API Level 8 以前的版本编译的已存在的应用,将一直安装在内置存储,而且没法移动至扩展存储(即便设备上运行的是API Level 8版本的系统)。然而,若是你的应用计划支持低于8API Level,你能够选择针对API Level 8及更高版本支持此特性,而且继续保持与低于API level 8的设备兼容。

         为了容许安装在扩展存储而且保持与API Level 8或更低版本兼容:

 * <manifest>元素中,包含值为"auto" "preferExternal" android:installLocation 属性。

 * 继续保持你的 android:minSdkVersion 属性不变(小于8的值)而且肯定你的应用代码只使用与此level保持兼容的API

 * 为了编译你的应用,更改你的build targetAPI Level 8。这步操做是必须的,由于旧的Android库没法理解 android:installLocation 属性,而且当该属性存在时,也不会编译你的应用。

         当你的应用安装到API Level 低于8的设备上时, android:installLocation 属性被忽略,而且应用会被安装至内置存储上。

         注意:尽管XML标记,例如这个将被以前的平台忽略,但你仍是要当心不要使用API Level 8中的编程API,除非你在你的代码中提供向后兼容。关于在应用代码中建立向后兼容的信息,请参考 Backward Compatibility 这篇文章。

        

不该当安装在扩展存储的应用

Applications That Should NOT Install on External Storage

当用户启用USB大容量存储来给他们的计算机共享文件时(卸载或移除扩展存储),任何安装在扩展存储上并正在运行的应用都会被结束。实际上此时系统并不知道应用程序的存在,直到大容量存储关闭,或者扩展存储从新挂载到设备上。除了杀死该应用程序使它对用户不可用,它还会使用更严重地方式中断某些类型的应用程序。为了使你的应用始终如你所指望的那样运行,当你使用了下面任何一种特性,那你就不该当容许你的应用安装到扩展存储上去,以免产生当扩展存储被卸载时所致使的后果:

服务Services

当扩展存储被卸载时,你正在运行的Service将被结束而且不会再从新启动。你能够注册 ACTION_EXTERNAL_APPLICATIONS_AVAILABLE 广播(broadcast) Intent,当安装在扩展存储上的应用对系统从新有效时,会通知你的应用。在那个时候,你能够从新启动你的Service

定时服务Alarm Services

你注册到 AlarmManager的闹钟会被取消。当扩展存储从新挂载时,你必须手工从新注册。

输入法引擎Input Method Engines

你的输入法(IME)将被替换为默认输入法。当扩展存储从新挂载,用户能够打开系统设置以从新启用你的输入法。

壁纸Live Wallpapers

你正在运行的 Live Wallpaper 会被替换为默认的。当扩展存储被挂载时,用户能够从新选择Live Wallpaper

Live Folders

你的 Live Folder 将被从home屏幕被移除。当扩展存储被挂载上时,用户能够从新添加Live FolderHome界面。

应用程序部件App Widgets

你的App Widget将被从Home界面移除,当扩展存储被挂载时,在系统重置Home应用以前,用户将没法使用你的App Widget(一般直到系统重启)。

Account Managers

在扩展存储被挂载以前,你使用 AccountManager建立的帐户都是不可见的。

Sync Adapters

在扩展存储被挂载以前,你的 AbstractThreadedSyncAdapter和全部相关的同步功能将没法工做。

Device Administrators

你的 DeviceAdminReceiver和它的管理能力会被禁止,这会致使设备功能产生没法预料的结果,这种现象会持续到扩展存储从新挂载为止。

Broadcast Receivers listening for "boot completed"

T系统在扩展存储挂载到设备前发送广播 ACTION_BOOT_COMPLETED。因此若是你的应用安装到扩展存储上,它拥有也接收不到这个广播。

若是你的应用使用的上面列表中的任何一种特性,那你就不该该容许你的应用安装到扩展存储上去。默认状况下,系统将不容许你的应用安装至扩展存储,因此你不须要担忧你已存在的应用。然而,若是你不肯定你的应用是否永远不会安装到扩展存储上去,那么你能够经过定义 android:installLocation 值为 "internalOnly"来确保其安装至内置存储。尽管这不会改变默认的行为,但它明确的指出,你的应用只会被安装在内置存储上而且做为提醒你和其余开发人员已经作出决定。

 

应当安装在扩展存储的应用

Applications That Should Install on External Storage

简单来讲,任何没有使用上一章节功能列表中的应用安装在扩展存储上都是安全的。大型的游戏更是常见的应该容许安装至扩展存储的应用类型,由于游戏当处于非激活状态时,一般不须要提供额外的服务。当扩展存储无效后,游戏进程被结束,这并不会带来明显的影响,当存储从新有效后,用户能够从新启动游戏 (假设游戏在正常的 Activity lifecycle中保存了状态)。

若是你的应用的APK文件大小为几兆(M),那你就须要认真考虑是否启用应用安装至扩展存储了,这样的话用户能够保留他们的内置存储空间。

相关文章
相关标签/搜索