Nexus 5 刷 CyanogenMod 11 及数据迁移技巧

新年,新工作,新生活,当然少不了新手机,囧

事实上这个 Nexus 5 本来是买给 TAOTAO 替换 iPhone 4 的,没想到她对 Android 系统诸多不适应,对其外观也颇有微词,考虑了一下还是决定先买个 iPad Air 32GB Wi-Fi 扛着,等下一代 iPhone 吧。

手机时间线

在澳洲使用过的手机,时间线大致如下

  • 2008年2月,初到澳洲时用的手机是 Palm Treo 650 呵呵,你们懂的,经典砖头全键盘机,电池到现在还是很给力,一个月不充电都没问题。当然了,即便在那个时候,操作系统就已经和时代脱节,跟不上移动互联网的潮流,所以 Palm 完蛋。
  • 之后用公司给的 Nokia 6500 Classic 只是用来打电话发短讯挺不错。
  • 2008年11月回上海时买了个发布不久的 iPhone 3G 8GB 香港水货一直扛到2011年下半年,开始无法忍受蜗牛速了,严重影响生产力。越狱也很浪费时间,没有 root 又不舒服,唉。
  • 2011年10月入 Nexus S 16GB (返现后不到A$185),本人的第一个 Android 手机,一直用官方固件懒得折腾刷机(看鱼龙混杂的刷机文晕了,当时上 XDA 又看不太明白),结果就一直拖到它退休。有了 Nexus 5 之后将其解锁刷了 CM 10.2.0 当备胎和 Raspberry Pi - OpenELEC 的遥控器用。
  • 2013年1月入 Nexus 4 8GB 还是没时间折腾刷机,一直是官方固件。感觉 LG 质量明显不如三星,连个耳机线都不送。升级到 Android 4.3 后还出现充电不能问题,后来发现是数据线坏了导致的,草泥马!(A$200卖掉了)。
  • 2014年1月入 Nexus 5 16GB 开包就解锁刷了 CyanogenMod 11 nightly 有 root 的感觉很舒服,在诸多方面都都比官方固件强。只是稳定性还有待提高,毕竟还是 nightly 嘛,稳定就别乱刷,等稳定版释出吧。

解锁 bootloader 和刷机

作为资深 Linux 玩家,用没有 root 的机器是及其难受的,就像一个习惯了开手动档车的人,突然开起自动档,还是不带手动模式的!手机作为随身携带的移动设备,使用时间甚至会超过笔记本电脑,应该完全掌控(知道它在做什么,以及能做什么)把它调教到自己满意的状态运行 root 是必要条件。之前在 Nexus S 上使用 CyanogenMod 几个月也证明了其稳定性和可靠性。因为解锁设备(实际上是解 bootloader 锁)会擦除设备上所有的数据,所以开箱第一件事就是解锁,即使你准备(暂时)用官方固件。

关于解锁,刷 custom recovery 和自定义固件,论坛和博客上的文章讨论鱼龙混杂,设备间还存在着差异,让人无所适从。这也是我最初使用 Nexus S 懒得刷机的原因之一。后来找资深的 Android 刷机师傅(更是 Solaris / Linux 大牛)同事聊了近一个小时,解了惑,搞清了概念,理清了思路,接下去就是顺水推舟了。

直接从 CyanogenMod 官方 wiki 上找 Nexus 5 对应的页面,找到安装指南,跟着步骤做就行了,完全没有压力。

一些注意事项

  • Unlock bootloader 是一个毁灭性操作(会擦掉设备上所有的数据),最好开箱后马上就做,以免在使用一段时间后再解锁,备份不全(没 root 之苦)导致丢数据。
  • 推荐在 Debian / Ubuntu 上解锁,adbfastboot 直接通过系统的包管理工具装 android-tools-adbandroid-tools-fastboot 这两个包即可。
  • Custom Recovery 根据 CyanogenMod 官方博客推荐,用 ClockworkMod,用 TWRP 可能产生问题。
  • CyanogenMod 11 稳定版尚未发布,暂时用 nightly 系统稳定性没问题。待稳定版释出后可以通过类似 OTA 的方式下载增量升级包升级(当然也可以下载完整 zip 通过 CWM 安装)。通过这两种方法升级,设备上的数据会被保留,不必担心。
  • 推荐 cm-11-20140111-NIGHTLY-hammerhead.zip该工作的都工作,稳定性不错。
  • Google 系列软件需要自行下载,通过 ClockworkMod 安装后在 Google Play 里升级到最新。
  • Privacy Guard 对付新浪微博等国产流氓应用无效,禁止其访问联系人、通话记录等隐私数据的话启动就直接崩溃。建议用 Xposed 框架 + XPrivacy 方案(喂给它假的数据)搞定。
  • Android 内置的浏览器和日历程序不需要(用 Chrome 和 Google Calendar 替代)的话,可以直接禁用,没必要移除。因为下次升级 CM 时还是会给装上,因为是内置应用。

关于数据迁移和备份

我的情况是 Nexus 4 官方固件迁移到 CyanogenMod 11 nightly 源没有 root 而目标有。找到 ClockworkMod 家出品的 Helium 以前叫 Carbon 免费版,用了一些小技巧一下子搞定了短讯、通话记录以及诸如 Twitter for Android (草稿箱里有大量有料,想发未发的推,丢了太可惜)等应用的数据。

用 Helium 免费版实现设备间数据迁移的技巧:分别在源和目标设备上备份同样的应用(为的是生成同样的目录结构和数据文件),在 /sdcard/carbon 下,然后用在源上生成的应用目录下的 .ab (安卓备份)文件覆盖目标设备上对应目录下的。比如 Twitter for Android 的 /sdcard/carbon/com.twitter.android/com.twitter.android.ab,之后再在目标设备上用 Helium 恢复即可。

注意:直接把源上生成的备份复制到目标对应的 carbon 目录下是无用的,选择 Restore and Sync 里看不到,嘿嘿(逼人付费?)。

Helium 付费版可以通过 Dropbox 或 Google Drive 备份和恢复,甚至提供在同一个 WLAN 中的设备间迁移数据。在本机上可以跑服务提供 Web UI 进行操作,非常不错。是 Titanium Backup 之外的另一个好选择,对未 root 的设备尤其有效。

关于数据的安全擦除

卖掉 Android 设备之前,当然要个人数据被安全擦除,以避免被后来者恢复,继而发生陈冠希老师那样的艳照门事件。

做了一些功课之后,总结 Android 设备数据擦除,最保险的方法如下:

  1. 先加密设备(对现有数据进行加密),加密所需时间因数据量和设备处理能力而不同。
  2. 加密完成后设备重启,启动过程中需要输入 passphrase 后才能挂载特定分区进入系统。这和 Linux 上 dm-crypt 子系统实现数据加密类似,启动过程中到 initrd / initramfs 这步时做验证,成功之后方可挂载 / 分区的实现类似 。据说 Android 用的就是这个。
  3. 加密完成后做 Factory data reset 这一步基本上瞬间完成。因为这一步只是擦除了加密用的 key 通常就是一个 block (在 ext4 文件系统上默认是 4096 bytes - 4K )然后重新 mkfs 创建文件系统。没有了 key 理论上加密的数据就无法被解密恢复了。
    注意:实际上 key 还是有可能被恢复出来的,有兴趣的可以自行搜索。
  4. 擦除之后设备会重启恢复到出厂状态(未加密)。

CyanogenMod / Android 的一些细节和技巧

Android 不像传统 Unix / Linux 那样用 /etc/{passwd,shadow,group,gshadow} 以用文件形式存储用户和组信息。安装每个应用都会为其创建一个对应的用户,以此实现权限之隔离。比如终端模拟器用户为 u0_a55 可直接 suroot (无需密码)。引入多用户切换之后用到了组,变复杂了些。

ClockworkMod 生成的备份在 /mnt/shell/emulate/clockworkmod/backup 下,该目录下有数字编号,据说是新版 Android 隔离多用户数据用的。备份 ClockworkMod 生成的 tar 得用 adb pull 或直接 scp / rsync 出来,移到 sdcard 上没法复制出来(虚拟文件系统?),目录结构有点晕。

Greenify hibernate 的工作原理,简单说是将应用改名(扔到不同目录),这样就不会被其它应用唤醒,或自行生成新的后台进程耗电了。3刀买捐赠包绝对超值,可用试验特性:允许 GCM 推送唤醒绿化的应用,休眠系统应用,装 Xposed 上 XPrivaxy 框架等,很赞!

Have fun with root!