2.获取硬件驱动
- Google提供的所有 Nexus系列设备的硬件驱动的二进制文件在以下网址中均可下载 https://developers.google.com/android/nexus
- 找到(我的是nexus5,你的自己选择,源码是4.4)
Nexus 5 (GSM/LTE) binaries for Android 4.4 (KRT16M)
Hardware Component Company Download MD5 Checksum SHA-1 Checksum NFC, Bluetooth, Wi-Fi Broadcom Link bc912bc141f63859e37f59e1bfa1639b 896abf0ba601d261b368e1ac5504dee846447ea1 Camera, Sensors, Audio LG Link c27922b7aeb0f0f85fdeba160b143368 78d36576ff70fe766144e19e48a22920b8a52afb Graphics, GSM, Camera, GPS, Sensors, Media, DSP, USB Qualcomm Link c2a05e15773adebf45955a97a5271dc8 a5db0602f04ee5991dad387cd602f570a1e50929 下载完成后将三个压缩包解压至Android源码根目录(WORKING_DIRECTORY),
得到三个.sh文件extract-broadcom-hammerhead.sh、extract-broadcom-hammerhead.sh、extract-broadcom-hammerhead.sh,
分别执行这三个shell脚本(会提示是否接受License之类的,I ACCEPT即 可),会在源码目录下新生成一个/vendor目录,里面就是Nexus5所需的相关硬件驱动二进制文件
(一定要在编译Android源码前确保在源码根目录有官方提供的硬件驱动目录vendor,否则编译完成烧录后reboot会因为缺少硬件驱动卡在Google启动画面上)
3.编译Android源码
初始化编译环境
执行初始化编译环境的脚本:注(在源码根目录WORKING_DIRECTORY)
kevint@kevintcl:WORKING_DIRECTORY$ source build/envsetup.shincluding device/asus/tilapia/vendorsetup.sh
including device/asus/grouper/vendorsetup.sh
including device/asus/deb/vendorsetup.sh
including device/asus/flo/vendorsetup.sh
including device/generic/x86/vendorsetup.sh
including device/generic/armv7-a-neon/vendorsetup.sh
including device/generic/mips/vendorsetup.sh
including device/samsung/manta/vendorsetup.sh
including device/lge/mako/vendorsetup.sh
including device/lge/hammerhead/vendorsetup.sh
including sdk/bash_completion/adb.bash
kevint@kevintcl:WORKING_DIRECTORY$
列出所有可用的Target
kevint@kevintcl:WORKING_DIRECTORY$ lunch
You're building on Linux
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_x86-eng
3. aosp_mips-eng
4. vbox_x86-eng
5. aosp_tilapia-userdebug
6. aosp_grouper-userdebug
7. aosp_deb-userdebug
8. aosp_flo-userdebug
9. mini_x86-userdebug
10. mini_armv7a_neon-userdebug
11. mini_mips-userdebug
12. aosp_manta-userdebug
13. aosp_mako-userdebug
14. aosp_hammerhead-userdebug (这是我需要的)
选择一个Target
使用lunch指令制定编译的target,具体的配置可以通过参数来指定,例如:
$lunch aosp_arm
-
eng
这行指令用来编译一个完整的模拟器emulator,所有的debug都是开启的。
所有的target形式都是BUILD-BUILDTYPE,其中BUILD是一个特定代码集合的名称,如Nexus5的代码名称就是hammerhead。
BUILDTYPE即编译的模式,有一下三种:
eng |
This is the default flavor(原版). A plain(普通) make is the same as make eng .
|
user
|
make user This is the flavor intended to be the final release bits.
|
userdebug |
make userdebug The same as
|
make clean 同样可以满足要求(suffice),但是将会消耗更多的时间。
注:由于我的编译的类型中没有eng , 我又想使ro.secure=0. 我做了如下修改kevint@kevintcl:core$ pwd
/home/kevint/WORKING_DIRECTORY/build/core
kevint@kevintcl:core$ vi main.mk
在如下位子ifneq (,$(user_variant))
# Target is secure in user builds.
#ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1 在行被注释,添加了下行
ADDITIONAL_DEFAULT_PROPERTIES += ro.secure= 0
Which would you like? [aosp_arm-eng] ^C
kevint@kevintcl:WORKING_DIRECTORY$ clear选择一个 Target (我的源码中只能用这个选项)kevint@kevintcl:WORKING_DIRECTORY$ lunch aosp_hammerhead-userdebug
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.4
TARGET_PRODUCT=aosp_hammerhead
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=krait
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.11.0-12-generic-x86_64-with-Ubuntu-13.10-saucy
HOST_BUILD_TYPE=release
BUILD_ID=KRT16S
OUT_DIR=out
============================================
kevint@kevintcl:WORKING_DIRECTORY$
开始编译如果你编译了某种特殊(flavor)的版本,然后要编译其它特殊版本,你必须在两次执行 make 之间执行 make installclean 来担保(guarantee)你不会使用前一个特殊版本安装的文件。
make clean 同样可以满足要求(suffice),但是将会消耗更多的时间。
kevint@kevintcl:WORKING_DIRECTORY$ make -j4
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.4
TARGET_PRODUCT=aosp_hammerhead
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=krait
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.11.0-12-generic-x86_64-with-Ubuntu-13.10-saucy
HOST_BUILD_TYPE=release
BUILD_ID=KRT16S
OUT_DIR=out
============================================
编译完成后生成的文件kevint@kevintcl:hammerhead$ pwd
/home/kevint/WORKING_DIRECTORY/out/target/product/hammerheadkevint@kevintcl:hammerhead$ ls
android-info.txt data previous_build_config.mk root
boot.img fake_packages ramdisk.img symbols
cache installed-files.txt ramdisk-recovery.img system
cache.img kernel recovery system.img
clean_steps.mk obj recovery.img userdata.img
kevint@kevintcl:hammerhead$
编译完了就刷机了哟:
解锁Bootloader
只有在Bootloader是unlock模式下才可能烧录定制的系统,Nexus5设备默认的Bootloader都是locked的,需要解锁。
先把Nexus5关机,然后同时按住音量的2个键和power键,进入fastbootmode,执行下面命令解锁:
$fastboot
oem unlock (刷机完成后执行fastboot oem lock 加锁)
kevint@kevintcl:hammerhead-krt16m$ fastboot format cache
erasing 'cache'...
OKAY [ 0.646s]
formatting 'cache' partition...
Creating filesystem with parameters:
Size: 734003200
Block size: 4096
Blocks per group: 32768
Inodes per group: 7472
Inode size: 256
Journal blocks: 2800
Label:
Blocks: 179200
Block groups: 6
Reserved block group size: 47
Created filesystem with 11/44832 inodes and 5813/179200 blocks
sending 'cache' (13348 KB)...
writing 'cache'...
OKAY [ 2.007s]
finished. total time: 2.653s
kevint@kevintcl:hammerhead-krt16m$ fastboot format userdata
erasing 'userdata'...
OKAY [ 12.327s]
formatting 'userdata' partition...
Creating filesystem with parameters:
Size: 13725835264
Block size: 4096
Blocks per group: 32768
Inodes per group: 8144
Inode size: 256
Journal blocks: 32768
Label:
Blocks: 3351034
Block groups: 103
Reserved block group size: 823
Created filesystem with 11/838832 inodes and 93654/3351034 blocks
sending 'userdata' (137318 KB)...
writing 'userdata'...
OKAY [ 14.931s]
finished. total time: 27.258s
kevint@kevintcl:hammerhead-krt16m$
.刷入Android4.4 适配的Bootloader和基带版本
从官方提供的出厂镜像中可以找到合适的Bootloader和radio信息,如果不执行这步,查看“Settings->"Aboutphone”->"Baseband version"为“unknown”,更简单的说,打不了电话....
google factory image: https://developers.google.com/android/nexus/images
选择对应版本
"hammerhead" for Nexus 5 (GSM/LTE)
Version | Download | MD5 Checksum | SHA-1 Checksum |
---|---|---|---|
4.4 (KRT16M) | Link | 36aa82ab2d7d05ee144d18546565cd5f | bd9c39ded5dc0ac80c4e96d24db060a660266033 |
4.4.2 (KOT49H) | Link | fa3bdfbef24c25b48d4969e0925bc600 | 02006b9917ae3f470d29644023b7c843ec96aa03 |
4.4.3 (KTU84M) | Link | 34a201b32259aadcc8c4879e45c1575c | 53ff95bf3912814b745e65cab6bc111bde987537 |
4.4.4 (KTU84P) | Link | d450411b40a6e60884c8e419bd50db2b | 35ea0277bd6a8fc928b47256bfa97b2eed60746b |
4.4.4 Release 2 (For 2Degrees/NZ, Telstra/AUS and India ONLY) (KTU84Q) | Link | b079669398b128dfed4cab3d0471241f | ae4752935beebeeffdba4937c8a729bb57f87b32 |
5.0 (LRX21O) | Link | 761667f1ddaf4e38d4792136df4ab927 | 01315e08c7f282452b5eba0606dd5a2d5274edde |
5.0.1 (LRX22C) | Link | f769bb85b7a82c1b4f7cc88f0d42129d | 0f9eda1b8c801bec45f762c96121e7ae905976c0 |
5.1.0 (LMY47D) | Link | 021fa0ed4946e0c7e70e39da301e5a34 | 6c1ad81eb8b90b329da5ed534af6ef18dea9921c |
5.1.0 (LMY47I) | Link | d78c50bc06fe37a19536cbca0a17394a | df127988e25758e683d53df9767cc799ee113935 |
我下的是4.4 (KRT16M),下载文件解压后的文件信息如下:
bootloader-hammerhead-HHZ11d.img (Nexus 5 的bootloader镜像)
flash-base.sh
flash-all.bat
image-hammerhead-krt16m.zip (出厂镜像)
flash-all.sh
radio-hammerhead-M8974A-1.0.25.0.17.img (Nexus 5的基带镜像)
-
把bootloader和radio刷入Nexus5,我使用了自己的路径,注意要替换成你的路径:
kevint@kevintcl:hammerhead$ fastboot flash bootloader ~/nexus5/4-4-KRT16M/hammerhead-krt16m/bootloader-hammerhead-HHZ11d.img
刷好bootloader后重启进入bootloader用最新的bootloader进行烧录radio和编译好的rom:
kevint@kevintcl:hammerhead$ fastboot
reboot-bootloader
刷入基带radio:
kevint@kevintcl:hammerhead$ fastboot
flash radio ~/nexus5/4-4-KRT16M/hammerhead-krt16m/radio-hammerhead-M8974A-1.0.25.0.17.img
下面是具体步骤
kevint@kevintcl:hammerhead$ which fastboot
/home/kevint/WORKING_DIRECTORY/out/host/linux-x86/bin/fastboot (fastboot 是编译完源码生成的,路径WORKING_DIRECTORY/out/host/linux-x86/bin/fastboot )
04d6bfad010adbd0 fastboot
kevint@kevintcl:hammerhead$ fastboot flash bootloader ~/nexus5/4-4-KRT16M/hammerhead-krt16m/bootloader-hammerhead-HHZ11d.img
sending 'bootloader' (2506 KB)...
OKAY [ 0.270s]
writing 'bootloader'...
OKAY [ 0.502s]
finished. total time: 0.772s
kevint@kevintcl:hammerhead$ fastboot reboot-bootloader
rebooting into bootloader...
OKAY [ 0.001s]
finished. total time: 0.001s
kevint@kevintcl:hammerhead$ fastboot flash radio ~/nexus5/4-4-KRT16M/hammerhead-krt16m/radio-hammerhead-M8974A-1.0.25.0.17.img
sending 'radio' (42033 KB)...
OKAY [ 1.627s]
writing 'radio'...
OKAY [ 2.901s]
finished. total time: 4.529s
kevint@kevintcl:hammerhead$ ls
android-info.txt data previous_build_config.mk root
boot.img fake_packages ramdisk.img symbols
cache installed-files.txt ramdisk-recovery.img system
cache.img kernel recovery system.img
clean_steps.mk obj recovery.img userdata.img
kevint@kevintcl:hammerhead$ fastboot reboot-bootloaderrebooting into bootloader...
OKAY [ 0.001s]
finished. total time: 0.001s
烧录到设备 (Nexus5)
完整的Android 4.4 可以通过一行简单的命令刷入Nexus 5,
它在检测bootloader和radio版本和编译好的Android版本匹配后把boot、recovery、system文件分区烧录到设备中,
命令里的“-w”参数是wipe,就是把所有的user data格式化,如果有要保留的数据注意备份:
kevint@kevintcl:hammerhead$ fastboot -w flashall--------------------------------------------
Bootloader Version...: HHZ11d
Baseband Version.....: M8974A-1.0.25.0.17
Serial Number........: 04d6bfad010adbd0
--------------------------------------------
checking product...
OKAY [ 0.100s]
sending 'boot' (8620 KB)...
OKAY [ 0.515s]
writing ' boot' ...
OKAY [ 0.760s]
sending 'recovery' (9202 KB)...
OKAY [ 0.570s]
writing 'recovery'...
OKAY [ 0.782s]
erasing 'system'...
OKAY [ 1.018s]
sending 'system' (294108 KB)...
OKAY [ 10.932s]
writing 'system'...
OKAY [ 21.399s]
erasing 'userdata'...
OKAY [ 7.391s]
formatting 'userdata' partition...
Creating filesystem with parameters:
Size: 13725835264
Block size: 4096
Blocks per group: 32768
Inodes per group: 8144
Inode size: 256
Journal blocks: 32768
Label:
Blocks: 3351034
Block groups: 103
Reserved block group size: 823
Created filesystem with 11/838832 inodes and 93654/3351034 blocks
sending 'userdata' (137318 KB)...
writing 'userdata'...
OKAY [ 14.700s]
erasing 'cache'...
OKAY [ 0.554s]
formatting 'cache' partition...
Creating filesystem with parameters:
Size: 734003200
Block size: 4096
Blocks per group: 32768
Inodes per group: 7472
Inode size: 256
Journal blocks: 2800
Label:
Blocks: 179200
Block groups: 6
Reserved block group size: 47
Created filesystem with 11/44832 inodes and 5813/179200 blocks
sending 'cache' (13348 KB)...
writing 'cache'...
OKAY [ 1.995s]
rebooting...
finished. total time: 61.249s
kevint@kevintcl:hammerhead$
最后机子自己重启了。