文档更新说明
免责声明
本文档虽力求准确,但可能存在错误或遗漏,用户需谨慎评估适用性;我们保留随时修订的权利,且不保证旧版本内容的有效性,为了得到最新版本的产品信息,请定时访问立创开发板官网进行资料的更新下载。本文档版权及最终解释权归深圳嘉立创科技集团股份有限公司所有。请务必注意以上声明,自行评估风险并决策,我们对使用本文档产生的任何问题概不负责。感谢您的包容与支持。
前言
下面我们来介绍泰山派开发板的Android 系统SDK以及编译方法,了解了sdk包与编译方法以后大家就可以进行二次开发定制一个自己专属的镜像。
准备工作
电脑配置:编译android系统对电脑的要求是非常高的,尤其是内存如果内存太小根本没办法编译,下面是我的电脑配置,希望大家编译的适合配置尽量比我高,如果CPU性能比我差也要确保内存比我大,CPU会影响编译的速度,内存小了直接会报错。
虚拟机配置:
ubnutu版本信息:NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
2
3
4
5
6
7
8
9
10
11
12
下载SDK
开发板资料我们通过网盘提供,其中SDK资料目录如下大家自行下载:
- 上面目录中的xxxxxxxx表示日期
- 目录中的SDK会不定期更新,大家每次下载的都是最新的
- Android系统非常庞大所以提供的SDK也可能存在BUG,如果大家发现可以及时联系我们
将tspi_android_sdk_xxxxxxxx.tar.gz 上传到ubuntu虚拟机中,目录随便大家自己定但目录路径不能包含中文,且需保证至少有250G的容量,最终编译完成后整个SDK大小会到160G左右
解压SDK
在tspi_android_sdk_20230909.tar.gz所在的目录运行解压命令:
tar -zxvf tspi_android_sdk_20230909.tar.gz
命令解释:
tar:解压命令 。
-z:使用 gzip 压缩算法进行解压或压缩。
-x:表示提取(解压)文件。
-v:显示详细的操作信息,即在解压过程中显示文件列表。
-f:指定要操作的文件名。
tspi_android_sdk_20230909.tar.gz:被解压对象。
2
3
4
5
6
7
8
9
解压后得到tspi_android_sdk_20230909:
root@lckfb:/home/lckfb_tspi/android11/Release# ls
tspi_android_sdk_20230909 tspi_android_sdk_20230909.tar.gz
2
进入刚刚解压好的tspi_android_sdk_20230909
root@lckfb:/home/lckfb_tspi/android11/Release# cd tspi_android_sdk_20230909
查看SDK目录内容如下:
Android.bp
:用于 Android 开发的 Blueprint 构建文件,用于定义和配置模块。art
:包含与 Android 运行时(ART)相关的代码。bionic
:包含 C 库的实现,用于 Android 系统。bootable
:包含引导相关的代码,如引导加载程序(bootloader)和引导镜像(boot images)。bootstrap.bash
:用于启动 Android 开发环境的脚本。build
:包含与构建系统相关的代码和脚本。build.sh
:用于构建 Android 系统的脚本。compatibility
:包含与 Android 兼容性测试套件(CTS)相关的代码。cts
:包含 Android 兼容性测试套件(CTS)的代码和配置。development
:包含开发工具和库,如 SDK Manager 和模拟器。device
:包含设备制造商或平台特定的代码和配置文件。external
:包含来自外部源的第三方库和工具。frameworks
:包含 Android 系统框架的代码。hardware
:包含硬件相关的代码,如驱动程序和硬件抽象层(HAL)。javaenv.sh
:设置 Java 运行环境的脚本。kernel
:包含 Android 系统所使用的 Linux 内核代码。libcore
:包含 Java 核心库(core libraries)的实现。libnativehelper
:包含用于实现本地代码与 Java 代码之间交互的库。makefile
:构建 Android 系统所使用的 Makefile 文件。mkcombinedroot
:用于创建合并根文件系统的脚本。mkimage_ab.sh
:用于创建 Android 系统引导镜像(boot image)的脚本。mkimage.sh
:用于创建 RK3566 升级镜像脚本。out
:在构建过程中生成的输出文件的目录。packages
:包含预装的应用程序和服务的代码。pdk
:包含 Android 平台开发工具包(PDK)的相关文件。platform_testing
:包含在设备上运行的测试代码。prebuilts
:包含预编译的第三方工具和库。rkbin
:包含了 RK3566 系统开发所需的二进制文件。RKDocs
:包含关于 RK3566 硬件开发的文档。rkst
:包含 RK 开发工具链的相关文件。sdk
:包含 Android 软件开发工具包(SDK)的文件。system
:包含 Android 系统的核心功能和服务。test
:包含各种测试代码和测试框架。tools
:包含用于 Android 开发的各种实用工具。toolchain
:包含交叉编译工具链的相关文件。u-boot
:包含 U-Boot 引导加载程序的代码和配置文件。vendor
:包含设备制造商特定的代码和配置文件。rockdev
: 存放编译输出固件。
在这些目录中我们经常会修改到的目录主要有u-boot、kernel、vendor、system、device、frameworks、packages
编译环境配置
这里我们演示直接在ubuntu18.04下编译,因为大家的编译环境都有所不同可能会有意想不到的错误,如果你的环境无法编译通过可以使用Docker环境进行编译参考【Docker】编译环境搭建,如果你使用的是Docker方式可以跳过本章节自己进行SDK编译 编译Android SDK需要安装下列库
apt-get update && apt-get install -y git python make openjdk-8-jdk git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libgl1-mesa-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libxml2-utils xsltproc unzip python bc imagemagick ccache schedtool libssl-dev libncursesw5-dbg libncursesw5-dev libncurses5 libncursesw5 libncursesada5-dev libncurses5-dbg libncurses5-dev libncursesada-doc libncursesada5 libncurses-dev libncurses-gst libncurses5-dev clang
注意上面命令不能有换行,他们是一行命令,如果手动换行需要加连接符
命令解释:
apt-get update # 更新包列表以进行升级和新包安装
apt-get install git # 安装git
apt-get install python # 安装python
apt-get install make # 安装make
apt-get install -y openjdk-8-jdk # 安装Java开发工具包
apt-get install -y git-core # 安装git核心库
apt-get install -y gnupg # 安装GNU
apt-get install -y flex # 安装flex(词法分析器生成器)
apt-get install -y bison # 安装bison(GNU解析器生成器)
apt-get install -y gperf # 安装gperf(哈希函数生成器)
apt-get install -y build-essential # 安装编译工具集合
apt-get install -y zip # 安装zip
apt-get install -y curl # 安装网络传输工具curl
apt-get install -y zlib1g-dev # 安装zlib开发库
apt-get install -y libgl1-mesa-dev # 安装OpenGL库开发文件
apt-get install -y gcc-multilib # 安装GCC多库支持
apt-get install -y g++-multilib # 安装G++多库支持
apt-get install -y libc6-dev-i386 #安装libc6
apt-get install -y lib32ncurses5-dev # 安装ncurses开发库
apt-get install -y x11proto-core-dev # 安装X11协议核心开发库
apt-get install -y libx11-dev # 安装libx11开发库
apt-get install -y lib32z-dev # 安装32位zlib开发库
apt-get install -y libxml2-utils # 安装libxml2工具集
apt-get install -y xsltproc # 安装XSLT处理器
apt-get install -y unzip # 安装unzip
apt-get install -y python # 重新安装python
apt-get install -y bc # 安装bc
apt-get install -y imagemagick # 安装ImageMagick
apt-get install -y ccache # 安装ccache
apt-get install -y schedtool # 安装调度工具
apt-get install -y libssl-dev # 安装SSL开发库
apt-get install -y libncurses* # 安装ncurses开发库
apt-get install -y clang # 安装Clang编译器
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
运行如下:
SDK编译
全编译
在SDK目录下运行编译命令:
root@lckfb:/home/lckfb_tspi/android11/Release/tspi_android_sdk_20230909# cd u-boot && ./make.sh rk3566 && cd ../kernel && make clean && make distclean && make ARCH=arm64 tspi_defconfig rk356x_evb.config android-11.config && make ARCH=arm64 tspi-rk3566-user-v10.img -j16 && cd .. && source build/envsetup.sh && lunch rk3566_tspi-userdebug && make installclean -j16 && make -j16 && ./mkimage.sh
命令解释:
cd
u-boot
- 进入名为
u-boot
的目录,该目录包含U-Boot引导加载程序的源代码和构建脚本。
- 进入名为
./make.sh
rk3566
- 执行
make.sh
脚本,使用参数rk3566
,用于编译和构建适用于 RK3566 平台的 U-Boot 引导加载程序。
- 执行
cd ../kernel
- 返回上级目录,进入名为
kernel
的目录,该目录包含 Linux 内核的源代码和构建脚本。
- 返回上级目录,进入名为
make clean && make distclean
- 使用
make clean
命令清理之前的编译结果。 - 使用
make distclean
命令进一步清理之前的配置和生成文件。
- 使用
make ARCH=arm64 tspi_defconfig rk356x_evb.config android-11.config
- 使用
make
命令与ARCH=arm64
参数编译内核。 - 该命令使用
tspi_defconfig
配置为基础配置。 - 添加
rk356x_evb.config
和android-11.config
基于配置。
- 使用
make ARCH=arm64 tspi-rk3566-user-v10.img -j16
- 使用
make
命令与ARCH=arm64
参数编译内核。 - 使用
tspi-rk3566-user-v10.img
作为配置选择。 - 这里使用
-j16
参数表示使用 16 个线程进行并行编译。
- 使用
cd ..
- 返回上级目录也就是到 SDK 跟目录下。
source build/envsetup.sh
- 运行
envsetup.sh
脚本以设置构建环境变量和函数。
- 运行
lunch rk3566_tspi-userdebug
- 使用
lunch
命令设置构建目标为rk3566_tspi-userdebug
,选择适用于RK3566平台的泰山派开发板配置。
- 使用
make installclean -j16
- 使用
make
命令进行清理操作,清理之前的构建结果。 - 使用
-j16
参数表示使用 16 个线程进行并行操作。
- 使用
make -j16
- 使用
make
命令进行编译操作。 - 使用
-j16
参数表示使用 16 个线程进行并行编译。
- 使用
./mkimage.sh
- 运行
mkimage.sh
脚本,用于生成升级镜像。
- 运行
如果你的环境没有问题,那么你将会一把编译成功并且打包生成镜像,最后的日志如下,编译的过程是非常漫长的,尤其是第一次编译后续编译就会快上很多,具体根据你的电脑情况来,我这里编译用了将近4个多小时。如果你编译出现错误请耐心查看日志排除,大多数情况下都是环境依赖导致的,如果编译是有提醒内存不足可以降低编译线程数试试,比如-j8
编译成功:镜像会生成到rockdev/Image-rk3566_tspi目录下,我们进入查看一下都生成了哪些镜像
root@lckfb:/home/lckfb_tspi/android11/Release/tspi_android_sdk_20230909/rockdev/Image-rk3566_tspi# ls
baseparameter.img boot.img dtbo.img misc.img pcba_small_misc.img recovery.img super.img vbmeta.img
boot-debug.img config.cfg MiniLoaderAll.bin parameter.txt pcba_whole_misc.img resource.img uboot.img
2
3
镜像解释:
baseparameter.img
:用于存储Rockchip平台的显示配置信息,如分辨率和显示效果调节。确保关机后重启能保持与关机前相同的效果,并确保整个开机过程的显示效果一致。需烧录到baseparameter分区。boot-debug.img
:与boot.img
相比,用户版本固件可以烧写此镜像以获得root权限操作。boot.img
:Android格式的启动镜像,包含ramdisk根文件系统、内核镜像Image、内核DTB和资源镜像resource.img。需烧录到开发板的boot分区。config.cfg
:瑞芯微下载工具的配置文件。dtbo.img
:用于多个产品间的兼容性,支持Android 10.0及以上版本的Device Tree Overlays功能。需要烧录到dtbo分区。MiniLoaderAll.bin
:在RK3566平台的U-Boot之前运行的一段loader代码(位于U-Boot更早阶段的Loader)。MiniLoaderAll.bin由TPL和SPL两部分组成,其中TPL用于初始化DDR并运行在SRAM中;而SPL运行在DDR中,主要负责加载和引导uboot.img。misc.img
:包含Android BCB(Bootloader Control Block)信息和A/B系统信息。需烧录到misc分区。Misc分区是非常重要的分区,包括BCB(用于控制系统启动流程、Android系统与BootLoader、recovery交互的机制)和A/B系统数据块。另外,它还包含recovery-wipe开机标识信息,烧录后会进入recovery模式,常用于PCBA测试。pcba_small_misc.img
:包含PCBA开机标识信息,烧录后会进入简易版PCBA模式,不常用。pcba_whole_misc.img
:包含PCBA开机标识信息,烧录后会进入完整版PCBA模式,不常用。parameter.txt
:一个txt文本文件,记录了RK3566平台的分区表信息,包括分区名、起始地址和结束地址。此文件无需烧录到Flash设备(如eMMC或NAND),而是在烧写镜像时读取其中的信息来定义分区。recovery.img
:由多个镜像合并而成,包括recovery-ramdisk根文件系统、内核镜像Image、DTB、DTBO和资源镜像resource.img。用于进入recovery模式,该模式用于设备修复、升级和更新。需烧录到开发板的recovery分区。resource.img
:由RK定义的资源镜像,包含logo和DTB。它不会单独烧录,而是打包到boot.img和recovery.img中。super.img
:超级镜像,由多个镜像合并而成,包括odm.img、product.img、system.img、system_ext.img和vendor.img。需烧录到开发板的super分区。uboot.img
:由多个镜像合并而成,包括trust镜像(ARM Trusted Firmware + OP-TEE OS)、u-boot镜像和u-boot dtb。编译U-Boot时会将这些镜像打包成一个uboot.img。需烧录到开发板的uboot分区。vbmeta.img
:包含AVB(Android Verified Boot)校验信息,用于AVB校验。AVB是Google设计的一套固件校验流程。
下载镜像
我们全编译的时候有执行下面这个命令,这个命令是用来生成打散的升级镜像.img的
./mkimage.sh
注意:如果你执行了单独编译kernel命令的话,需要先执行下面命令重新生成一些boot.img否则会有无法正常启动问题
make ARCH=arm64 tspi_defconfig rk356x_evb.config android-11.config && make ARCH=arm64 tspi-rk3566-user-v10.img -j16
我们可以在SDK/rockdev/Image-rk3566_tspi#目录下查看所有生成的img
SDK/rockdev/Image-rk3566_tspi# ls
baseparameter.img boot.img dtbo.img misc.img pcba_small_misc.img recovery.img super.img vbmeta.img
boot-debug.img config.cfg MiniLoaderAll.bin parameter.txt pcba_whole_misc.img resource.img uboot.img
2
3
下载配置文件:
打开瑞芯微开发工具并导入上面下载的配置文件
配置文件导入成功
导入成功后下载选型、地址、名字都是对的,但路径是笔者电脑的路径,所以你需要把路径都修改成你自己的SDK/rockdev/Image-rk3566_tspi#xxx.img路径 泰山派进入Loader后点击执行就可以烧录镜像 如果你只想单独更新某个镜像可以通过勾选来决定。打包生成update.img固件
下面这个命令会把所有镜像合成一个update.img镜像,我们在《第06章.【立创·泰山派】系统镜像》中提供的就是此方法生成的镜像
./build.sh -u
运行命令后会把镜像输出到下列目录:
SDK/rockdev/Image-rk3566_tspi# ls
baseparameter.img boot.img dtbo.img misc.img pcba_small_misc.img recovery.img super.img update.img #这里
boot-debug.img config.cfg MiniLoaderAll.bin parameter.txt pcba_whole_misc.img resource.img uboot.img vbmeta.img
2
3
4
5
SDK/rockdev/Image-rk3566_tspi#目录下会多出来一个update.img镜像
我们通过下载工具的第二行升级固件中可以直接升级这个镜像
单独编译u-boot
cd u-boot && ./make.sh rk3566
单独编译kernel
make ARCH=arm64 BOOT_IMG=../rockdev/Image-rk3566_tspi/boot.img tspi-rk3566-user-v10.img -j32
编译完成后在kernel目录会生成boot.img我们可以单独烧入boot.img来生效kernel的修改
单独更新boot.img
执行这个操作需要之前正常升级过固件,并且能进入Loader模式(注意不是maskrom模式),这个方法主要用来快速生效kernel修改的。 下载配置文件在瑞芯微开发工具中点击鼠标右键导入配置文件
导入成功,我们可以看到只有Boot被勾选上所以只会烧入Boot
这里Boot的路径是笔者电脑的,所以需要点击更改路径到你的SDK/kernel/boot.img,注意不是SDK/rockdev/Image-rk3566_tspi下的boot.img
接着让泰山派进入升级模式点击执行就可以单独更新boot.img了,因为只更新boot.img镜像他的升级速度就会非常快几秒钟就搞定了,单独更新其他的img也是类似原理
android单独编译
如果是新打开的命令窗口需要先运行环境配置,运行一次就可以了只要不关闭窗口
source build/envsetup.sh && lunch rk3566_tspi-userdebug
注意没有特殊情况千万不要make clean因为clean以后在编译要很久,如果我们发现修改没有生效通常installclean后再编译就好了
make installclean -j16 && make -j16
有时候我们为了提高效率也会选择单独编译android中的模块,然后通过adb或者其他方式直接push到设备上进行调试
mm:#编译当前目录下的模块,当前目录下要有Android.mk文件
mmm:#编译指定路径下的模块,指定路径下要有Android.mk文件
2