android源码编译之后的刷机过程
android源码并且编译成功有好长一段时间了,之前是通过android emulator运行,由于大部分真实的android 设备都是在arm上跑,所以刚开始编译选择的是arm现相关的device,但使用emulator去运行简直就是惨不忍睹,每次开机system process anr,操作UI反应缓慢。于是没有办法,又换成了x86,但我想学习的是android 系统层,并非apk(HAL和kernel和平台的指令集有关系),加上现在也没有听说过有几个android x86平台。于是咬咬牙,买了一台google的亲儿子,pixel,等了大半个月,终于收到了。买了当然就要开始搞机了,不然花了5000多大洋,不搞搞它心里不舒服~~
1. 源码与驱动的准备
环境及aosp
aosp的下载及环境搭建可以参考下面这篇文章《MacBook Pro android 7.0 编译环境搭建》。
具体需要选择那个code branch 及TAG,可以查看 https://source.android.com/source/build-numbers#source-code-tags-and-builds,我这里是根据手机的版本来选择,查看settings -> about phone -> build number. 显示NOF26V,所以本文中实验的source code TAG 对应的是:-
下载驱动
上面已经准备好AOSP的source code了,但android并非开源代码,单单凭借repo拉下来的代码编译出来只能在模拟器上跑,并不能在真实的设备上运行,这里还需要driver支持。
对于google的标杆机器,可以从google developer 网站中获取:
上面两份下载后解压,放在AOSP source code的根目录进行解压,会自动将driver放入对应的目录,一般上放在vendor下面:drwxr-x— 4 staff 136 1 27 08:48 google_devices
drwxr-x— 3 staff 102 1 27 08:48 qcom -
选择device并且编译
一切环境和源码准备就绪后,接下来就编译出我们的刷机包。pixel的device需要选择sailfish,即在lunch这一步选择的是aosp_sailfish_userdebug,这个userdebug,是有su命令的,方便获取root权限,做我们喜欢做的事情。PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=7.1.1
TARGET_PRODUCT=aosp_sailfish
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv7-a-neon
TARGET_2ND_CPU_VARIANT=krait
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=darwin
HOST_OS_EXTRA=Darwin-15.6.0-x86_64-i386-64bit
HOST_CROSS_OS=
HOST_CROSS_ARCH=
HOST_CROSS_2ND_ARCH=
HOST_BUILD_TYPE=release
BUILD_ID=NOF26V
OUT_DIR=out 生成的image
编译完成之后,我们可以看到out/target/product/sailfish/已经生成了image:
生成的image只有boot,system,userdata及vendor。一般上我们学习和分析android 系统知识,只需要改动system分区。如果需要改动kernel,需要刷入boot.img,所以已经足够了。
我们再看看google提供的factory image:
多了许多image,有很多本人也没有搞明白其作用。factory image可以通过fastboot刷入,如果不小心玩坏了,也可以通过这个来还原,在bootloader下面,连上pc机,执行flash-all.sh。
解锁bootloader
一般为了安全起见,非官方的rom是无法刷入的,或者刷入了之后也无法起来。pixel解锁bootloader的方法如下:
1.打开手机的developer options。进入settings->abount phone->build number. 联系点击5次,将会在setting中出现developer options。
2.打开usb debugging。developer options -> usb debugging
3.OEM unlocking. developer options -> OEM unlocking
4.unlock bootloader. adb reboot bootloader , 机器重新启动后,进入bootloader。然后执行:
$ fastboot flashing unlock
然后到手机中确认,此时数据会被清除。
利用fastboot刷机
上面已经完成了准备,现在开始刷入我们编译的image,在AOSP的根目录下执行:
$ fastboot -w flashall
会将out目录下的所有image刷入,也可以单个image刷入:
fastboot flash system out/target/product/sailfish/system.img
fastboot flash system out/target/product/sailfish/boot.img
将单个system image输入,无法开机,估计system和boot或者和vendor之前有签名检查。
也可以将image打包完刷入:
fastboot -w update image-sailfish-nof26v.zip
打包结果可以参考从google下载的factory image。
直接从aosp编译的升级包,UI挺丑的:
如果有兴趣让手机更美观,或者想享受google服务,可以将GMS刷入到手机中,不过一般的开发者是拿不到的,需要google的合作伙伴才能拿到GMS这套软件,当然,世界上总是有很多人愿意用盗版的,可以从该网站获取Gapp:http://opengapps.org/。