1. 背景
最近在做移动机器人项目,要给机器人做一个头台,搭载Android操作系统,要为系统做一些定制。在 好多年前,还是Android 5.0以下系统的时候做游戏画面采集做个AOSP的编译,那个时候电脑配置查,网络也差,搭建一次环境特别费劲。编译完还没有现成的设备可以给刷,一直也没有真正的framework和内核、驱动层的开发经验,现在有了实际的需求了,硬着头皮开搞。
这次现在供应商推荐了开发板,买开发板的时候顺带着把资料也带过来了,这是一块开源的板子,支持Android9.0系统,资料里面源码和镜像都有,已经刷机工具,本文开始搭建环境,后续逐步的完善功能。
2. 组装
组装比较简单,把板子用螺丝固定到另外购买的显示屏上,将LVDS模块接起来,将wifi天线和4G模块安装上就可以加电启动了。
3. AOSP编译环境搭建
编译 AOSP 对机器的配置要求较高:
- 64 位 CPU
- 16GB 物理内存+交换内存
- 30GB 空闲的磁盘空间用于构建,源码树另外占用大约 25GB, 如果要编译源码则还需要 150GB 的磁盘空间。
这里正好有刚从公司申请的笔记本,512G磁盘, 24G内存,i7处理器,装了ubuntu20操作系统。
编译环境的初始化参考了Android官网提示: source.android.com/source/init… 。
- 安装 OpenJDK 8:
sudo apt-get install openjdk-8-jdk
- 安装 openjdk-8-jdk,会更改 JDK 的默认链接,这时可用下面工具来切换 JDK 版本。:
$ sudo update-alternatives --config java $ sudo update-alternatives --config javac
- Ubuntu软件包安装:
sudo apt-get update sudo apt-get install git gnupg flex bison gperf libsdl1.2-dev \ libesd-java libwxgtk3.0-dev squashfs-tools build-essential zip curl \ libncurses5-dev zlib1g-dev pngcrush schedtool libxml2 libxml2-utils \ xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev lib32ncurses5-dev \ lib32readline-dev gcc-multilib libswitch-perl libssl-dev unzip zip
4. 编译9.0固件
解压从资源盘中自带的源码压缩包,这里用了7x压缩工具。然后进入源码路径执行:
cd ./aosp git reset --hard
4.1 编译显示器驱动
它提供了HDMI、LVDS + HDMI和MIPI + HDMI三种显示屏,执行对应脚本即可,这里我们用的是LVDS,编译LVDS即可。
4.2 编译AOSP
- 编译前执行如下命令配置环境变量:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
- 编译kernel:
make ARCH=arm64 xxx_defconfig make -j8 ARCH=arm64 BOOT_IMG=../xxx/Image-xxx/boot.img xxx.img
若进行内核 debug,需要将 resource.img 和 kernel.img 打包进去 boot.img 后对 boot 分区进行烧写才能生效。
- 编译 uboot
./make.sh
- 编译Android
source build/envsetup.sh lunch xxx-userdebug make -j8 ./mkimage.sh
5. 编译产物
- boot.img: Android 的 initramfs 映像,包含Android根目录的基础文件系统,它负责初始化和加载系统分区。
- system.img: ext4 文件系统格式的 Android 文件系统分区映像。
- kernel.img: 内核映像。
- resource.img: Resource 映像, 包含启动图片和内核设备树。
- misc.img: misc 分区映像, 负责启动模式的切换和急救模式参数的传递。
- recovery.img: Recovery 模式映像。
- rk3399_loader_v1.12.112.bin: Loader 文件。
- uboot.img: U-Boot 映像文件。
- trust.img: Arm trusted file (ATF) 映像文件。
- parameter.txt: 分区布局和内核命令行。
6. 更新固件(刷机)
开发板有2种工作模式。一般情况下,开机直接进入Normal 模式
正常启动系统。如需对板子系统进行升级,可以根据情况选择合适的升级模式
进行固件升级。
目前支持3种升级模式,各有优缺点:
- MaskRom 升级模式
- Loader 升级模式
- SD 升级模式
6.1 MaskRom 升级模式
一般情况下是不用进入 MaskRom 升级模式
的,只有在 bootloader 校验失败(读取不了 IDB 块,或 bootloader 损坏) 的情况下,BootRom 代码 就会进入此模式。此时 BootRom 代码等待主机通过 USB 接口传送 bootloader 代码,加载并运行之。当板子变砖无法正常启动或升级程序时,也可以手动进入MaskRom 升级模式
.
6.2 Loader 升级模式
在 Loader 升级模式
下,bootloader 会进入升级状态,等待主机命令,用于固件升级等。要进入此模式,必须让 bootloader 在启动时检测到 RECOVERY
(恢复)键按下,且 USB 处于连接状态。
6.3 SD 升级模式
使用SD升级,本质上是制作一个可启动的SD启动的升级固件,让板子SD启动,擦除和烧写EMMC。
这里我们先使用SD卡将资料盘中自带的系统更新到板子,跑起来看看效果。
7. 总结
本文介绍了基于开发板自带AOSP编译Android镜像过程,整个过程比较顺利,而且由于电脑性能还不错,近20G的压缩包,解压后整个编译过程花了两个半小时,比之前动不动两三天还总失败高效了很多。