上周入手了Nexus4,今天有时间自己编了包出来并成功烧到手机,现在总结一下过程。
过程主要参考了Android官方的两篇文章:“Building the System” 和 “Building for devices”
第一步:download Android代码:
按照官方的介绍下载代码即可,注意Nexus4的branch可以用android-4.2.2_r1,Nexus系列手机和对应的android branch版本在 “Codenames, Tags, and Build Numbers” 都可以查到。我们家里是10M的联通光纤,昨天晚上一个多小时就下载完了,而且中间没有出现断链等情况,比较理想;
第二步:获得驱动
Google所有Nexus的手机驱动都可以在“Binaries for Nexus Devices” 取到, Nexus4的驱动文件一共有3个包:
NFC、 Camera、Sensors、Audio、DRm、Cryptography、Graphics、Bluetooth、Media等等,我们只需要下载这3个包,解压后得到3个sh文件,在解压的目录下分别执行这3个sh脚本(不分先后顺序),就可以得到vendor目录,下面包括了来自3个厂商的驱动代码,把这个vendor目录整个直接copy到源码目录下。
第三步:编译
执行命令:
$ source build/envsetup.sh
$ lunch
Nexus的工程代号是mako,其它nexus手机的对应代号可以从“Binaries for Nexus Devices”找到完整的对应关系。
You're building on Linux
Lunch menu... pick a combo:
1. full-eng
2. full_x86-eng
3. vbox_x86-eng
4. full_mips-eng
5. full_grouper-userdebug
6. full_tilapia-userdebug
7. mini_armv7a_neon-userdebug
8. mini_armv7a-userdebug
9. mini_mips-userdebug
10. mini_x86-userdebug
11. full_mako-userdebug
12. full_maguro-userdebug
13. full_manta-userdebug
14. full_toroplus-userdebug
15. full_toro-userdebug
16. full_panda-userdebug
Which would you like? [full-eng] 11
这里选择“11” 。
之后就可以使用make命令编译了:
$make -j10
经过一段稍微漫长的时间编译,在out/target/product/mako目录下就会生成三个img文件, ramdisk.img+userdata.img+system.img.
只要编译成功完成,就不用care这些文件,在当前shell下执行fastboot和adb看是不是都生成,如果没有的话就需要手动再编译出来,执行$make fastboot adb.
第四步:Bootloader解锁
我们买来的Nexus4默认都是锁了bootloader的,但是为了烧自己编的系统或者其他第三方ROM就需要解锁bootloader,google提供了接口让开发者可以方便的解锁。
先把Nexus4关机,然后同时按下两个音量键和power键,一直按住直到界面上出现bootloader的画面。
这时用usb线连上手机,在shell里执行:
$ fastboot oem unlock
幸运的话会得到结果如下:
[email protected]:~/my_repo/nexus4# fastboot oem unlock
...
OKAY [104.945s]
finished. total time: 104.945s
这个过程中间界面上会出现提示让你选择accept解锁,按照操作提示执行就oK
google的官方介绍里还给出了format cache和userdata的命令,觉得有必要的话也可以执行一下,注意数据备份。
[email protected]:~/my_repo/nexus4# fastboot format cache
erasing 'cache'...
OKAY [ 0.022s]
formatting 'cache' partition...
Creating filesystem with parameters:
Size: 587202560
Block size: 4096
Blocks per group: 32768
Inodes per group: 7168
Inode size: 256
Journal blocks: 2240
Label:
Blocks: 143360
Block groups: 5
Reserved block group size: 39
Created filesystem with 11/35840 inodes and 4616/143360 blocks
sending 'cache' (10984 KB)...
writing 'cache'...
OKAY [ 1.270s]
finished. total time: 1.292s
# fastboot format userdata
erasing 'userdata'...
OKAY [ 5.090s]
formatting 'userdata' partition...
Creating filesystem with parameters:
Size: 14129561600
Block size: 4096
Blocks per group: 32768
Inodes per group: 8144
Inode size: 256
Journal blocks: 32768
Label:
Blocks: 3449600
Block groups: 106
Reserved block group size: 847
Created filesystem with 11/863264 inodes and 95427/3449600 blocks
sending 'userdata' (137438 KB)...
writing 'userdata'...
OKAY [ 15.479s]
finished. total time: 20.569s
第五步:烧系统
一切准备就绪后,就可以把编好的系统烧入手机了,执行命令:
[email protected]# fastboot -w flashall
在Root目录下可能会提示ANDROID_PRODUCT_OUT变量不存在。退出root shell在刚刚编译的用户shell下看看ANDROID_PRODUCT_OUT的值然后再重新切到root下export一下即可:
error: neither -p product specified nor ANDROID_PRODUCT_OUT set
[email protected]:~/my_repo/nexus4# exit
exit
[email protected]:~/my_repo/nexus4$ echo $ANDROID_PRODUCT_OUT
/home/xxxx/my_repo/nexus4/out/target/product/mako
[email protected]:~/my_repo/nexus4$ sudo -s
[email protected]:~/my_repo/nexus4# export ANDROID_PRODUCT_OUT=/home/xxxx/my_repo/nexus4/out/target/product/mako
[email protected]:~/my_repo/nexus4# fastboot -w flashall
--------------------------------------------
Bootloader Version...: MAKOZ10o
Baseband Version.....: M9615A-CEFWMAZM-2.0.1700.48
Serial Number........: 019xxxxxxxxxxx [IMEI号]
--------------------------------------------
checking product...
OKAY [ 0.002s]
sending 'boot' (5898 KB)...
OKAY [ 0.372s]
writing 'boot'...
OKAY [ 0.304s]
sending 'recovery' (6396 KB)...
OKAY [ 0.402s]
writing 'recovery'...
OKAY [ 0.325s]
erasing 'system'...
OKAY [ 0.845s]
sending 'system' (234361 KB)...
OKAY [ 14.649s]
writing 'system'...
OKAY [ 13.133s]
erasing 'userdata'...
OKAY [ 0.626s]
formatting 'userdata' partition...
Creating filesystem with parameters:
Size: 14129561600
Block size: 4096
Blocks per group: 32768
Inodes per group: 8144
Inode size: 256
Journal blocks: 32768
Label:
Blocks: 3449600
Block groups: 106
Reserved block group size: 847
Created filesystem with 11/863264 inodes and 95427/3449600 blocks
sending 'userdata' (137438 KB)...
writing 'userdata'...
OKAY [ 15.491s]
erasing 'cache'...
OKAY [ 0.038s]
formatting 'cache' partition...
Creating filesystem with parameters:
Size: 587202560
Block size: 4096
Blocks per group: 32768
Inodes per group: 7168
Inode size: 256
Journal blocks: 2240
Label:
Blocks: 143360
Block groups: 5
Reserved block group size: 39
Created filesystem with 11/35840 inodes and 4616/143360 blocks
sending 'cache' (10984 KB)...
writing 'cache'...
OKAY [ 1.274s]
rebooting...
至此,编好的系统已经烧入手机,手机会自动重启进入新的系统,编译和烧入手机算顺利完成。
但是进入启动后的手机你会发现,只有几个仅有的app,google native的应用都没有了,于是我们就要想办法恢复google的服务出来,我再单独写个笔记记录恢复google service的事情吧。