Android应用程序安装位置(App Install Location)

从API Level 8(Android 2.2)开始,你可以将你的应用程序安装到外部存储上(例如,设备的SD卡)。你可以在应用程序的manifest文件中声明android:installLocation属性来使用这个可选的功能。如果你没有声明这个属性,你的应用程序只能被安装在内部存储中,并且不能移动到外部存储上。

允许系统将你的应用程序安装到外部存储上,你需要修改你的manifest文件。在其中的<manifest>标签下,添加android:installLocation属性,并将值设置为“preferExternal”或者“auto”。例如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="preferExternal"
    ... >

如果你声明了“preferExternal”,这就表示请求系统将你的应用程序安装到外部存储中,但是系统不保证一定能将你的应用程序安装到外部存储上。如果外部存储空间已经满了,系统就会将应用程序安装到内部存储上。用户同样可以将你的应用程序在内部和外部存储之间移动。

如果你声明了“auto”,这表明你的应用程序可以安装到外部存储上,但是你没有指定首选的安装位置。系统会根据几个因素来决定将你的应用程序安装到什么位置。用户同样可以将你的应用程序在内部和外部存储之间移动。

当你的应用程序安装在外部存储上:

* 只要外部存储一直挂载在设备上,将应用程序安装在外部存储上对应用程序的性能没有任何影响。

* .apk文件会保存在外部存储上,但是所有用户的私有数据、数据库、优化过的.dex文件,还有附加的本地代码都会保存在内部的设备存储器上。

* 安装了你的应用程序的特定存储器会使用一个随机生成的key进行加密,这个key可以被原来安装这个应用程序的设备解密出来。因此,安装在SD卡上的应用程序只能在一台设备上运行。

* 用户可以用过系统设置将你的应用程序移动到内部存储上。

注意:当用户启用USD设备存储模式与计算机共享文件,或者通过系统设置卸载了SD卡,外部存储将会从设备上被卸载下来,并且所有运行在外部存储上的应用程序都会马上结束被杀死。

1、向后兼容性

只有运行API Level 8(Android 2.2)或者更高版本的设备才允许将你的应用程序安装到外部存储上。已经存在的应用程序,如果是用低于API Level 8版本所编译的,那么这些应用程序只能一直安装在内部存储上,不能移动到外部存储上(即使程序所安装的设备运行的是Android 2.2或以上的版本)。然而,如果你的应用程序必须支持低于API Level 8的版本,你仍然可以为运行API Level 8或者更高版本的设备提供这个功能,并且兼容低于API Level 8版本的设备。

为了允许应用程序安装到外部存储上,并且仍然兼容低于API Level 8的版本,你需要:

1.1 在manifest文件中的<manifest>标签中添加android:installLocation属性,并设置值为“auto”或者“preferExternal”。

1.2 继续保持你的android:minSdkVersion属性(低于版本8的值),并且确保你的应用程序的代码只使用了兼容这个版本的API。

1.3 为了能够编译你的应用程序,将你的android:targetSdkVersion修改为8或者更高的版本。这是必须的,因为旧的Android库不能识别android:installLocation这个属性,这会导致无法编译你的应用程序。

当你的应用程序安装到低于API Level 8版本的设备上,android:installLocation这个属性就会被忽略,应用程序会被安装到内部存储上。

警告:尽管像这样的XML标签在旧版本平台上会被忽略,但当你的minSdkVersion低于“8”时,你要小心不要在代码中使用API Level 8版本才提供的API,除非你进行必要的工作以保证你的代码能够向后兼容(进行版本判断后再执行高版本API等)。

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

当用户启用USB存储模式与他们的计算机共享文件(或者直接卸载和移除外部存储器),安装在外部存储上的应用程序会立即被杀死。系统会无法识别这些应用程序,直到USB存储模式关闭并且外部存储重新挂载到设备上。除了杀死应用程序和让用户无法使用这些应用程序之外,这也可能会造成一些类型的应用程序产生更严重的后果。为了保持你的应用程序始终按照预期运行,如果你的应用程序使用了下面列出的功能,你就不应该将应用程序安装在外部存储上,以避免外部存储被卸载的情况:

2.1 Services:你运行的Service会被杀死,并且在外部存储重新挂载后不会重新运行。当然,你也可以注册ACTION_EXTERNAL_APPLICATIONS_AVAILABLE类型的Intent广播,这将会在系统可以重新使用安装在外部存储上的应用程序时通知你的应用程序。接收到广播后,你可以重启的你的Service。

2.2 Alarm Services(闹钟/系统定时服务):你通过AlarmManager注册的闹钟会被取消。你必须在外部存储重新挂载之后手动再注册这些闹钟。

2.3 Input Method Engines(IME,输入法):你的输入法将会被默认的输入法代替。当外部存储重新挂载后,用户可以打开系统设置重新启用你的输入法。

2.4 Live Wallpapers(动态壁纸):你运行的动态壁纸将会被默认的动态壁纸替换。当外部存储重新挂载后,用户可以重新选择你的动态壁纸。

2.5 App Widget(窗口小部件):你的窗口小部件将会从home界面上被移除。当外部存储重新挂载后,你的窗口小部件对于用户同样不可使用,直到系统重置了home上面的应用程序(通常要等到系统重启)。

2.6 Account Manager(账号管理):使用AccountManager创建的账号会消失,知道外部存储重新挂载。

2.7 Sync Adapter(同步适配器):你的AbstractThreadedSyncAdapter和它的同步功能将会停止工作,直到外部存储重新挂载上。

2.8 Device Administrators(设备管理员):你的恶DeviceAdminReceive和它所有的管理权限都会被禁用,这对设备功能可能造成不可预见的后果,并且在外部存储重新挂载后可能还会持续下去。

2.9 监听“设备启动完成”的广播接收器:系统在外部存储挂载到设备上之前就会发布ACTION_BOOT_COMPLETED广播。如果你的应用程序安装在外部存储上,它将无法接收到这个广播。

如果你的应用程序使用上面列出的一些功能,你就不应该允许你的应用程序安装到外部存储上。默认情况下,系统不会允许你的应用程序安装到外部存储上,因此你不用担心你已经发布完成的应用程序。然而,如果你需要确保你的应用程序永远不会被安装到外部存储上,你可以清楚的声明android:installLocation属性,并赋值为“internalOnly”。尽管这不会改变默认的设置,但它可以明确你的应用程序只能安装在内部存储上,并提醒你自己或其他开发者这一个决定。

3、应该安装在外部存储上的应用程序

简单来说,任何没有使用前面所列举功能的应用程序安装到外部存储上都是安全的。大型游戏通常都要允许安装到外部存储上,因为游戏通常不会提供待机时运行的服务。当外部存储不可用的时候,游戏进程会被杀死。当外部存储重新可用并且用户重启了游戏,在视觉界面上应该没有什么影响(假设游戏通过标准的Activity生命周期正确保存了它的状态)。

如果你的应用程序需要几个兆字节的APK文件,你需要仔细考虑是否允许应用程序安装到外部存储上来为用户节省内部存储空间。

原文地址:http://developer.android.com/guide/topics/data/install-location.html

时间: 2024-11-10 19:52:46

Android应用程序安装位置(App Install Location)的相关文章

Android 编程下 App Install Location

从 API 8 开始(参考官方文档:App Install Location | Android Developers),你可以将你的应用安装在外部储存中(例如,安装到设备的 SD 卡上).这是一个可选的特征,你可以在你的应用的 AndroidManifest.xml 中声明 android:installLocation 属性.如果你没有声明这个属性,你的应用程序将会被安装在内部储存,并且不能被移到外置储存中. 修改 AndroidManifest.xml 文件中 <manifest> 元素

Android应用程序安装过程浅析

我们知道在android中,安装应用是由PackageManager来管理的,但是我们发现PackageManager是一个抽象类,他的installPackage方法也没有具体的实现.那在安装过程中是怎么执行的呐? 调用方 查看代码可以知道ApplicationPackageManager是直接继承自PackageManager的,所以最终代码会调用ApplicationPackageManager下的installPackage(Uri packageURI, IPackageInstall

Android应用程序安装过程源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6766010 Android系统在启动的过程中,会启动一个应用程序管理服务PackageManagerService,这个服务 负责扫描系统中特定的目录,找到里面的应用程序文件,即以Apk为后缀的文件,然后对这些文件进解析,得到应用程序的相关信息,完成应用程序的安装过程, 本文将详细分析这个过程. 应用程序管理服务PackageManagerSe

Android应用程序安装与Launcher启动机制

以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删):http://blog.csdn.net/luoshengyang/article/details/8923485http://blog.csdn.net/luoshengyang/article/details/12957169 整理by Doing Android系统在启动的过程中,会启动一个应用程序管理服务PackageManagerService,

【移动开发】App Install Location

Beginning with API Level 8, you can allow your application to be installed on the external storage (for example, the device's SD card). This is an optional feature you can declare for your application with the android:installLocation manifest attribu

Android 在程序中重启APP的方法

1. 方法一 利用PackageManager类 Intent i = getBaseContext().getPackageManager() .getLaunchIntentForPackage( getBaseContext().getPackageName() ); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); 2. 方法二 利用PendingIntent Intent mStartActivity = new

Android程序安装后应用图标不显示的问题

原文地址:http://trinea.iteye.com/blog/1463296 本文主要介绍Android应用程序安装后图标不显示的几个可能原因. 自己写的程序突然安装后图标不见了,在应用程序安装中能找到,但是桌面上就是没有图标,启动只能从最近列表中其中..一般这种情况只会在服务类程序和测试程序中出现,因为不需要图标. google无果,自己二分调试解决了,并测试了其他网友提供的其他会出错原因,大致总结如下: 1.AndroidManifest中application元素属性设置问题 属性设

Android 真机 程序安装后手机桌面或应用/窗口小部件视图里不显示程序图标

本文主要介绍android应用程序安装后图标不显示的几个可能原因. 自己写的程序突然安装后图标不见了,在应用程序安装中能找到,但是桌面上就是没有图标,启动只能从最近列表中其中..一般这种情况只会在服务类程序和测试程序中出现,因为不需要图标. 手机是中兴手机,在试过更改Android api版本.图标图片等方法后依然无果,又试了修改程序名称,问题解决.原名称是voter,被中兴和谐了...和谐了...谐了...了....又试了习大大的名字,依然不显示图标....欲哭无泪.... 附带网络上其他可能

Android应用程序键盘(Keyboard)消息处理机制分析

在Android系统中,键盘按键事件是由WindowManagerService服务来管理的,然后再以消息的形 式来分发给应用程序处理,不过和普通消息不一样,它是由硬件中断触发的:在上一篇文章<Android应用程序消息处理机制(Looper. Handler)分析>中,我们分析了Android应用程序的消息处理机制,本文将结合这种消息处理机制来详细分析Android应用程序是如何获得键 盘按键消息的. 在系统启动的时候,SystemServer会启动窗口管理服务WindowManagerSe