Nexus 4 刷机备忘

没关注过 Node.js,而且也是新用 github 来写日志,年纪又大了,不想乱折腾,所以——虽然 Hexo 不支持注脚(而本篇又恰巧有注脚),但是我并不打算做些什么。我只是想给文章留存在本地。

Android 入门

原文链接:http://bbs.gfan.com/android-5576468-1-1.html

什么是 Android?

Android(读音:[‘ændrɔid],中文俗称安卓)是一个以 Linux 为基础的半开源操作系统,主要用于移动设备,由 Google 成立的 Open Handset Alliance(OHA,开放手持设备联盟)持续领导与开发中。
wiki

什么是 SDK,我必须安装吗?

SDK = “Software Development Kit”,除非你是开发者,不然这东西完全是浪费空间,你所需要的只是 SDK 中提供的有关 FASTBOOT 与 ADB 的几个文件和驱动而已。

什么是驱动,我为什么要安装呢?

知道什么是驱动就知道为什么了,详见 wiki

我从哪儿能搞到驱动?

这个:http://forum.xda-developers.com/showthread.php?t=1992345
或者这个:http://forum.xda-developers.com/showthread.php?t=1996051
作者推荐第二个

为什么要安装两次驱动?

Android 和 PC 有两种主要的通信方式:FASTBOOT 和 ADB,两种接入方式的驱动是不同的,所以需要安装两次。以 FASTBOOT 方式(bootloader)启动手机,连接电脑后安装一次驱动;而 ADB 模式需要 Android 内核的支持,所以正常启动手机(或者某些自制 recovery,例如 CWM),打开 USB调试(USB debugging),然后连接电脑,安装 ADB 驱动。

怎么进入 bootloader(FASTBOOT 模式)?

关掉手机,摁住音量-键,然后再摁住电源键,直到开机。

什么是命令行?

Windows 下的命令行(Linux / MacOS 下的终端),是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。
wiki:http://zh.wikipedia.org/wiki/%E5%91%BD%E4%BB%A4%E8%A1%8C
TIPS:在文件夹里,摁住 SHIFT 键,然后右键,会看到:在此处打开命令行窗口 的选项。

什么是 bootloader?

Bootloader(引导加载程序)是系统加电后运行的第一段代码,一般运行的时间非常短,但是对于嵌入式系统来说,这段代码非常重要。在我们的台式电脑当中,引导加载程序由BIOS(固件程序)和位于硬盘 MBR 中的操作系统引导加载程序(比如 NTLOADER,GRUB 和 LILO)一起组成。

在一般的典型系统中,整个系统的加载启动任务全由 bootloader 来完成。在 ARM 中,系统上电或复位时通常从地址 0x00000000 处开始执行,而在这个位置,通常安排的就是系统的 bootloader。通过这小段程序可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境设置到一个合适的状态!以为最终调用操作系统内核准备好正确的环境。

bootloader 有锁 / 解锁(locked / unlocked)

你从厂家得到的设备大多是处于有锁状态。出于安全考虑,锁定的 bootloader 只能刷写拥有官方签名的镜像,这意味着你很难改变或者修改操作系统。解锁 bootloader 并不会增加设备的功能,但是解锁后你可以随心所欲的刷写自制镜像与程序,方便折腾……

什么是 root?

root 本质上来说就是你获得了对系统文件与分区的 root 权限,类似于 Windows 的管理员权限。root 跟 bootloader 没半毛钱关系,root 的是系统本身。

怎么 root?

root 的实现过程是:向系统目录下写入一个叫做 su 的可执行文件(功能为获得 root 权限),并安装一个控制该权限开启与关闭的 APP。

(PS:每个命令都有对应的二进制可执行文件,执行命令,就是执行相应的二进制文件的过程,而 %PATH% 保存的就是这些执行文件所在的目录。比方说常见的:cp,ifconfig 这几个命令的执行文件保存在 /system/bin 下;su 和 busybox 的命令,习惯上安装在 /system/xbin 下……)

N4 可用的是 Chainfire 的 SuperSU:http://forum.xda-developers.com/showthread.php?t=1538053

解锁 bootloader 和 root 是一个意思吗?

不是,解锁 bootloader 的作用是方便刷写;root 的作用是获得最高权限,可以随意操作系统文件。

解锁 bootloader 之后必须 root 吗?

No.

解锁 bootloader 后必须刷自制 ROM 吗?

No.

root 之后才能刷 ROM 吗?

No.

什么是 ROM?

这里指 Android 刷机包。

不同版本 Android 的区别是什么?4.2 和 JOP40C 有什么区别?

看这个:http://source.android.com/source/build-numbers.html

原生镜像和自制镜像的区别是什么?

由 Google 开发编译的镜像为原生镜像(stock ROM),其他的都是自制镜像。

总听到 AOSP 这个词,啥意思?

AOSP = Android Open Source Project,他们负责 Android 的源码编写与修改,详情点击这里:http://source.android.com/

什么是 FASTBOOT?

三个意思:

  1. 用来设备和PC间通信的一个命令行工具
  2. fastboot.exe
  3. 设备的一种启动模式

FASTBOOT 是一个特殊的工程模式,通过 fastboot 界面,连接电脑后,我们可以在电脑端通过特殊的指令来操作手机。

使用 FASTBOOT 命令,需要 PC 上要安装有 FASTBOOT 驱动,当前目录下必须存在 fastboot.exe,手机需要以 FASTBOOT 模式启动,然后连接电脑。

FASTBOOT 命令

在 fastboot.exe 所在的文件夹下打开命令行,输入 fastboot,可以看到 fastboot 的命令格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
fastboot
usage: fastboot [ <option> ] <command>
commands:
update <filename> reflash device from update.zip
flashall flash boot + recovery + system
flash <partition> [ <filename> ] write a file to a flash partition
erase <partition> erase a flash partition
format <partition> format a flash partition
getvar <variable> display a bootloader variable
boot <kernel> [ <ramdisk> ] download and boot kernel
flash:raw boot <kernel> [ <ramdisk> ] create bootimage and flash it
devices list all connected devices
continue continue with autoboot
reboot reboot device normally
reboot-bootloader reboot device into bootloader
help show this help message
options:
-w erase userdata and cache
-s <serial number> specify device serial number
-p <product> specify product name
-c <cmdline> override kernel commandline
-i <vendor id> specify a custom USB vendor id
-b <base_addr> specify a custom kernel base address
-n <page size> specify the nand page size. default: 2048

除去上面那些,还有一个 oem 命令。

这些命令,在 FASTBOOT 模式下,不管有没有解锁 bootloader 都可以使用:

  • oem:用来解锁或者锁定 bootloader。例如:fastboot oem unlock是解锁 bootloader 的命令,fastboot oem lock是重新锁定 bootloader 的命令。
  • devices:这命令用来检查设备是否已经正确的以 FASTBOOT 模式连接电脑,例如:fastboot devices
  • reboot:重启命令,例如:fastboot reboot
  • reboot-bootloader:这命令将会让你的设备重启到 bootloader 模式,例如:fastboot reboot-bootloader

下面这些命令只有在解锁 bootloader 后才有效:

  • flash:用来刷写镜像,不能用来刷写来路不明的文件或者 zip。例如,刷写系统区块的命令:fastboot flash system system.img
  • boot:用来让核心从设备储存外的某镜像启动,比方说你文件夹里的 CMW RECOVERY 镜像叫做:recovery.img,输入:fastboot boot recovery.img,便可让设备由 recovery.img 启动,而不用将 CWM 刷写到设备 flash 之后启动。
  • erase:用来擦除某些指定的区块,例如:fastboot erase cache

以上就是会常常用到的 fastboot 命令啦。

什么是 ADB?

ADB = Android Debug Bridge,用来设备和 PC 间通信的另一个工具。使用 ADB 命令,需要手机要启动到 recovery 模式,或者正常启动。一般来说,正常启动的话,需要打开 USB 调试。当前目录下必须存在 ADB 相关的几个文件,PC 上也必须安装有 ADB 驱动。

ADB 命令

在 adb.exe 所在的目录下打开命令行,输入 adb 可以查看 adb 的命令格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
Android Debug Bridge version 1.0.29
-d - directs command to the only connected USB device
returns an error if more than one USB device is present.
-e - directs command to the only running emulator.
returns an error if more than one emulator is running.
-s <serial number> - directs command to the USB device or emulator with
the given serial number. Overrides ANDROID_SERIAL
environment variable.
-p <product name or path> - simple product name like 'sooner', or
a relative/absolute path to a product
out directory like 'out/target/product/sooner'.
If -p is not specified, the ANDROID_PRODUCT_OUT
environment variable is used, which must
be an absolute path.
devices - list all connected devices
connect <host>[:<port>] - connect to a device via TCP/IP
Port 5555 is used by default if no port number is specified.
disconnect [<host>[:<port>]] - disconnect from a TCP/IP device.
Port 5555 is used by default if no port number is specified.
Using this command with no additional arguments
will disconnect from all connected TCP/IP devices.
device commands:
adb push <local> <remote> - copy file/dir to device
adb pull <remote> [<local>] - copy file/dir from device
adb sync [ <directory> ] - copy host->device only if changed
(-l means list but don't copy)
(see 'adb help all')
adb shell - run remote shell interactively
adb shell <command> - run remote shell command
adb emu <command> - run emulator console command
adb logcat [ <filter-spec> ] - View device log
adb forward <local> <remote> - forward socket connections
forward specs are one of:
tcp:<port>
localabstract:<unix domain socket name>
localreserved:<unix domain socket name>
localfilesystem:<unix domain socket name>
dev:<character device name>
jdwp:<process pid> (remote only)
adb jdwp - list PIDs of processes hosting a JDWP transport
adb install [-l] [-r] [-s] <file> - push this package file to the device and install it
('-l' means forward-lock the app)
('-r' means reinstall the app, keeping its data)
('-s' means install on SD card instead of internal storage)
adb uninstall [-k] <package> - remove this app package from the device
('-k' means keep the data and cache directories)
adb bugreport - return all information from the device
that should be included in a bug report.
adb backup [-f <file>] [-apk|-noapk] [-shared|-noshared] [-all] [-system|-nosystem] [<packages...>]
- write an archive of the device's data to <file>.
If no -f option is supplied then the data is written
to "backup.ab" in the current directory.
(-apk|-noapk enable/disable backup of the .apks themselves
in the archive; the default is noapk.)
(-shared|-noshared enable/disable backup of the device's
shared storage / SD card contents; the default is noshared.)
(-all means to back up all installed applications)
(-system|-nosystem toggles whether -all automatically includes
system applications; the default is to include system apps)
(<packages...> is the list of applications to be backed up. If
the -all or -shared flags are passed, then the package
list is optional. Applications explicitly given on the
command line will be included even if -nosystem would
ordinarily cause them to be omitted.)
adb restore <file> - restore device contents from the <file> backup archive
adb help - show this help message
adb version - show version num
scripting:
adb wait-for-device - block until device is online
adb start-server - ensure that there is a server running
adb kill-server - kill the server if it is running
adb get-state - prints: offline | bootloader | device
adb get-serialno - prints: <serial-number>
adb status-window - continuously print device status for a specified device
adb remount - remounts the /system partition on the device read-write
adb reboot [bootloader|recovery] - reboots the device, optionally into the bootloader or recovery program
adb reboot-bootloader - reboots the device into the bootloader
adb root - restarts the adbd daemon with root permissions
adb usb - restarts the adbd daemon listening on USB
adb tcpip <port> - restarts the adbd daemon listening on TCP on the specified port
networking:
adb ppp <tty> [parameters] - Run PPP over USB.
Note: you should not automatically start a PPP connection.
<tty> refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1
[parameters] - Eg. defaultroute debug dump local notty usepeerdns
adb sync notes: adb sync [ <directory> ]
<localdir> can be interpreted in several ways:
- If <directory> is not specified, both /system and /data partitions will be updated.
- If it is "system" or "data", only the corresponding partition
is updated.

有关 backup 和 restore 命令请看这篇非常给力的帖子:http://forum.xda-developers.com/showthread.php?t=1420351

  • devices:这命令用来检查设备是否已经正确的以 adb 模式连接。例如:adb devices
  • reboot:用来重启设备。例如:adb reboot
  • reboot-bootloader:重启设备到 bootloader 模式。例如:adb reboot bootloader
  • push:用来向设备复制文件,比如将 c:\junk.jpg 拷贝到手机 /sdcard 文件夹:adb push c:\junk.jpg /sdcard/(执行前,确保 /sdcard 已经挂载)
  • shell:打开一个可以直接向 Android 系统发送命令的终端,命令:adb shell,你会发现提示符变成了 $ (基本都是常见的 Linux shell 命令)
N4 的区块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/dev/block/platform/msm_sdcc.1/by-name:
lrwxrwxrwx root root 2012-11-13 19:02 DDR -> /dev/block/mmcblk0p24
lrwxrwxrwx root root 2012-11-13 19:02 aboot -> /dev/block/mmcblk0p12
lrwxrwxrwx root root 2012-11-13 19:02 abootb -> /dev/block/mmcblk0p15
lrwxrwxrwx root root 2012-11-13 19:02 boot -> /dev/block/mmcblk0p6
lrwxrwxrwx root root 2012-11-13 19:02 cache -> /dev/block/mmcblk0p22
lrwxrwxrwx root root 2012-11-13 19:02 grow -> /dev/block/mmcblk0p25
lrwxrwxrwx root root 2012-11-13 19:02 m9kefs1 -> /dev/block/mmcblk0p8
lrwxrwxrwx root root 2012-11-13 19:02 m9kefs2 -> /dev/block/mmcblk0p9
lrwxrwxrwx root root 2012-11-13 19:02 m9kefs3 -> /dev/block/mmcblk0p10
lrwxrwxrwx root root 2012-11-13 19:02 metadata -> /dev/block/mmcblk0p18
lrwxrwxrwx root root 2012-11-13 19:02 misc -> /dev/block/mmcblk0p19
lrwxrwxrwx root root 2012-11-13 19:02 modem -> /dev/block/mmcblk0p1
lrwxrwxrwx root root 2012-11-13 19:02 persist -> /dev/block/mmcblk0p20
lrwxrwxrwx root root 2012-11-13 19:02 recovery -> /dev/block/mmcblk0p7
lrwxrwxrwx root root 2012-11-13 19:02 rpm -> /dev/block/mmcblk0p11
lrwxrwxrwx root root 2012-11-13 19:02 rpmb -> /dev/block/mmcblk0p16
lrwxrwxrwx root root 2012-11-13 19:02 sbl1 -> /dev/block/mmcblk0p2
lrwxrwxrwx root root 2012-11-13 19:02 sbl2 -> /dev/block/mmcblk0p3
lrwxrwxrwx root root 2012-11-13 19:02 sbl2b -> /dev/block/mmcblk0p13
lrwxrwxrwx root root 2012-11-13 19:02 sbl3 -> /dev/block/mmcblk0p4
lrwxrwxrwx root root 2012-11-13 19:02 sbl3b -> /dev/block/mmcblk0p14
lrwxrwxrwx root root 2012-11-13 19:02 system -> /dev/block/mmcblk0p21
lrwxrwxrwx root root 2012-11-13 19:02 tz -> /dev/block/mmcblk0p5
lrwxrwxrwx root root 2012-11-13 19:02 tzb -> /dev/block/mmcblk0p17
lrwxrwxrwx root root 2012-11-13 19:02 userdata -> /dev/block/mmcblk0p23

来自这里:http://forum.xda-developers.com/showthread.php?t=1993036

嵌入式系统,区块的大小与配置基本都是固定的……

比方说:lrwxrwxrwx root root 2012-11-13 19:02 system -> /dev/block/mmcblk0p21,你会发现: /system 下挂载的是 mmcblc0p21 这个区块……

  • recovery -> /dev/block/mmcblk0p7
  • userdata -> /dev/block/mmcblk0p23
  • cache -> /dev/block/mmcblk0p22
  • boot -> /dev/block/mmcblk0p6
挂载

这东西自己理解吧。Linux 的目录结构和 Windows 不同,Windows 是先有分区,然后在分区上再产生目录,Linux 下是先有目录结构,将某分区挂载到某目录下,那么该目录就指向这个分区,目录可以理解成指针嘛……

什么是 recovery?

recovery 是一个特殊的启动模式,它提供向设备刷写文件、升级,或者备份等等功能。原装 recovery 功能稀少坑爹,但我们有两个非常给力的自制 recovery:CMW 和 TWRP。

我为什么在 recovery 模式下会看到一个仰面朝天的小绿人?

这是原版 recovery,按下电源键,再按 音量+ 来打开 recovery 菜单。

我刚刷了 CMW,但是每次我想要启动 CMW 都会发现原版 recovery 阴魂不散,怎么回事?

有两个文件会在你每次载入 recovery 时重新刷写 recovery:

  • /system/etc/install-recovery.sh
  • /system/recovery-from-boot.p

PS:这两个文件只有在 OTA 升级之后才会出现。
删除或者将它们重命名,然后重新刷写 CMW,就能固定 CMW 了。
这帖子提供了一个 recovery disabler:http://forum.xda-developers.com/showthread.php?t=1995440

Nexus 4 刷机、解锁、root、busybox

原文链接:http://bbs.gfan.com/android-5795118-1-1.html
原文最后更新时间:2013-07-30(Android 4.3 版本)

这帖子会给出一个详细的 刷写 Google 开发者网站上放出的工厂镜像 的过程。
按照这里的步骤,可以让你的 N4 几乎恢复到和刚出厂时一样。
而这个过程,也是就通常的刷机过程。
鉴于目前自制 ROM 基本以 zip 压缩文档的方式发布,这个过程也就只是用来刷原生 ROM 了。

Note
  1. 有很多一键教工具可以让刷机变得无脑,但是我还是想写这样一个详细到每个步骤的帖子,在使用一键工具前对整个过程有一个详细的了解是必要的;
  2. 略长……且整个帖子枯燥乏味,图片极少,文字极多……纯手工向教程……
  3. 大部分命令后都标有注释,便于理解。请不要忽略注释部分。
常用工具网址
Step-by-step

对于新手:务必读完帖子后再去尝试

安装驱动
  1. 不要用XX助手提供的驱动,除非你对它充满信心。以防万一,卸载掉这些第三方驱动;
  2. 下载 这里 提供的驱动;
  3. 按论 坛置顶贴 里的方法安装驱动(大体来说就是:设备管理器,在设备名上右键,更新驱动,手动选择文件夹)。注意,你需要安装 2 次驱动:开启 USB 调试连接电脑一次,启动到 bootloader 连接到电脑一次。

PS:N4 板载驱动就是目前的最新版本,但是考虑到自动安装驱动的不稳定,还是手动安装下比较安心。

备份自己的数据
  1. 随便什么方法,比方说用 Titanium_Backup 备份联系人、短信、APP和数据,然后手动备份 /sdcard 里的图片、文档、音乐等……
  2. 按照下面的步骤,会 wipe 掉你的全部数据,包括 /sdcard,所以一定要做好备份工作后再动手;
  3. XX助手之类的也可以备份吧?(没用过)
下载所需的文件
  1. 所有会用到的文件,请务必放在同一个文件夹下,文件夹名字随意(尽量避免使用中文),文件夹路径中尽量避免包括中文;
  2. 下载 android-adb_fastboot-16.01.zip^1 (539.13 KB) <- 就是:fastboot.exe 和 ADB 什么的;
  3. 这里 下载工厂镜像,或者这里:Random Phantasmagoria,注意你下载的是 occam 开头的 Nexus 4 的镜像;
  4. 用 7-zip,或者保证你的 winRAR 版本较新,把第三步下载回来的 工厂镜像 及 android-adb_fastboot-16.01 都解压到同一文件夹中。
    然后把解压出来的 image-occam-jwr66v.zip 也解压到这里(image-occam-jwr66v.zip -> boot.img, recovery.img, system.img, userdata.img)
    [暂未处理原文中的图片]
  5. 手机重启到 bootloader(开机时按住 音量- 和 电源键,直到看到 Android 机器人为止),连接电脑;
  6. 在上面那些文件所在的文件夹里,按住 shift 然后右键,选择在此处打开命令行窗口。
输入刷机指令 及 常见问题解决
  1. 其实你可以直接运行 zip 包中的 flash-all.bat!但是这有违我们的初衷,所以请按照以下步骤一步一步来。
  2. 输入:fastboot devices来确定你的手机已经正确连接;
  3. 解锁 bootloader(如果你还没有解锁):fastboot oem unlock
  4. 你的手机会提醒你:==This will wipe your entire device (including the /sdcard folder)==,意思说你要是敢点确定,你手机里的东西就都完蛋啦。如果没备份的话,赶快回去备份,然后用音量键选择,电源键确定。
  5. 重启:fastboot reboot-bootloader
  6. 刷写 bootloader:fastboot flash bootloader bootloader-mako-makoz20i.img,其中 ==bootloader-mako-makoz20i.img== 为 bootloader 镜像的名字,用来刷写 bootloader;
  7. 重启 bootloader:fastboot reboot-bootloader
  8. 刷写 radio:fastboot flash radio radio-mako-m9615a-cefwmazm-2.0.1700.84.img,其中 ==radio-mako-m9615a-cefwmazm-2.0.1700.84.img== 为 radio 镜像的名字,用来刷写 radio;
  9. 重启 bootloader:fastboot reboot-bootloader
  10. 刷写 system 区块:fastboot flash system system.img
  11. 可选,刷写 data 区块[^2]:fastboot flash userdata userdata.img。这条命令会 wipe 掉包括 /sdcard 中的所有数据;
  12. 刷写 kernel 和 ramdisk:fastboot flash boot boot.img。用来刷写 kernel,刷完第三方 kernel 想恢复时,重新刷写 ==boot.img== 即可;
  13. 可选,刷写 recovery:fastboot flash recovery recovery.img
  14. 擦除 cache 区块:fastboot erase cache。注:fastboot erase <partition> 命令用来 wipe cache, data, system……
  15. 重启:fastboot reboot
  16. 这次启动用时会比较多(10 多秒吧),因为 Android 在建立 Dalvik cache。

现在你的 N4 除了是已经解锁 bootloader 之外,和它刚出厂时几乎一样了。有强烈需求的话,你也可以用:fastboot oem lock 来重新锁定 bootloader。

贴出压缩档中 flash-all.bat 的内容,加上注释:

1
2
3
4
5
6
7
8
9
10
11
12
::只是一个简单的批处理, 写上注释供新手与上面步骤对照用
PATH=%PATH%;"%SYSTEMROOT%\System32" ::添加环境变量
fastboot flash bootloader bootloader-mako-makoz10o.img ::刷写bootloader
fastboot reboot-bootloader ::重启
ping -n 5 127.0.0.1 >nul ::延时
fastboot flash radio radio-mako-m9615a-cefwmazm-2.0.1700.48.img ::刷写radio
fastboot reboot-bootloader ::重启
ping -n 5 127.0.0.1 >nul ::延时
fastboot -w update image-occam-jdq39.zip ::刷写:boot.img, recovery.img, system.img, userdata.img
echo Press any key to exit...
pause > nul
exit

  • 如果卡在 X 那个界面很长时间,请重启,进入 bootloader,音量键选择,电源键确定,进入 recovery,你会看到一个躺在地上的 Android 机器人肚子上有一个红色感叹号……
    然后先按着电源键,再按下 音量+ 打开 recovery 菜单,选择 ==wipe cache==,重启;
    如果重启后依然卡在 X 那个界面上,再次进入 recovery,选择 ==factory reset==,重启。

  • 如果出现 16G 变 8G 的情况,请进入 recovery,==wipe cache==,然后 ==factory reset==,重启。如果没有依然没有起作用,按照下面的步骤来:

    1. 启动到 bootloader,连接电脑;
    2. 在刚才那个文件夹——就是 fastboot.exe 所在那个文件夹,按住 shift,然后右键,然后选择 在此处打开命令行;
    3. 输入:fastboot devices 来确认手机正确连接;
    4. 输入:fastboot erase boot 来擦除 boot 区块;
    5. 输入:fastboot erase cache 来擦除 cache 区块;
    6. 输入:fastboot erase recovery 来擦除 recovery 区块;
    7. 输入:fastboot erase system 来擦除 system 区块;
    8. 输入:fastboot erase userdata 来擦除 userdata 区块;
    9. 输入:fastboot flash bootloader bootloader-mako-makoz20i.img 来刷入 bootloader;
    10. 重启 bootloader:fastboot reboot-bootloader
    11. 待重启后输入:fastboot -w image-occam-jwr66v.zip 来刷入 boot.img, recovery.img, system.img, userdata.img
root(可选
  1. 下载 CMW 或者 TWRP;
  2. 重命名为 customrecovery.img 丢到刚才那个文件夹里;
  3. 下载 SuperSU,并拷贝到你的 N4 里;
  4. 重启 N4 到 bootloader;
  5. 打开命令行,输入:fastboot -c "lge.kcal=0|0|0|x" boot customrecovery.img[^3]。这步的作用是:以 customrecovery.img 启动,并不是刷入!如果想要刷入的话,改成:fastboot flash recovery customrecovery.img
  6. N4 会以 customrecovery.img 启动,然后找到类似于:==update zip from sdcard== 的选项,选择刚才拷贝到 N4 里的 zip,确定。
  7. 重启。
安装 busybox(可选
  1. 什么是 busybox:http://zh.wikipedia.org/zh-cn/BusyBox ;需要 root 权限。
  2. busybox 官网,或者这里:https://code.google.com/p/yangapp/ 下载 busybox;
    推荐后者:后者对 Android 做过一些调整。
  3. 解压,将 busybox-1.20.2r2 拷贝到手机中;
  4. 开启 USB 调试:连续点击 设置 -> 关于手机 -> 版本号 7 次,你才能召唤开启开发者选项,返回设置,就会发现多出来开发者选项,进去勾选 USB 调试;
  5. 连接电脑,在(adb.exe, AdbWinApi.dll, AdbWinUsbApi.dll)所在的文件夹中按下 shift,然后点击右键,选择 在此处打开命令行 后,输入:adb devices 来确定手机正确连接,这时手机会弹出授权提示,确定;
  6. 输入:adb shell 来开启一个 shell;
  7. 输入:su 来取得 root 权限,手机上 SuperSU 会有授权提示,确定;
  8. 输入:mv /mnt/sdcard/busybox-1.20.2r2 /mnt/sdcard/busybox 来重命名 busybox-1.20.2r2 为 busybox;
  9. 输入:mount -o remount,rw -t ext4 /dev/block/mmcblk0p21 /system 来挂载 /system;
  10. 输入:cp /mnt/sdcard/busybox /system/xbin 来拷贝 busybox 到 /system/xbin;
  11. 输入:cd /system/xbin 来切换工作目录到 /system/xbin;
  12. 输入:chmod 755 busybox 来修改 busybox 权限;
  13. 输入:busybox --install /system/xbin 来安装到 /system/xbin。–install 后跟要安装到的目录;
  14. 安装完毕,可以输入:ll,会发现多出很多命令的执行文件……

PS:在手机上也可以安装的~安装 terminal emulator,拷贝 busybox 到 N4,打开 terminal emulator,然后从第 5 步开始,命令是完全一样的哦~既然已经开始关注 busybox,不妨去看看常见的 Linux 命令吧。

ADB 使用说明

不要忽视 adb,这两个工具联合起来是很强大的。adb 最常用的就是:

  1. adb shell:打开一个 shell 窗口,然后就可以使用常见的 shell 命令来操作。例如,上面的安装 busybox 的过程;
  2. adb push <local> <remote>:将本地 文件/文件夹 拷贝到手机上指定的位置,<local> 为想要拷贝的 文件/文件夹 的相对路径或绝对路径,<remote> 为向要拷贝到的位置。例如,将 adb 所在文件夹下的 xxx.zip 拷贝到手机 /sdcard 下可以输入:adb push xxx.zip /sdcard/ 或者 adb push x:\xxxx\xxx\xxx.zip /sdcard/
  3. adb pull <remote> [<local>]:将手机中的文件,拷贝到电脑的指定位置,<remote> 为想要拷贝的 文件/文件夹 绝对路径,[<local>] 为想要拷贝到的位置,不写的话,默认为当前目录;
  4. CMW 和 TWRP 包括原生 recovery 是支持 adb 的。进入 recovery,然后连接电脑,输入:adb devices,会显示手机的接入方式是:recovery。
    举个栗子:在某次替换文件之后无法进入系统,除了刷一遍 system.img 之外,还有什么办法?你可以启动 CMW 或 TWRP,然后连接电脑,然后用adb push将正确的文件拷贝到 /sdcard,然后adb shell,挂载 /system,将正确的文件替换过去。
    再举个栗子:系统启动不了但是有想要把卡里的文件备份出来,就可以启动 CMW 或 TWRP,连接电脑,然后用adb pull来吧文件拷贝出来。
其他相关说明
  1. 希望你看到这里,已经对 fastboot 的常见用法烂熟于心,对刷机过程有一个清晰的了解。有人用 tookit,有人用 fastboot 和 adb,你喜欢那个?
  2. bootloader, radio, system, boot, userdata, recovery 每个区块都可以单独刷写,因为他们的位置以及大小是固定的:
    system -> /dev/block/mmcblk0p21
    recovery -> /dev/block/mmcblk0p7
    userdata -> /dev/block/mmcblk0p23
    cache -> /dev/block/mmcblk0p22
    boot -> /dev/block/mmcblk0p6
  3. 以刷 recovery 为例:fastboot flash recovery xxxx.img(个人推荐触屏版 TWRP 和 按键版 CMW)的格式为:fastboot flash <partition> [<filename>](其中 xxxx.img 为 recovery 镜像名);
写在最后
  1. 上面几乎囊括了刷机时你所需要了解的全部过程。第三方 ROM 常为 zip 压缩包,用 CMW 或 TWRP 直接安装即可;
  2. 如果想要正常接收 OTA 并自动安装的话,你必须保证 bootloader, radio, boot, radio 和 recovery 的镜像是原生 ROM 中所提供的;
  3. 没有必要重新锁定 bootloader。unlock bootloader 完全不会影响 ROM 的功能,也不会影响 OTA。

更好的使用 Android

以下问题的解决办法均来自互联网。如果我能标记出原文地址的话,我会标出来的。

Google Maps 7 开启位置记录

原文地址:http://www.80sidea.com/archives/3441

很多人不喜欢 Google 位置记录这个东西,觉得隐私问题大如天,不过翻出手机看看垃圾短信,立马平衡了,反正咱不缺这点。

但是升级到 Google Maps 7 之后在国内就无法再使用位置报告和位置记录了,提示无法在中国使用,https://maps.google.com/locationhistory/ 也变空白了,估计是示好吧。
恢复使用位置记录一个方法就是继续使用 6 系列版本,不过这好像有点舍本逐末吧,还有就是安装 Market Unlocker、Market Enabler 之类的软件,不过据说有些软件安装了之后就无法纠偏了,原因如下:……
如果不想为了这个功能装个开机就运行的软件的话,最简单的方法应该是安装一个终端模拟器(通俗说是命令行窗口)直接运行下面两句(前提是 Root)

1
2
su
setprop gsm.sim.operator.numeric 310260

其实就是修改 sim 卡标识,让地图认为你是美国 T-Mobile 用户,在 Play 中显示的运营商就是 T-Mobile。
存为 sh 脚本每次开机后直接打开 Root Explorer 执行(注意:SD 卡中脚本无法运行,放 /cache 或者 /data/local 中并修改权限为可运行)也可以。
还有些 ROM 可以开机自动运行脚本,比如 /etc/init.d/ 或者 /system/etc/init.d/ 或者 /system/etc/install-recovery.sh,就是需要先判断 gsm.sim.state = “READY” 。
亲测 7.4 版本改了之后等一段时间(可以需要 6 个小时或更多,恢复也是)就可以启用位置报告和位置记录了,唯一的问题是重启后需要重新设置,不过话说现在手机重启机会不多吧。
另外还有几个参数,通过 getprop 都可以看到的:

  • gsm.operator.numeric
  • gsm.operator.iso-country
  • gsm.operator.alpha
  • gsm.sim.operator.numeric
  • gsm.sim.operator.iso-country
  • gsm.sim.operator.alpha
  • numeric 是运营商代码 MCC+MNC,连起来不能忽略0
  • iso-country 是国家代码,什么 cn、us 之类的
  • alpha 是运营商名称

带 sim 的据说表示你用的电话卡的属性,用来判断你在那个国家,主要通过 numeric 属性判断,其它改不改无所谓,所谓破解电子市场也是改这个东西,不带 sim 的据说是网络属性,用来判断地图是否纠偏,比如你在美国用移动卡 sim 属性肯定和国内一样,但是肯定是接入美国运营商的网络
顺便说下,估计 Google 凡是存储入库的坐标都是 WGS84 坐标来计算的,只是显示时根据实际情况来判断并纠编,所以在 https://maps.google.com/locationhistory/ 看到的都是偏的,Ingress 中也是,之前我的足迹也是偏的。
其它国家运营商代码表参考 http://zh.wikipedia.org/wiki/移动设备网络代码
在 /data/data/com.android.providers.telephony/databases/telephony.db 中也可以查询到运营商信息。
至于想解锁市场,随便想个办法进市场去买一个需要钱的东西(比如你去买个 Nexus 5),光下单不结账,以后你的市场就永久解锁了。

怎样科学地给 Android(4.x)换字体

原文链接:http://zhuanlan.zhihu.com/cheng/19665011

看到了这个问题,感觉字体的效果很差,应该是换字体的方式太不科学了。很多软件换字体都是直接替换 Roboto 的,这样破坏了系统的字体回退机制,直接使用了中文字体的西文部分(通常品质不高),我认为更科学干净和安全的更换字体的方法是这样的:不要替换原有的字体文件,而是修改系统的配置文件,添加新的字体。

当然这一切的前提是你有 root 权限。

把要更换的字体文件(ttf 或者 otf)复制到 /system/fonts/,并且把权限设置成 -rw-r–r–;如果你要修改中文字体,打开 /system/etc/fallback_fonts.xml,仿照已经有的配置,在 DroidSansFallback 之前添加一个 <family> ,里面的是你要修改的字体的文件名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!-- 以上省略 xx 字 -->
<family>
<fileset>
<file>NanumGothic.ttf</file>
</fileset>
</family>
<family>
<fileset>
<file>AndroidEmoji.ttf</file>
</fileset>
</family>
<!-- 在这里加上你的字体 开始 -->
<family>
<fileset>
<file>MyFont-Regular.ttf</file>
<file>MyFont-Bold.ttf</file>
<file>MyFont-Italic.ttf</file>
<file>MyFont-Bolditalic.ttf</file>
</fileset>
</family>
<!-- 在这里加上你的字体 结束 -->
<family>
<fileset>
<file>DroidSansFallback.ttf</file>
</fileset>
</family>
<!-- 以下省略 yy 字 -->

值得注意的是,一个 <fileset> 下面可以又多个 <file>,分别对应常规体、粗体、斜体、粗斜体。 当然,一般的中文字体没有后两种风格。

为什么不建议替换掉 DroidSansFallback.ttf 呢,因为这个字体的字数很多,可以显示很多生僻字和特殊符号(比如国际音标);而一般你能获得的中文字体都没有这么全,所以如果替换掉它,很多生僻字和符号就可能显示不出来了。将它留在配置文件里的话,当遇到你的自定义字体中没有的字符时,就会 fallback 到 DroidSansFallback.ttf 来显示了。

如果要修改西文字体,复制西文字体文件(比如 Helvetica)到 /system/fonts/,并且把权限设置成 -rw-r–r–,请去修改 /etc/system_fonts.xml,把里面的 Roboto.ttf 等字体修改成你的字体。这个配置文件里面字体的风格很多,有 regular、bold、light、thin、italic、light italic、bold italic、condensed 等等,注意你复制过来的字体最好也包含有这些风格。

我的 Nexus 4 升级之路

Android 5.0

@20141130:前两天根据工厂镜像给 Nexus 4 刷了 Android 5.0。Android 5.0 开始支持多用户,同时有优先打断设置——我不知道 4.3 或者 4.4 有没有这样的功能,因为之前我需要虚拟串号来登陆我家老大的 CRM 系统,所以一直保持手机在 4.2 版本。总体说来,Android 5 用起来体验还是很棒的~

Android 6.0
How to build Android Marshmallow on Nexus 4

原文链接:Dmitry Grinberg / Thoughts / Android M on Nexus 4,各位可以去原贴看留言涨姿势。

UPDATE: Uploaded new source and binaries that fix an issue some people had with cellular data. The links below represent the new files.

Many were very sad when google chose not to update Nexus 4 to Android 6.0 Marshmallow. This simple guide will show you how to build Android 6.0 Marshamllow for Nexus 4. You’ll be amazed how simple it is. And for the lazy, I also have a pre-built AOSP Marshmallow image set to download on the bottom of this page. Also, LTE works in this set of images :) Since Nexus 4 was originally a Google-Play-equipped device, you can legally install Google Apps on this image and enjoy a full Google Android 6.0 experience on your Nexus 4. That part, however, is up to you to do yourself. I am not offering GApps downloads here.

  1. Download Android 5.1.1 AOSP sources
  2. Download Android 6.0 AOSP sources
  3. Download Binary blobs for Nexus 4 (mako) for LMY48T
  4. Download Nexus7 (razor) factory images for 6.0 (MRA58K)
  5. from 5.1.1 AOSP copy to 6.0 the /device/lge/mako folder
  6. you may now delete 5.1.1 sources
  7. apply the diff from the package below to that folder
  8. extract proprietary binaries for Mako
  9. lunch & make Marshmallow for mako (to produce simg2img mostly)
  10. use simg2img on the Nexus7 factory /system image to convert it to a normal ext4 image
  11. mount nexus7 /system image and copy the following files from it over the corresponding files in your build folder provided by binary blob packages:
    • /vendor/lib/egl/eglsubAndroid.so
    • /vendor/lib/egl/libEGL_adreno.so
    • /vendor/lib/egl/libGLESv1_CM_adreno.so
    • /vendor/lib/egl/libGLESv2_adreno.so
    • /vendor/lib/egl/libplayback_adreno.so
    • /vendor/lib/egl/libq3dtools_adreno.so
    • /vendor/lib/libCB.so
    • /vendor/lib/libsc-a3xx.so
    • /vendor/lib/libc2d30-a3xx.so
    • /vendor/lib/libc2d30.so
    • /vendor/lib/libC2D2.so
    • /vendor/lib/libllvm-qcom.so
    • /vendor/lib/libgsl.so
  12. replace prebuilt mako kernel with provided kernel (all the patches that went into it over the 5.1.1 kernel are included)
  13. make clean & build Marshmallow for Mako again
  14. flash & enjoy. Tested: WiFi, BT, GPS, NFC, Cellular, Camera

For extra credit, if you flash an OLD radio (initial radio release for Mako), this ROM will support LTE :)

Download patches if you want to make the build yourself: => [PACKAGE YOU’LL NEED (mirror)] <=

Or, a full working image, including the LTE radio image => [WORKING IMAGE (mirror)] <= It is fully usable userdebug image. Tested: sensors, NFC, WiFi, Bluetooth, Camera, Cell, GPS

我的安装步骤

参考链接:

@20160103:以下内容仅为个人记录用,并没有优化过程。
如果这篇文档有观众,且观众想安装 Android M 的话,建议移步 http://www.jianshu.com/p/47f3db03ec1d 看这位仁兄的安装方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
:: 安装手机驱动(http://developer.android.com/sdk/win-usb.html)后进行操作
:: 解压从 Dmitry Grinberg 网站上下载下来的 MakoM_bin_v2.zip
adb reboot bootloader :: 重启手机到 bootloader
fastboot devices :: 查看连接到的手机
fastboot flash boot boot.img :: 刷入 MakoM_bin_v2 里的 boot.img
fastboot flash system system.img :: 刷入 MakoM_bin_v2 里的 system.img
fastboot flash radio n4_lte_modem.img :: 刷入 MakoM_bin_v2 里的 n4_lte_modem.img
fastboot reboot-bootloader :: 重启手机到 bootloader
:: 到 TWRP 官网下载最新的 TWRP 后继续
fastboot devices :: 查看连接到的手机
fasboot flash recovery twrp-2.8.7.0-mako.img :: 为手机刷入 twrp
fastboot reboot-bootloader :: 重启手机到 bootloader
:: 开机,过程很漫长啊。开机后有报错,报错内容好像来自 Google Play services 的。原因是我未清除之前的数据。
:: 解决上面的 Google Play services 报错(清除设置这一步其实应该放在第一步操作)
adb reboot bootloader :: 重启手机到 bootloader
:: 进入 twrp -> Wipe -> Advanced Wipe -> 先清 data,然后再清 Cache
:: 重启机器开机,一切正常了

弄完上面的,手机无报错开机。
下面的,就随意了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
:: 准备刷入 GApps
adb reboot bootloader :: 重启手机到 bootloader
:: 进入 twrp -> Advanced -> ADB Sideload -> Swipe to Start Sideload
adb devices :: 如果找不到手机的话,见 http://stackoverflow.com/questions/26965666/adb-says-device-not-found-at-last-stage-of-sideloading-lollipop
adb sideload BaNkS_Dynamic_GApps_6.x.x_12-22-15_23_20.zip :: 刷入 GApps
:: 这里用的是 BaNkS_Dynamic_GApps_6.x.x_12-22-15_23_20.zip。但是有一个传说中的可用的、更好的 GApps 的下载地址为:http://androiding.how/android-6-0-marshmallow-gapps/
:: 开机。开机后报错 Setup wizard 和 Google Play services 的错——有人是通过 TWRP 的 factory reset 操作来修复这两个错误的,但是我并未这样试过。
:: Setup wizard 错误解决:
adb root
adb remount
adb shell
pm disable com.google.android.setupwizard :: 关闭 Setup wizard
:: 然后在设备上操作:settings -> apps,在菜单里选中 show system,然后给 Google 的众多 app 它们所需的权限。
adb shell
pm enable com.google.android.setupwizard :: 打开 Setup wizard
am start -n com.google.android.setupwizard/.SetupWizardTestActivity :: 启动设置向导,但是这会导致点击菜单键后屏幕上一直有个圆圈在转,好奇怪。可能需要重启一次机器。
:: Google Play services 错误的解决(安装 Google Play services 这一步其实应该放在第一步操作,否则的话,上面的 GApps 中的版本会比现在要安装的这个程序的版本高)
adb install -r "com.google.android.gms_8.1.18_(2272748-436)-8118436_minAPI23(armeabi-v7a)(320dpi).apk" :: 可能因为之前的 Google Play services 版本过高而安装失败
:: 这个 gms 的下载地址为 http://www.apkmirror.com/apk/google-inc/google-play-services/google-play-services-8-1-18-2272748-436-android-apk-download/

上面完成了 GApps 的安装。虽然其运行的稳定性需要过段时间来检验。
接下来是 root 手机。好像暂时没有什么好的 root 方案啊啊啊啊。
请不要使用下面的方法 root 手机,因为会导致机器卡在开机界面!

1
2
3
4
5
:: root Nexus
:: 将 BETA-SuperSU-v2.52.zip 上传到手机的存储中,然后执行如下操作
adb reboot bootloader :: 重启手机到 bootloader
:: 进入 twrp -> Install -> 选中 BETA-SuperSU-v2.52.zip -> Swipe to Confirm Flash
:: 重启手机后,然而并没有成功 root,而是卡在了开机界面。

成功 root 手机之后,好像就没有什么了。
下面是网上见到的一些问题及解决办法,这里先记下来,以免到时遇到了再找。那样太累了。

1
2
3
4
5
:: 以下是被报告的问题,但是目前我还没有遇到的部分:
:: 待确认 location(GPS) issue
:: http://forum.xda-developers.com/showpost.php?p=63229334&postcount=434
:: 待确认 Can't Turn On Google Now, Google App Stopped
Go to Settings -> Apps -> Gear Icon -> Default Apps -> Assist & Voice Input -> Assist App -> (Set to NONE then Set it back to Google App).

[^2]: 跳过本步骤可以保留 APP 数据(取决于是什么 APP)和 /sdcard 中的文件,但是当你卡在启动界面上时,你就得进入 CMW 或者 TWRP,然后 ==wipe data== <- 这会 wipe 掉你 APP 的数据,但不会 wipe 掉 /sdcard 。新手请不要尝试!
[^3]: 出于某种考虑,z20i 版本的 bootloader 已经不能使用 fastboot boot customrecovery.img 的方法来由 customrecovery.img 启动了,如果想从 .img 启动,得用命令:fastboot -c "lge.kcal=0|0|0|x" boot customrecovery.img