分享

Android下将程序安装到SD卡的各种方法详解(原创)

 逗咳嗽 2012-11-08

Android下将程序安装到SD卡的各种方法详解(原创)  

2011-11-09 23:03:52|  分类: 默认分类 |字号 订阅

众所周知,Android2.2之前并不提供将程序安装在SD卡上的方法。这点十分脑残。从Android2.2开始,提供了把程序迁移到SD卡上的功能。但是并不完美。想来Windows Mobile很久以前就实现的功能现在Android还没有完美解决,真是让人啼笑皆非。

   

下面本文就此作一点简单的介绍。主要介绍App2SDApp2SD+Link2SD。也对Data2SDD2EXT有所涉及,但后两种并未亲测。

尽量从基础知识讲起,希望能帮助初用Android的同学。当前网络上关于这些方法的帖子颇多,而有一些帖子的说法颇有误人之嫌。故参考网上诸多帖子和亲自测试,写出本文。

本文如有错漏,请读者不吝指出。文中倘有名词未有解释,请先考虑使用Google找到答案。写本文已经花不少时间,本文不会再做订正错误以外的补充和修订。

   

本文为原创,转载请注明。

(可以在博文所属网站上直接转载。转到站外请注明来自未名BBS http://wangxuan725.blog.163.com/ http://wylht./ 。本文还在QQ空间和人人网同步发布)

   

ROM太小?关于ROM的基础知识

ROM包括哪些部分?

ROM实际被划分为若干个分区。其中和用户关系最密切的是/system/data两个分区。如果没有ROOT权限,/system分区是不可写的。所以你的全部用户程序和用户数据都安装在/data分区上。这也就是我们在"设置-应用程序-管理程序"中能看到的ROM空间。

Android应用程序占用的空间包括哪些部分?

一个 Android程序如果想能正常运行,至少会在你的ROM中存放如下五种文件:

/data/app,存放程序的apk文件(仅用户程序)。你安装的程序的apk文件都会在这里再放一份。

/data/dalvik-cache,顾名思义,是程序的dalvik-cache文件。实际就是程序的Java执行文件,扩展名为dex。因为apk中也包含它,所以这里只是一个cache

/data/data/程序名/lib。程序的lib文件(仅用户程序),扩展名为so

cache。顾名思义,缓存。存放于/data/data/程序名/cache。也可以强制存放于系统的/cache分区(有ROOT权限后)

用户数据。在/data/data/程序名(无论用户程序还是系统程序的数据都在这)。/data/data中的绝大部分文件都是用户数据。

这些东西,哪些最占地方?

首先是apk文件。Dalvik-cachelib都是从apk中解出的。

其次是用户数据。但这随程序不同而有很大不同。有的程序就只有极少量的数据,而像"联系人"、"短信"、"QQ"之类的软件用户数据就可以多达数M

lib文件一般体积很小(也有例外,比如说Opera)。Dalvik-cache的体积也不大。

cache体积不大,而且系统会动态清理它们。

所以,我们知道,把程序移动到卡上的首要目的是移动哪些文件了。首先是apk,其次是用户数据。

Linux下文件迁移的方法

Linux支持:挂载一个分区到一个目录;在目录和目录、文件和文件间建立符号链接;把一个文件作为一个分区挂载。这些就是将应用程序安装在SD卡上的基础。

SD卡一般知识

SD卡分级:class2 class 4 class 6,以及不常见的class 10。该数字代表此卡读写速度中较小的那个值(以MB/s为单位,当然所有的卡都是读取比写入快)大于等于该数字。

市面SD卡闪存一般是两种:SLCMLC(还有TLC,比MLC更烂,现在不大常见)。原理姑不论,对于希望把程序装在SD卡上的同学来说,你们需要知道:SLC读写速度差距不大,都很快;MLC的读取速度很快而写入速度极慢。SLC的擦写寿命约十万次(一说百万次),而MLC只有一万次左右。鉴定SLCMLC卡的最简单方法就是拿一个足够好的读卡器(便宜的读卡器验不出SLC的超高速度),运行一下ATTO Disk Benchmark,看一下读写速度差异。如果差3倍以上,应该就是MLC

SD卡品牌:公认SanDisk拥有最佳的兼容性。如果你有一张两三年前生产的SanDisk microSD卡,那么恭喜你。那时的SanDisk极度厚道。标称Class 2的卡比别家Class 4的卡更快。而标称Class 4Mobile Ultra系列更是拥有写入速度超过25M的神速。Mobile Ultra系列已经停产,成为永远的传奇。今天SanDisk卡的速度并不比别家更快!只是兼容性仍胜过别家。

对于今天的SD卡厂商,大致可以这么说,Class 2Class 4的卡全部是MLC,没有例外。写入速度等于标称值,读取速度10M-20MClass 10microSD卡,有可能使用的是SLC闪存。如果用的是SLC,可以达到写入20M/s,读取30M/s的速度。

但是,总体来讲,SLC的卡因为昂贵,各厂都在减产。在决定买一张Class 10的卡(它们往往不便宜!)之前,请一定搜一下最近入手这张卡的网友的评测。不然有可能这型卡一年前还是SLC,现在却改用MLC了。

对于闪存产品,因为其擦写次数有限,FAT系列文件系统比较适合,寿命损害小。而比较先进的NTFSEXT文件系统都会严重损害闪存寿命(因为反复擦写同一区块)。尤其是对于MLC

常见的程序安装到SD卡上的方法、俗称、下载地址

App2SD

本来是在 Android2.2推出程序安装在SD卡上的功能之前的一种网友自制方法的名称。自从官方推出程序安装在SD卡的功能之后,这个名字就给了官方实现。而原App2SD现在一般称作App2SD+

App2SD+ (a2sd)

全称Darktremor Apps2SD。下载地址:

http://forum./showthread.php?t=670087

历史很久,功能亦在不断完善。必须命令行操作,需要分区,需要ROOT权限,需要自己刷入/system中。脚本的异常处理机制比较完善,可以自己安装。只要有终端,你就总可以挽回后果。

Link2SD

Android Market上可以很容易下载到。目前相当流行的一款软件。功能日渐完善,界面亦很有亲和力。需要分区,需要ROOT权限。

D2EXT(Data2EXT)

一度在各种修改版ROM中流行的方法。不只有一种实现方法!

给出一个链接:

http://forum./showthread.php?t=859419

命令行操作,需要ROOT权限,需要自己刷入/system,脚本简单,风险大。最好用已经包含此功能的ROM,不推荐自己安装。

Data2SD

也是一个比较流行的工具。没用过,不太熟,给一个链接,不知道是不是原始出处。恕不给出简单介绍了。原理与利弊分析下面仍奉。

http://forum./showpost.php?p=11234326

程序安装在SD卡上:原理与利弊概述

有了这些准备知识,我们终于可以开始正题了。

迁移的目的及各方法的区分点:

由以上内容,我们知道,我们的终极目的,就是要把/data分区下的各种文件移到SD卡上,同时保证它们可以被正常使用,以达到减少/data分区占用的目的。

基本的想法就是,把文件移到SD卡上之后,再链接到原位置。由于linux下有很多种方法来做这个事情,故而产生了各种不同方法。文件->文件,文件->目录,目录->目录,分区->目录,各种方法。

此外,各种不同方法,对于以上提到的程序的五部分空间占用,有的可以迁移全部,有的只能迁移部分。最后,对于系统更新与系统程序数据,也有一些软件不能迁移。

这三方面,就是各种实现方法的主要差别。

只读还是读写——三方面的考量:

由前文可知,apkdexlib都是只读不写的文件,即使是MLC也可以满足。而cache和用户数据都是在频繁读写的。对于它们要特别讨论一下。

SD卡的要求:

首先,这意味着对写入速度的要求;其次,意味着对SD卡擦写寿命的要求。

如果需要迁移/data/data,那么要求SLC高速卡。否则效果不理想也容易损坏SD卡。

FAT分区对于延长存储卡寿命较为理想,而EXT就不好。

系统运行速度:

如果迁移用户数据和cache,不仅要求卡速快,而且对挂载方式也有要求。如果将整个EXT分区挂载,会提高IO效率,甚至可能比挂载之前的IO分数还高。(据网友所说,未测)

另外,SD卡速并非唯一因素。低端手机往往会出现由于手机限制而无法发挥出SD卡速的情况。

耗电:

用户数据即使在待机时也会频繁读写,造成SD卡在待机时耗电,严重降低待机时间——甚至可达一半左右。

重新分区的利弊:

很多方法要求对SD卡重新分区。

这样有两个好处,一是程序挂载分区比较方便。二是当把手机作为U盘连接电脑时,第一FAT分区一定会被从系统中卸载,而你的第二分区不会被卸载。如果迁移的程序位于第一FAT分区中,那么它们此时就会被终止运行。

此外,桌面Widget程序不能放在第一FAT分区中,否则会无法显示。

重新分区也有缺点,就是SD卡会一直处于挂载状态,永不卸载。(好像Android不像Windows Mobile那样待机时可以卸载SD卡。如果待机时可以卸载的话,不重新分区就会省些电。)

另外重新分区操作较麻烦。推荐在recovery下分区。有时,有的SD卡在PC上格卡分区后,app2sd+会无法识别。

链接什么:

如果直接链接或挂载/data/data/data/data/app这种包含所有程序的目录,必然不能选择每个程序是留在ROM中还是移到卡上。

反之,如果为每个程序的文件、目录单独创建链接,就可以选择哪些程序移动,哪些不移动。

分区的文件系统:

如果需要挂载"整个"分区,那么,则只能挂载EXT格式的分区。前面已经说过,EXT分区对存储卡寿命有害。

另一个问题:官版AndroidLinux内核太老,不支持EXT4,仅支持EXT3EXT2。如果希望使用EXT4,那么就必须升级内核。特别注意:如果你的第二分区是EXT4且你在用官版系统,那么不要奇怪为什么挂载不上。

各方法实现机理与利弊表:

下面描述一下各种方法的实现机理,读了前面的利弊解释,读者不难自己推断出各方法的利弊。但我仍然附了一张全表在最后。

App2SD

迁移apklib。在第一FAT分区中为每个程序创建一个文件,把这个文件作为分区挂载。也就是说,若有N个程序,就会挂载N个分区。

App2SD+

迁移apkdalvik-cache。也可以选择迁移/data/data目录的全部(最新版才有的功能)。方法是在EXT分区中建立目录并创建到/data下对应目录的符号链接。

Link2SD

迁移apklibdalvik-cache。第二分区可以是FATEXT分区。出于安全考虑,禁链系统程序。创建第二分区中文件到/data下对应文件的符号链接。

D2EXT

将整个EXT分区挂载为/data。简单粗暴直接。但可以获得较好的IO效率。

Data2SD

支持两种挂载方法。第一种同D2EXT;第二种是在第一FAT分区中创建一个img文件,将这个文件作为EXT分区挂载到/data

综上:

可见,原生方法最弱,但也最安全最稳定最方便。Link2SD相对于原生方法,可以迁移系统程序更新,U盘模式下程序不会消失。App2SD+D2EXTData2SD则进一步允许把整个/data中的文件都迁移过去,但

不能自由选择迁移哪些,不迁移哪些程序。迁移/data/data后,通讯录、短信等数据也会跑到SD卡上,导致开机加载系统程序速度变慢,更耗电。详细对比见下表:(Data2SD直接挂EXT分区的特性与D2EXT几乎相同,故不列。只列Data2SDimg文件的利弊)

另外,据我测试,使用Link2SD时,豌豆荚无法列出应用程序列表,无法管理应用程序。

   

   

项目

App2SD

Link2SD

App2SD+

D2EXT

Data2SD(img)

迁移文件及效果

  

  

  

  

  

迁移apk

迁移dalvik-cache

部分

迁移lib

迁移cache

迁移/data/data

系统程序更新

U盘模式连接电脑时程序不丢失

Widget正常使用

豌豆荚管理程序

  

操作便利性

  

  

  

  

  

选择迁移哪些程序

需要ROOT权限

可视化

需要分区

性能及其它

  

  

  

  

  

支持FAT32

支持EXT3

支持EXT4

速度

同左

快于左

同左

耗电

/

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多