Android系统编译之AOSP刷机
1.引言
19年加入一家生产机顶盒的公司,第一次接触到Android 系统相关的知识。拓宽了我职业知识面。让我知道了原来编译系统可以在服务器上进行;知道了framework开发日常工作内容;知道使用串口刷机;知道使用一些常用的Linux命令和Linux工具。20年又加入了一家Android TV 开发公司。再次接触到Android系统编译的知识。系统编译知识对我而言充满了神秘感。像一个披着红布的新娘,坐着自己的面前,等待着我去掀开她的头巾。内心充满了好奇和激动。今天正式开启这块内容的学习,解锁内心的好奇。
2.开发环境
操作系统: | Windows 10 |
---|---|
远程服务器 | ubantu 18.04 |
手机 | Pixel |
ssh工具 | xshell |
网络环境 | 能翻墙访问google |
3.源码下载
-
在ubantu上 安装并初始repo客户端
repo介绍,使用参考链接:https://source.android.com/setup/develop https://source.android.com/setup/develop/repo
-
运行
repo init
获取最新版本的 Repo 及其最新的问题修复。清单文件指定了 Android 源代码中包含的各个代码库位于工作目录中的什么位置,您必须为该清单指定一个网址。repo init -u https://android.googlesource.com/platform/manifest
因为我们用的是Pixel手机,所以要设置对应的代码分支。请参阅源代码标记和 build。
最终运行的是:repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r5
-
同步代码 执行命令:
repo sync
,同步命令行会有如下提示:Updating files: 100% (1898/1898), done. Updating files: 100% (2018/2018), done.latform/system/ca-certificatesUpdating files: 79% (1614/2018) Updating files: 100% (972/972), done. Updating files: 100% (1778/1778), done.latform/system/tools/syspropUpdating files: 93% (1660/1778) Updating files: 100% (161/161), done. platform/tools/currysrcUpdating files: 63% (103/161) Updating files: 100% (18/18), done. Checking out projects: 100% (733/733), done. repo sync has finished successfully.
假如不能翻墙,就通过清华镜像,按照官网的步骤一步一步执行即可。千万要注意同步的代码分支,一定要和刷机手机相匹配
4.下载驱动
因为我下载的是android-10.0.0_r5, 对应的build为 QP1A.191005.007.A1。
image-20201129150038228.png将这俩个文件下载下来之后,解压得到如下俩个sh:
extract-google_devices-sailfish.sh
extract-qcom-sailfish.sh
这个俩个sh最终生成vendor文件夹。是用bash命令写的。所以我们也得用bash去执行。但是在windows,运行会提示不成功。得在ubantu上运行
bash extract-google_devices-sailfish.sh
bash extract-qcom-sailfish.sh
运行成功,提示如下:并且得到一个vendor文件夹
Type "I ACCEPT" if you agree to the terms of the license: I ACCEPT
vendor/
vendor/google_devices/
vendor/google_devices/sailfish/
vendor/google_devices/sailfish/android-info.txt
vendor/google_devices/sailfish/BoardConfigPartial.mk
vendor/google_devices/sailfish/proprietary/
vendor/google_devices/sailfish/proprietary/vendor.img
vendor/google_devices/sailfish/device-partial.mk
vendor/google_devices/marlin/
vendor/google_devices/marlin/BoardConfigVendor.mk
vendor/google_devices/marlin/device-vendor-sailfish.mk
5.编译源码
-
设置环境,使用
envsetup.sh
脚本初始化环境:source build/envsetup.sh
-
选择编译目标
lunch aosp_sailfish-userdebug(因为用的是pixel设备)
因为我用的是pixel设备,所以需要编译aosp_sailfish。参考选择设备 build
-
启动编译
make -j32
6.FastBoot刷机
-
bootLoader介绍
bootLoader是供应商专有的映像,负责在设备上启动内核。它会监护设备状态,负责初始化可信执行环境 (TEE) 以及绑定其信任根。
bootLoader由许多部分组成,包括启动画面。要开始启动,bootLoader可能会直接将一个新映像刷写到相应的分区中,也可能会使用
recovery
开始重新刷写过程,该过程与 OTA 的操作过程一致。一些设备制造商会创建多bootLoader,然后将它们组合到一个 bootloader.img 文件中。最重要的是,bootLoader会在将执行工作移到内核之前先验证 boot 分区和 recovery 分区的完整性,并显示启动状态部分中指定的警告。
-
fastboot 介绍
Fastboot,英语翻译意思是快速启动。 在安卓手机中fastboot是一种比recovery更底层的刷机模式(俗称引导模式)。 就是使用USB数据线连接手机的一种刷机模式。 相对于某些系统(如iOS)卡刷来说,线刷更可靠,安全。
进入fastboot有俩种方式:
-
在关机的情况下,同时按下power键和音量键,在boot驱动界面 手机插上USB线,进入CMD命令:
fastboot devices -- 查看设备是否连上
-
在开机情况下,手机插上USB线,进入CMD命令:
adb reboot bootloader -- 进入fastboot模式 fastboot devices -- 查看设备是否连上
将服务器上的img,拷贝到本地,打开命令行执行下面的步骤:
fastboot flashing unlock
fastboot flash boot E:\aosp\boot.img
fastboot flash ramdisk E:\aosp\ramdisk.img
fastboot flash ramdisk-recovery E:\aosp\ramdisk-recovery.img
fastboot flash system E:\aosp\system.img
fastboot flash userdata E:\aosp\userdata.img
fastboot flash vendor E:\aosp\vendor.img
fastboot flash system_other E:\aosp\system_other.img
fastboot reboot
image-20201129185824023.png
执行完毕,手机将会自动重启。
7.问题总结
-
因为代码是在服务器编译的。fastboot flash boot “boot.img 路径”。这个路径是本地的映射路径。导致flash的时候,太慢或者出现其他 的错误。
解决的方法就是要将服务器上的img,保存到本地。提示如下错误:
fastboot: error: cannot get boot partition size
- usb线 太差,太水,也会导致一些异常错误。
-
第一次刷机,系统一直停留在开机动画哪里,卡主无法前进。长按电源键15s,会强行关机。再次开机,依旧卡在开机动画。下载官网的镜像:官网镜像
下载完毕,解压zip,将得到这么个玩意:
此时,让设备进入fastboot model。双击flash-all.bat 这个脚本会自动将img刷进手机中。之后,在将自己的img 以上述的方式刷进去。就能正常开机。
8.各个img简介
android 系统映射文件
img名称 | img描述 |
---|---|
system.img | Android系统运行的程序包,framework就在此img中。挂载到/system下 |
boot.img | 包含内核启动参数 |
ramdisk.img | 小型文件系统,是android系统启动的关键。包含了android 根目录的镜像 |
userdata.img | 各程数据存储所在,被挂载到/data目录下 |
cache.img | 存储系统或用户应用产生的临时数据,通常的镜像文件名为chche.img |