【北京迅为】《iTOP-3588开发板源码编译手册》- 第二章 Android固件编译

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP,内置NPU,支持INT4/INT8/INT16/FP16混合运算能力,支持安卓12和、Debian11、Build root、Ubuntu20和22版本登系统。了解更多信息可点击迅为官网   

【粉丝群】824412014

【实验平台】:迅为RK3588开发板

【内容来源】《iTOP-3588开发板源码编译手册》

【全套资料及网盘获取方式】联系淘宝客服加入售后技术支持群内下载

【视频介绍】:【强者之芯】 新一代AIOT高端应用芯片 iTOP -3588人工智能工业AI主板


 第二章 Android固件编译

历尽千辛万苦,终于过关斩将,终于可以进行系统编译开发以及调试了,恭喜你来到系统编译的章节,现在我们开始编译 Android12系统吧。在编译的时候,如果编译出现问题,一定要冷静分析,沉着应对,仔细阅读以下说明。

2.1 获取Android 12源码

Android 12源码网盘下载路径:iTOP-3588开发板\01_1TOP-RK3588开发板】基础资料

\03_iTOP-RK3588开发板Android 12源码

源码是分卷压缩包,需要全部下载下来放在同一级文件夹。所以要从网盘将 Android12 源码包 3588-android12_20230109.tar.zip.001 至 3588-android12_20230109.tar.zip.00X(X 代表 1,2,3......)等分卷压缩包全部下载到 windows 电脑上,并放在同一级目录下。

源码名称说明:源码会逐渐更新,发布的源码日期会有所不同,具体以网盘中实际名称为准。

下载的源码,如下图所示:

右键点击第一个分卷压缩包 3588-android12_20230109.tar.zip.001,选择“解压到

3588-android12_20230109XXX”,(XXX 为省略),解压时间会比较长,耐心等解压完以后会生成一个 3588-android12_20230109.tar.gz 名字的压缩包,如下图所示:

 

在Ubuntu20.04系统中选择合适的目录创建文件夹Android12,我这里创建在了/home/topeet/的目录下,命名为Android12,如下图所示 

使用SSH软件拷贝3588-android12_20230109.tar文件到Ubuntu系统的该文件夹目录下,如下图所示,文件比较大,需要30-60分钟: 

由于SSH软件在拷贝大型文件时可能不够稳定,出现网络波动等情况,这里给大家介绍另外一种能够将文件传输到Ubuntu系统的方法。如果你的开发环境也是Ubuntu20.04,可以直接将压缩包拖拽进Ubuntu中你指定的目录下,完成文件传输,如下图所示: 

输入以下命令解压压缩包,在解压源码前一定要保证虚拟机硬盘大小在500G以上,否则会因为内存不够解压失败。如果空间不够,可以通过虚拟机自带的磁盘扩展功能进行磁盘空间扩充,具体操作可参考上一章节中拓展磁盘空间相关内容。

 tar -vxf 3588-android12_20230109.tar

解压完毕生成3588-android12文件夹,如下图所示:

 

2.2 选择屏幕配置 

在源码编译之前首先要确定自己想要使用的屏幕并修改源码, 在编译镜像, 烧写镜像。 如

下图所示: 

 

iTOP-3588 开发板支持以下种类屏幕:  

 迅为 MIPI 7 寸屏幕

标准 HDMI 屏幕(通过 HDMI 线连接) 

迅为 LVDS 7 寸屏幕

迅为 LVDS 10.1 寸 1024*600 屏幕

迅为 LVDS 10.1寸1280*800屏幕

迅为 LVDS 10.1寸1280*800新屏幕 

打开安卓12源码kernel-5.10/arch/arm64/boot/dts/rockchip/topeet_screen_lcds.dts中的设备树文件。如下图所示: 

 

在上图中分别定义了不同屏幕的宏定义。我们如果想要连接某个屏幕,使能对应的屏幕宏定义即可。如果想要设置多屏显示,请参考《【北京迅为】itop-rk3588开发板多屏显示手册》。

如果打开的宏定义是#define LCD_TYPE_LVDS_10_1_1280x800_GT9271, 需要将kernel-5.10/arch/arm64/configs/rockchip_defconfig文件中的CONFIG_TOUCHSCREEN_GT9271=y 宏定义使能,然后再编译源码

如果打开的宏定义是#define LCD_TYPE_LVDS_10_1_1280x800_GT911和#define LCD_TYPE_LVDS_10_1_1024x600_GT911,需要将kernel-5.10/arch/arm64/configs/rockchip_defconfig文件中的CONFIG_TOUCHSCREEN_GT9XX 宏定义使能,然后再编译源码。

2.3 选择摄像头配置 

打开安卓12源码kernel-5.10/arch/arm64/boot/dts/rockchip/topeet_camera_config.dtsi中的设备树文件。如下图所示默认支持底板J1接口可用:  

底板上的接口如下所示。如果想要单独使用哪个接口开启对应的宏定义即可,注意只能单独使能单个摄像头。摄像头的使用,请参考《【北京迅为】itop-3588开发板摄像头使用手册》。 

2.4 修改编译线程数

在编译Android系统时,可以通过调整线程数来控制并行编译的任务数量,使用多线程可以加快构建速度。要注意根据Ubuntu的处理器内核总数以及内存大小来设置合适的线程数。过高的线程数可能导致系统资源的竞争,过低的线程数则不能充分利用系统的并行处理能力。找到合适的线程数可以加快编译速度,提高效率。

可以在build.sh编译脚本中修改线程数,如下图所示:

 

2.5 整体编译Android固件

注意:编译系统时一定要使用普通权限编译保证虚拟机分配的内存大于20G

进入到3588-android12文件夹,输入以下命令设置java版本为1.8版本,确认java版本是1.8版本之后,才可以进行下一步编译,如下图所示:

source javaenv.sh

java -version

输入以下命令使能编译环境:

source build/envsetup.sh

输入命令查看编译目标:

lunch

在这里我们输入版本对应的编号即可,我们的版本为第52,rk3588_s-userdebug,我们这里输入52即可完成选择 

我们也可以直接输入以下命令进行选择,选择结果和上述方法没有任何区别

lunch rk3588_s-userdebug

最后输入以下命令开始整体编译

./build.sh -AUCKu

编译完成如下图所示编译时间根据自身电脑配置而定,我这里给虚拟机分配的处理器内核总数为8,处理器为12th Gen Intel(R) Core(TM) i7-12700K 3.61GHz,用时大致为3小时左右: 

 编译生成的镜像统一放在rockdev/Image-rk3588_s目录下

生成的镜像包括MiniLoaderAll.bin、uboot.img、trust.img、resource.img、 boot.img 、 misc.img 、 recovery.img 、 boot-debug.img 、 dtbo.img 、 pcba_small_misc.img、pcba_whole_misc.img 、super.img 、vbmeta.img 等13个镜像,但是在烧写系统时,这13个镜像并不需要全部使用。

镜像作用如下表所示: 

镜像

含义

boot-debug.img

boot.img的差别是user固件可以烧写这个boot.img进行root权限

操作

config.cfg

烧写工具的配置文件,可以直接导入烧写工具显示需要烧写的选项。

MiniLoaderAll.bin

包含一级loader

misc.img

包含recovery-wipe开机标识信息,烧写后会进行recovery

parameter.txt

包含分区信息。

pcba small misc.img

包含pcba开机标识信息,烧写后会进入简易版pcba模式。

pcba whole misc. img

包含pcba开机标识信息,烧写后会进入完整版pcba模式

recovery.img

包含 recovery-ramdiskerneldtb

super.img

包含 odmproductvendorsystemsystem ext 分区内容。

trust.img

包含BL31BL32 RK3566/RK3588没有生成这个固件,不需要烧写

uboot.img

包含uboot固件

vbmeta.img

包含avb校验信息,用于AVB校验

update.img

包含以上需要烧写的img文件,可以用于工具直接烧写整个固件包。

2.6 单独编译Android固件

进入到3588-android12文件夹,输入以下命令设置java版本为1.8版本,如下图所示:

source javaenv.sh

java -version

输入以下命令使能编译环境:

source build/envsetup.sh

lunch rk3588_s-userdebug

 

执行完上述命令,如果需要编译uboot,则参考编译uboot小节,如果需要编译Android内核,则参考编译Android内核小节,如果编译Android文件系统,则参考编译Android文件系统小节。

注意!要用同一个窗口普通用户进行编译。

2.6.1 编译uboot

方法一:

Android 源码目录下执行如下命令编译uboot

./build.sh -U

编译完uboot如下图所示: 

编译完成后在u-boot目录会生成rk3588_spl_loader_v1.07.111.bin文件uboot.img文件、 resource.img三个镜像文件。 

同 时 编 译 成 功 后 会 将rk3588_spl_loader_v1.07.111.binuboot.img拷 贝 到

rockdev/Image-rk3588_s目录下rk3588_spl_loader_v1.07.111.bin会改名为MiniLoaderAll.binMiniLoaderAll.bin 也就是一级loader

只需要将MiniLoaderAll.binuboot.img烧写到开发板即可更新uboot

方法二:

方法一使用的是整体编译脚本,也可以使用u-boot下的编译脚本。

如果只是调试uboot或者rkbin可以在u-boot目录下直接编译,这样编译速度更快,如下图所示,输入以下命令:

./make.sh rk3588

 

这样编译后会在uboot目录下生成uboot.imgrk3588_spl_loader_v1.07.111.bin但是不会拷贝到rockdev/Image-rk3588_s下面,所以需要烧写uboot目录下的uboot.imgrk3588_spl_loader_v 1.07.111.bin 

烧写时将rk3588_spl_loader_v1.07.111.bin重命名为MiniLoaderAll.bin再烧写。

 

2.6.2 编译Android内核

方法一:

Android源码目录下执行如下命令编译Android内核

./build.sh -CKA

 

编译完成后如下图所示: 

编译后会在rockdev/Image-rk3588_s目录下生成boot.imgboot.img为内核镜像。boot.img镜像里面包含了设备树镜像。所以烧写boot.img即可更新内核镜像。

解释如下:

参数-C表示用clang编译器编译,如果不带C则使用gcc编译,如果需要过GMS认证的google 有要求要用clang编译。

因为kernel编译完后需要通过Android去打包成boot.img,所以这里需要加上A参数,即编译kernel时需要一起编译Android才能打包boot.img。通过以上介绍可以知道单独编译kernel需要同时编译Android,导致编译很耗时,针对这个问题,我们推荐使用方法二来单独编译内核。

 

方法二:

此方法常用于kernel的开发和调试,以下的方法既编译kernel部分时, 同时打包成boot.img, 这样加快了我们开发的速度;

该种方法需要我们自行安装内核的交叉编译环境aarch64-linux-gnu-gcc编译器,在编译前我们可以输入以下命令,然后双击Tab键查看交叉编译环境是否已经安装

aarch64-linux-gnu-

 

如果能出现上图红框中的编译环境则说明环境已经安装,若没有显示则需要输入以下命令安装aarch64-linux-gnu-gcc交叉编译器

sudo apt-get install gcc-aarch64-linux-gnu

安装成功后再次检查交叉编译器是否安装成功,安装成功后即可进入编译环节。

进入内核目录下,输入以下命令配置环境

cd kernel-5.10 

export PATH=../prebuilts/clang/host/linux-x86/clang-r416183b/bin:$PATH alias msk='make CROSS_COMPILE =aarch64-linux-gnu- LLVM=1 LLVM_IAS=1'

配置好环境后输入以下命令进行编译,j16代表所用的线程数为16个,可以根据自己虚拟机的配置自行更改

make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 rockchip_defconfig pcie_wifi.config android-11.config && make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 rockchip_defconfig pcie_wifi.config android-11.config BOOT_IMG=../rockdev/Image-rk3588_s/boot.img rk3588-evb7-lp4-v10.img -j16

编译完成如下图所示 

 

打包完后,在kernel目录有boot.img镜像生成,就可以把这个boot.img镜像单独烧入到机器中进行调试了。

2.6.3 编译Android文件系统 

方法一:

在源码根目录的build.sh脚本,找到make installclean命令,将make installclean注释掉,这里需要注意的是,build.sh脚本为只读脚本,普通用户下是无法进行文件修改的,需要在root超级用户模式下将脚本打开,修改完成后输入wq!进行强制保存即可

接着在Android源码目录下执行如下命令编译Android文件系统:

./build.sh-A

Android编译过程如下图所示: 

Android系统编译完如下图所示: 

编译完成后镜像文件会在rockdev/Image-rk3588_s目录下生成super.img,单独烧写super.img即可。 

各种镜像解释如下:

boot.img:包含kernel.img和resource.img镜像文件

boot-debug.img:与boot.img的差别是user固件可以烧写这个boot.img进行root权限操作

config.cfg:烧写工具的配置文件,可以直接导入烧写工具显示需要烧写的选项。

MiniLoaderAll.bin:包含一级loader。

misc.img:包含recovery-wipe开机标识信息,烧写后会进行recovery。

parameter.txt: 包含分区信息。

pcba_small_misc.img :包含pcba开机标识信息,烧写后会进入简易版pcba模式。

pcba_whole_misc.img:包含pcba开机标识信息,烧写后会进入完整版pcba模式

recovery.img:包含recovery-ramdis、kernel、dtb

super.img:包含odm、product、vendor、system、system_ext分区内容。

trust.img:包含BL31、BL32 RK3566/RK3588,没有生成这个固件,不需要烧写

uboot.img:包含uboot固件

vbmeta.img:包含avb校验信息,用于AVB校验

update.img:包含以上需要烧写的img文件,可以用于工具直接烧写整个固件包。

方法

Android源码编译的时候,如果编译整个工程可能需要两三个小时,即使二次编译也要二十分钟,如果只想单独编译某个模块,则可以使用mm命令,编译出来的so库或者其他文件,使用adb工具push到机器中进行替换,重启系统验证,不必重新烧写固件。

在使用m/mm/mmm命令之前,首先要确保执行以下命令,以下命令的作用是将mm等这些命令添加到环境变量当中去,没执行的话,会找不到命令。

source javaenv.sh

source build/envsetup.sh

lunch rk3588_s-userdebug

我们来了解下命令的含义:

m:编译所有的模块;

mm:编译当前目录下的模块,当前目录下要有 Android.mk 文件;

mmm:编译指定路径下的模块,指定路径下要有 Android.mk 文件;

 比如说,修改了HAL层的音频文件:hardware/rockchip/audio/tinyalsa_hal/audio_hw.c,就可以使用mm命令来进行编译,首先要进入到hardware/rockchip/audio/tinyalsa_hal/目录下,注意要有Android.mk文件哦,然后直接输入mm编译即可,如下图所示:

编译完成如下图所示: 

out 目录就有新生成的 so 文件:

out/target/product/rk3588_s/vendor/lib/hw/audio.primary.rk30board.so 或者

out/target/product/rk3588_s/vendor/lib64/hw/audio.primary.rk30board.so

分别把lib和lib64目录下的audio.primary.rk30board.so使用adb工具push到Android开发板的/vendor/lib/hw或者/vendor/lib64/hw目录,重启系统验证。

使用mmm命令和mm命令最大的区别是mmm命令后面需要带上全路径。编译结果和mm命令编译相同。

如果无法使用mm编译,可以使用方法一来编译android的整个部分。

2.6 打包update.img

uboot kernel android都编译完成的情况下,才可以打包update.img,所以一般在完整编译的时候用。输入以下命令:

./build.sh -u

打包完成会在rockdev/Image-rk3588_s目录下生成update.img镜像。

2.7查询编译帮助信息

输入以下命令查看编译帮助信息,如下图所示:

./build.sh -h 

“-U”表示编译uboot

“-CK”表示编译内核

“-A”表示编译Android文件系统

“-u”表示所有的镜像编译完成后执行打包程序(生成update.img镜像)

“-J=”表示多线程编译(比如-J=24)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值