其实也只是将程序里的.apk文件移动到sd卡上,其它的文件还在data文件夹下。
将应用程序安装在SD卡上是Android 2.2(code name Froyo)新增的功能。应用程序转移到SD卡,可以很大程度地避免/data空间不足的状况。因为用户所安装的应用程序都是安装在/data分区下的(我的HTC Wildfire /data分区是175MB),随着应用程序的数量逐渐增加,/data分区的空间势必逐渐减小,那么何不好好利用有着更大空间的SD卡呢,要知道,现在的SD卡4GB,8GB,甚至16GB都已经很普遍了。在Android 2.2上,这个功能被加入进来了。这个功能的实现很简单,但同时也有些地方需要注意一下。

这里先介绍如何将已安装的应用程序转移到SD卡:

1. 在home页,按下menu键,然后选择”设置”,并依次进入”应用程序 –> 管理应用程序”,这时你会看到以下画面。其中第一栏的”已下载”里包含着所有由用户所安装的应用程序。



2. 点击”已下载”里的应用程序,如果该应用程序允许被移动到SD卡,会有一个白色可点击的”移至SD卡”按钮,点击这个按钮,系统就会将该应用程序移动到SD卡了。



3. 返回到”管理应用程序”界面,点击最右侧的一栏”SD卡中”,可以看到所有被移动到SD卡的应用程序。





以下是需要注意和了解的地方:

1. 应用程序的默认安装位置是在开发过程中在manifest的”android:installLocation”里声明的,它的值可以是"preferExternal" 和"auto"。如果选择"preferExternal",那么应用程序默认会被安装在SD卡(但如果SD卡空间不足,那么应用程序仍将被安装在ROM中),如果是”auto”,则会由系统自动判断应用程序安装的位置。

2. 根据Android开发文档,应用程序被移动到SD卡后,应用程序的性能并不会有什么影响。但是我的疑问是:系统下的分区文件系统(一般是yaffs,yaffs2)和SD上的分区文件系统(一般是FAT32)不同,这一点也不会影响性能吗?

3. 并不是这个应用程序的所有文件都被转移到SD卡了,而是只有.apk文件被转移到SD卡,而其他的.dex,数据库等一些文件仍然会留在/data分区。

4. 转移到SD卡的应用程序只能在一个Android设备上使用,而不能拿到其他设备上使用。

5. 当用户通过USB数据线将Android设备与电脑连接起来,并且USB连接方式是”磁盘驱动器” 时,运行在SD卡上的应用程序会被立马结束。

6. 不是所有的应用程序都应当安装在SD卡上,比如输入法,动态桌面等等,详细情况请参考引文。



这里以estrong taskmanager为例来研究Android下App安装的位置以及App移动到SD卡的情况。

研究方法:

1. 在App安装前,安装后,移动后,分别使用adb shell ls -R <path> > <file>将对应路径下的所有文件保存下来,这里的path是/data和/mnt;

2. 通过文件比对工具(Linux下用Meld,Windows下WinMerge)对这些文件进行比对,以查看前后的差异。

以下是实验结果:

App安装后的变化

/data目录下多出文件如下:

/data/app/com.estrongs.android.taskmanager-1.apk

/data/data/com.estrongs.android.taskmanager/cache/

/data/data/com.estrongs.android.taskmanager/cache/webviewCache/

/data/data/com.estrongs.android.taskmanager/databases/

/data/data/com.estrongs.android.taskmanager/databases/webviewCache.db-journal

/data/data/com.estrongs.android.taskmanager/databases/etm_info.db

/data/data/com.estrongs.android.taskmanager/databases/webviewCache.db

/data/data/com.estrongs.android.taskmanager/databases/webview.db

/data/data/com.estrongs.android.taskmanager/shared_prefs/

/data/data/com.estrongs.android.taskmanager/shared_prefs/google_ads.xml.xml

/data/data/com.estrongs.android.taskmanager/shared_prefs/com.estrongs.android.taskmanager_preferences.xml

/data/data/com.estrongs.android.taskmanager/shared_prefs/ignore_list.xml

/data/data/com.estrongs.android.taskmanager/lib/

/data/dalvik-cache/data@app@com.estrongs.android.taskmanger-1.apk@classes.dex

另外,可能发生改变的文件有:

/data/data/com.htc.launcher/share_prefs/WidgetPackageManager.xml

App移动到SD card后的变化

/data目录减少的文件如下:

/data/app/com.estrongs.android.taskmanager-1.apk

/data目录发生变化的文件如下:

原/data/dalvik-cache/data@app@com.estrongs.android.taskmanger-1.apk@classes.dex

变成/data/dalvik-cache/mnt@asec@com.estrongs.android.taskmanger-1@pkg.apk@classes.dex

/data目录可能发生变化的文件如下:

/data/system/appwidgets.xml

/mnt目录多出的文件如下:

/mnt/asec/com.estrongs.android.taskmanager-1/

/mnt/asec/com.estrongs.android.taskmanager-1/pkg.apk

/mnt/secure/asec/com.estrongs.android.taskmanager-1.asec