2012年11月14日星期三

如何解决R不能安装package的问题


Win7/Vista下如果使用标准用户来执行R,常常在试图安装package的时候提示无法写入,从而导致安装失败。

原因:
R默认安装在C:\Program Files 目录,安装的package也存放在 C:\Program Files\R\R-2.15.1\library 目录下。在Win7/Vista中,C:\Program Files 目录是一个受系统保护的目录,Users组只有读取和执行的权限,没有写入权限。为了使旧程序正常运作,Windows会将尝试写入此目录的操作重定向到C:\Users\User\AppData\Local 目录下。但是R不支持此重定向(反正它在尝试写入Program Files失败之后,确实问过我要不要把package放到My Documents里,成功写入到My Documents却未成功加载package,后者可能是因为――Win7对注册表也有保护,普通用户下禁止写入HKLM,而重定向到HKCU

解决方法:
方法一:对于不嫌麻烦的人来说,可以每次启动R的时候都使用管理员权限,这样想干啥就干啥。可以右键R,属性-兼容性 选项卡,勾选使用管理员权限运行。
方法二:上述方法有两个讨厌之处:第一,对一个像R这样的普通应用程序赋予管理员权限是不安全的;第二,每次启动R还必须同意授予管理员权限(如果你没有把UAC关掉的话)。第二个方法相对来说一劳永逸:更改library目录的权限。
右键C:\Program Files\R\R-2.15.1\library 目录,属性-安全-编辑,对Users组添加"写入"权限,从此就不用担心R无法安装package了。

已使用 Microsoft OneNote 2010 创建
一个用于存放所有笔记和信息的位置

2012年9月12日星期三

Python下跨平台操作文件路径



Python下跨平台操作文件路径
2012912
11:22

众所周知,Windows下的路径分隔符为反斜杠 "\", UNIX-like系统下的路径分隔符为正斜杠 "/",这常导致代码跨平台移植时的问题。
Python设计为一门跨平台的语言,当然可以轻松解决此问题。

首先,Python在不同平台下都可以正确识别以正斜杠为分隔符的路径。如果在程序中只用到程序中预置的路径字符串(比如说指定库的位置),而不涉及从系统获取文件路径,则只要将路径写为正斜杠分隔路径,代码即可跨平台。

但是如果需要使用os.path.abspath() os.walk() 等函数获取路径,Python返回的路径字符串会是操作系统默认格式的路径字符串。这时的解决方法主要有:
在需要拼接、查找路径分隔符的地方,使用 os.path.sep 来代替显式的 '/' '\\' ,该变量依平台不同而不同。
当然这样写会比较�嗦,本来只需要 a+'/'+b+'/'+c 就可以的地方,现在就需要写成 a+os.path.sep+b+os.path.sep+c了。本来直接 filename.split('/')就可以,现在就得写成 filename.split(os.path.sep)
所以,对于这些操作,使用 os.path 的各种内置函数来操作,会简洁一些,同时也增加代码的可阅读性。比如说,前面的 a+'/'+b+'/'+c 就可以写成 os.path.join(a,b,c) 。类似的操作还有:os.path.split()

已使用 Microsoft OneNote 2010 创建
一个用于存放所有笔记和信息的位置

2012年7月17日星期二

F3507G折腾记


新地址 
F3507G折腾记 但排版没有细调,还是这里的排版好看一些

F3507G折腾记



淘宝上搞了一个Ericsson F3507g,于是我的小黑现在有 WCDMA GPS 支持了

开门见山,对于同样使用F3507G正在寻求解决方案的同学,本文可能冗长,包含的最有用的信息均已总结在文章末尾,可以直接跳到倒数第二段。

拿到之后,立刻动手开拆。之前已经打印了一份X200 Hardware Maintenance Manual备查。

轻车熟路地拆去键盘、掌托,便露出mini PCIE插槽。很久没拆开,已经落满灰。小心吹了吹灰,插上数据卡,拧上螺丝,插上天线。
合上掌托,插SIM卡,装电池开机,居然找不到硬件!安装驱动程序,依然找不到。大�。于是问店家,建议重置BIOS试试。虽然在BIOS里一点都没找到关于WWAN的选项(仅有一个WLANWiMaX的选项),但重置BIOS之后再开机,神奇地出现了找到新硬件。

安装ThinkVantage GPS Enabler,上窗口试了一下,能搜到星。升级Access Connection,能正常连接联通WCDMA,信号很好,速度快,便心满心足地睡觉去了。(唯一不好的是流量跑得太快了!!!!)

第二天,开始折腾如何收发短信――真是漫长的历程。
首先查看Access Connection,竟然没有收发短信的选项。网上网友说,据传说5.02版是可以收发短信的,而我的Access Connection5.95最新版。总不要为这个把我的Access Connection降级吧?鬼知道降级之后会不会和Hotkey之类的程序冲突。而Access ConnectionHelp里面明明白白地说:不支持对F3507G收发短信。
OK,那就另想办法吧。没有短信还是很糟糕的――毕竟流量花了多少,Access Connection说的不算,联通下发的短信才算数。
网上有人说,可以安装EricssonEricsson Wireless Manager,即可使用短信功能,而且比Access Connection功能强大得多――至少GPS地图是Google Maps而不是坑爹的Bing Maps。但据网友说,Ericsson Wireless Manager是不能和Access Connection共存的,必须卸载载Access Connection才能使用Ericsson Wireless Manager,否则Ericsson Wireless Manager无法找到WWAN卡。而且Ericsson Wireless Manager也有Bug,比如说,如果关闭了它,就会自动给WWAN硬件断电――直到下次开机才能重新使用WWAN,而且ThinkPadFn+F5控制将无效。那这也太坑爹了吧?
不过又有网友声称,他发现了一个完美的共存办法:使用Access Connection调用Ericsson Wireless Manager。只需要在Access Connection的概要文件里设置,不使用Access Connection本身来连接网络,而使用其它程序连接网络即可。由Access Connection调用Ericsson Wireless Manager时,Ericsson Wireless Manager将可以找到WWAN卡。而Access Connection仍然可以照常 Fn+F5 打开和关闭WWAN卡电源。
看上去不错,于是去找Ericsson Wireless Manager的下载。糟糕的是,原始地址是sonyericsson.com,而我们都知道,这家公司现在已经改名叫Sony Mobile了――于是在sonymobile.com上根本找不到此软件的下载。
最后去其它网站找到了这软件。装上之后,一连串悲剧开始了……
Access Connection的情况下Ericsson Wireless Manager当然找不到网卡,这已经是公认的结论。在Access Connection里尝试调用Ericsson Wireless Manager来连接网络,可是Ericsson Wireless Manager还是报告找不到网卡。更糟糕的是,Access Connection现在也无法控制网卡了,总是报告:其它客户端程序正在使用WWAN卡……于是竟然怎么都没法上网了!
卸载Ericsson Wireless Manager,问题依旧。卸载Access Connection,卸载F3507G驱动,再重装驱动和Access ConnectionAccess Connection仍然死活无法控制WWAN卡。反反复复尝试用各种顺序卸载重装了包括hotkeyAccess Connection、驱动、GPS在内的各种软件,结果不仅Access Connection无法找到WWAN卡,连Fn+F5里也显示不出WWAN了。甚至一度连WLAN图标和Access Connection中的其它概要文件都挂掉,各种诡异问题。
(之前网上还有网友声称Ericsson Wireless Manager是准绿色软件,无须安装直接拷贝即可使用。你妹的绿色软件!)

在彻底卸了所有能找到的相关软件并重装后还是不行,于是我一怒之下――系统还原了。

系统还原之后,终于一切正常了……不过仔细看了一下,这次提示找到新硬件并安装驱动程序的界面明显和之前不一样:之前每次重装驱动程序,都只提示为两个硬件找到了驱动程序;而现在是提示为六七个硬件安装了驱动程序。

所以目前我认为:Ericsson Wireless Manager显然留了一些设置没卸载干净,导致其它程序无法使用WWAN。同时,Ericsson的驱动也很糟糕,也没有卸载干净。

于是继续尝试别的办法收发短信。
先装了一个ThinkPad Lenovo Mobile Broadband (旧版叫ThinkPad Lenovo Mobile Broadband Connect),据说可以用于收发短信。装了之后发现,它主要用途是向移动运营商激活WWAN卡。也许是在米帝的一些TP机型是包含运营商套餐的吧。支持AT&TVerizon,不支持大陆的任何运营商。于是卸掉。

接着,在lenovo GB网站上搜索Ericsson,竟然找到了一个看起来像有用的东西:
Ericsson Mobile Broadband Manager
试着装上去之后,果然能用这个软件收发短信了!
但是在ThinkVantage GPS的说明页面,提示ThinkVantage GPSEricsson Mobile Broadband Manager不兼容,可能会导致报错,不过目前我还没有遇到过问题。
 


对于同样使用F3507G正在寻求解决方案的同学,本文包含的信息如下:
Access Connection无法收发短信
收短信可以使用Ericsson Mobile Broadband ManagerLenovo US 网站下载),据官网说法和ThinkVantage GPS有冲突,但我没遇到。
Access ConnectionEricsson Wireless Manager不兼容。同时安装会导致两者都不能使用且很难恢复。所以一定不要重复安装!(可能和我使用的版本有关,版本见下)
Lenovo Mobile Broadband (Connect) 在中国大陆没有用处。

本人使用的软硬件版本(所有软件均已更新到能找到的最新版本,有些比ThinkVantage System Update提供的还新):
ThinkPad X200
BIOS 3.21.1.06
Windows 7 Ultimate SP1 X64 OEM
Ericsson F3507g Wireless WAN Windows 7 驱动程序 6.3.3.6
ThinkVantage Access Connection 5.95
ThinkVantage GPS 2.80
Hotkey 3.80
Ericsson Wireless Manager 5.3.2076.12 (不能用!)
Ericsson Mobile Broadband Manager 版本 CXP 901 4396/216.1.6.2
ThinkPad Lenovo Mobile Broadband (Connect) 3.5.0011 (没用)(X200最新只能用3.5X201以上可以用4.1


2012年3月21日星期三

用Visual C++ 2010 编写的软件的发布

Visual C++ 2010 编写的软件的发布

 

 

 

由于VC2010比较新,不少人系统还比较旧,往往无法直接运行VC2010编译出的程序。如果提示side by side 错误,一般就是缺少运行库之故。

解决这个问题,有几种办法:

一、静态链接

如果程序不大的话,把所有要用到的链接库静态链接即可。这是在VC6时代最常用的办法。但静态链接这个选项在VC6里十分好找,VC2010中似乎不那么好找。

 

一般而言,需要用到的无非是这几部分:msvcr100.dllmsvcp100.dllMFC。有的程序还会用到ATL

其中,msvcrC运行库,msvcpC++运行库。如果你使用了STL之类C++的东西,msvcp就是必须的。

 

静态链接MSVCRMSVCP的办法是:

Alt+F7打开Project Property,展开:

Configuration Properties

C/C++

Code Generation

Runtime Library

然后将选项由/MD改为 "Multi-threaded (/MT)"

 

静态链接MFCATL库的方法是:

Alt+F7打开Project Property,展开:

Configuration Properties

General

Use of MFC

Use of ATL

然后改成Static Library即可

 

二,使用Windows Installer

当然,我们还可以通过配置manifest文件(编译时默认已经在exe中写入,一般无需手工提取修改),并手工拷贝以上几个dll的方法使程序拷贝后仍然可以运行。(通常放在exe同一目录下,windows就会自动搜索到)

但更简单的方法是,直接生成一个Installer安装包,这样该安装包就会自动包含运行该程序需要的所有文件。如果目标操作系统已经有这些文件,安装过程便不会释放它们,否则将拷贝这些文件到目标系统。

VC2010中,创建简单的Installer安装包不再需要其它软件。具体方法如下:

新建Project->Other Projects->Setup and Deployment->Visual Studio Installer->Setup Wizard

之后按向导操作即可。勾选你需要的文件,将自动打包生成安装包。

生成安装包的方法是:Buildsetup Project,会生成一个msi和一个exe,两者都可以使用。

生成安装包的时间会很长――我不知道是我的VC的问题还是本来就这么慢。中间会出现若干次windows正在配置Visual Studio 2010的安装进度条。

 

2012年2月5日星期日

响堂山石窟游记

响堂山游记

 

 

201222日,我、李龙、邓超、顾冠雄四个2人在我的忽悠下去了南北响堂山石窟。今年顾冠雄22岁。下午222分的时候,我们恰又走在222省道上。之后又上了G22(青兰高速)。所以是充满"2"的一趟旅行。

 

作为一个邯郸人而没有来过邯郸境内最重要的文物古迹之一,实在是惭愧。之前顾冠雄说,当年这里还不要门票的时候,曾经是一个和公厕差不多的地方,所以他起初很不愿来。我爸说,他来的时候,没见过一尊有头的佛像,大小佛像已被破坏殆净。去之前,我也不知道会看到什么样子。

 

李龙开车去接了邓超和顾冠雄,然后到矿院北门接了我。听说中华大街南段修路不通,遂沿学院路西行,上邯磁公路-107国道。到马头右转上315省道,横穿峰峰市区,到市区西郊,沿滏阳河北岸的太行西路前进,过玉皇阁,就看见南响堂的路牌。下车问路,穿桥上山,到得南响堂寺的南门。

南响堂寺颇冷清,全程除我们外仅有游客两名。山门左侧八角砖塔一座。右侧依山坡凿出若干洞。仅上下两层,规模很小。佛像确实破坏严重,无一完整。与北响堂不同,窟中大小佛像几乎全系北朝风格,还是值得一看的。人气冷落有人气冷落的好处。没有解说牌却很讨厌。

Figure 1 宋塔

Figure 2 南响堂石窟全景

Figure 3 一个不错的小佛像

Figure 4 飞天壁画

 

返回峰峰市区内吃过午饭,去北响堂。又途经玉皇阁,于是下车看看。玉皇阁后就是太行八陉之滏口陉。阁为明代,系第六批国保。

Figure 5 玉皇阁

Figure 6 从内部仰视屋顶

222省道至北响堂。虽远离城区,而香火鼎盛,游客约可不下百人,与南响堂大为不同。山脚下的景区大门整修一新,还有块4A级景区和国家森林公园的牌子。

北响堂石窟凿于半山腰,爬山约需半小时。山脚常乐寺旁有宋代砖塔一座,最上两层坍毁近半。与南响堂相比,北响堂规模大得多,因规模大而名声大,因名声大而游客多,因而目下的保护状况也更堪忧。洞中佛像凡稍大些的,都被愚男信女披戴各式装饰。各种佛像上饼干到处都是。最大一窟(记得似乎是第七窟)前香烟缭绕。第三窟中的功德箱更令人啼笑皆非,三座佛像前的功德箱分别写着"大奶奶"、"二奶奶"、"三奶奶"。经过观察,我认为这些佛像皆无头,后补,殊不可忍。"修复"佛头也就罢了,但手段之拙劣实在使人发指。补上的新佛头大多非常难看,即使有一二形似,神情也差得远。复加以鎏金彩绘以供人膜拜。更有甚者,直接拿半截假佛头水泥糊到佛像上。凡修复的佛像,都使我看了大失所望。

Figure 7 宋塔及北响堂景区入口

Figure 8 石窟远眺

Figure 9 �像1

Figure 10 �像2

Figure 11 �像3

就佛像来说,北响像虽然主佛都残毁很重,再加上拙劣的修复,难以窥其当年面貌,但主佛两旁侍立的菩萨比丘却侥幸地少被"修复"。虽然这些立像头部也都毁去,但婀娜生动的体态尚在,值得一看。北齐大窟三座,其中大像皇家气度,精致非凡。最大洞窟十几米高,但此洞主佛也损毁最重。遗憾的是,这三座北齐大窟,除主龛外,周围的小龛大多年代比较晚近。大窟的回廊内壁上的佛龛,或者是元以后的低劣佛像,或者干脆全部毁去,被补以当代佛像。小窟数座,有几座元以后的,没什么看头。唐窟两三,很好。

Figure 12 一菩萨像

窟中壁花彩绘都很精致,为以前所未见。但鉴于佛像修补很重,我不能不怀疑这些浮雕彩绘是否也是当代修补。尤其是最大窟,内壁四处都可玩赏。解说牌说,前壁原有最大的帝后礼佛图,但已损毁至难以辨认。

Figure 13 大佛洞内

南北响堂都不缺碑刻,这些碑刻保存完好,而且字体风姿绰约,是响堂山一大亮点。不知为何从未在书店中见有拓本出版。

出北响堂石窟,下山打道回府。经S222上青兰高速,在上高速之前的立交桥前交了一次邢峰高速的买路钱;青兰高速又交一次买路钱;从邯郸西出口下高速后,市区在望,竟然立刻又遇到一个收费站,交了新邯武公路的买路钱。无话可说。

 

2012年1月30日星期一

我就喜欢这样的订阅邮件

某天早上,邮箱里出现了这么一封邮件:

 

尊敬的用户:

我们很荣幸能有机会为您呈现高品质、可信赖、有特色的本地生活优惠。

您注册点评账号并且订阅了每日团购邮件,为了让您及时的了解点评团最新上线的团购,我们会发送邮件到您留下的订阅邮箱,但从近期您的反馈来看,发现您持续有一段时间没有打开邮件。

也许我们的团购邮件对您造成了一定的困扰,为了减少骚扰,我们将不再对您的邮箱发送团购订阅邮件。如果您看到这封邮件后还希望能定期接收,请点击以下的链接重新订阅:

 

在这个垃圾邮件和流氓软件横行的时候,像大众点评网这样关注用户体验的真是不多啊!

2011年11月9日星期三

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

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

 

 

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

 

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

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

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

 

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

(可以在博文所属网站上直接转载。转到站外请注明来自未名BBS http://wangxuan725.blog.163.com/ http://wylht.blogspot.com/ 。本文还在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.xda-developers.com/showthread.php?t=670087

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

Link2SD

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

D2EXT(Data2EXT)

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

给出一个链接:

http://forum.xda-developers.com/showthread.php?t=859419

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

Data2SD

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

http://forum.xda-developers.com/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

速度

同左

快于左

同左

耗电

/