1. Android开发

1.1. 编译环境搭建

准备台电脑,编译Android对机器要很高,推荐标准配置,避免机器某个导致Android编译失败。

标准配置:

  • 64位处理器32线程

  • 64位物理内存32GB

  • 固态硬盘1TB 空闲的磁盘空间

  • 系统:使用 Ubuntu 22.04 操作系统或更高版本

最高配置:

  • 64位处理器72线程

  • 64位物理内存128GB

  • NVME固态硬盘7TB 空闲的磁盘空间

  • 系统:使用 Ubuntu 22.04 操作系统或更高版本

1.2. 编译 Android 镜像

注意

在编译安卓镜像的时候,切忌用root用户去编译。

下载Android SDK源代码

# 下载完成后,在解压前先校验下MD5码:
$ md5sum -c android*.txt
android*_rk35xx_*_sdk.tar.gzaa: OK
android*_rk35xx_*_sdk.tar.gzab: OK
android*_rk35xx_*_sdk.tar.gzac: OK
android*_rk35xx_*_sdk.tar.gzad: OK
android*_rk35xx_*_sdk.tar.gzae: OK
android*_rk35xx_*_sdk.tar.gzaf: OK
android*_rk35xx_*_sdk.tar.gzag: OK
android*_rk35xx_*_sdk.tar.gzah: OK

# 解压Android源码
$ cat *.tar.gz* | tar -xzv

#进入Android SDK根目录
$ cd android*

#执行脚本安装依赖
$./install_dependencies.sh 并输入密码即可开始自动安装依赖。

# 切换python2以保证u-boot编译通过
sudo ln -sf /usr/bin/python2 /usr/bin/python

编译SDK自带的板型

  • Android11 以 鲁班猫2 HDMI为例;

# 执行设置环境变量:
source build/envsetup.sh

# 列出配置菜单
lunch
.............................................................
请注意:使用一键编译命令之前需要设置环境变量,选择好自己需要编译的平台
.............................................................
 50. rk3568_lubancat_2_v2_hdmi-user              HDMI接口
 51. rk3568_lubancat_2_v2_hdmi-userdebug
 52. rk3568_lubancat_2_v2_mipi1080p-user         野火5.5寸屏幕
 53. rk3568_lubancat_2_v2_mipi1080p-userdebug
 54. rk3568_lubancat_2_v2_mipi600p-user          野火7寸屏幕
 55. rk3568_lubancat_2_v2_mipi600p-userdebug
 56. rk3568_lubancat_2_v2_mipi800p-user          野火10.1寸屏幕
 57. rk3568_lubancat_2_v2_mipi800p-userdebug

#选择数字: 51

注意

user:权限受限;适用于生产环境。userdebug:与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型,合适开发调试

  • Android12 以 鲁班猫4 HDMI为例;

# 执行设置环境变量:
source build/envsetup.sh

# 列出配置菜单
lunch
.............................................................
请注意:使用一键编译命令之前需要设置环境变量,选择好自己需要编译的平台
.............................................................
 61. rk3588s_lubancat_4_hdmi-user
 62. rk3588s_lubancat_4_hdmi-userdebug              HDMI接口
 63. rk3588s_lubancat_4_hdmi_tv-user
 64. rk3588s_lubancat_4_hdmi_tv-userdebug           HDMI Android12 TV版
 65. rk3588s_lubancat_4_mipi1080p-user
 66. rk3588s_lubancat_4_mipi1080p-userdebug         野火5.5寸屏幕
 67. rk3588s_lubancat_4_mipi600p-user
 68. rk3588s_lubancat_4_mipi600p-userdebug          野火7寸屏幕
 69. rk3588s_lubancat_4_mipi800p-user
 70. rk3588s_lubancat_4_mipi800p-userdebug          野火10.1寸屏幕

# 选择数字: 62
  • build.sh 一键编译

# -J16后面数字表示16个线程数,如果遇到编译报错或者内存不足可降低线程数
./build.sh -UKAu -J16
  • 生成的固件位于rockdev/Image-rk3568_lubancat_2_hdmi目录下:

~/android11/rockdev/Image-rk3568_lubancat_2_hdmi$ ll
total 3622700
drwxrwxr-x 2 d d       4096 Sep  8 07:34 ./
drwxrwxr-x 5 d d       4096 Sep 13 02:50 ../
-rwxrwxr-x 1 d d    1048576 Aug  1 10:14 baseparameter.img*
-rw-rw-r-- 1 d d   35432448 Sep  8 07:27 boot-debug.img
-rw-rw-r-- 1 d d   35284992 Sep  8 07:26 boot.img
-rwxrwxr-x 1 d d       6129 Aug  1 10:14 config.cfg*
-rw-rw-r-- 1 d d        623 Sep  8 07:26 dtbo.img
-rw-rw-r-- 1 d d     465344 Sep  8 05:42 MiniLoaderAll.bin
-rw-rw-r-- 1 d d      49152 Aug  1 11:10 misc.img
-rw-rw-r-- 1 d d        630 Sep  8 07:26 parameter.txt
-rw-rw-r-- 1 d d      49152 Aug  1 11:10 pcba_small_misc.img
-rw-rw-r-- 1 d d      49153 Aug  1 11:10 pcba_whole_misc.img
-rw-rw-r-- 1 d d  127311872 Sep  8 07:27 recovery.img
-rw-rw-r-- 1 d d    2636288 Sep  8 07:25 resource.img
-rw-r--r-- 1 d d 1667579532 Sep  8 07:30 super.img
-rw-rw-r-- 1 d d    4194304 Sep  8 05:42 uboot.img
-rw-rw-r-- 1 d d 1836413514 Sep  8 07:34 update.img   <----这就是打包完成的Android镜像
-rwxrwxr-x 1 d d       4096 Aug  1 10:14 vbmeta.img
  • 可使用./build.sh单独编译

# 编译U-boot
./build.sh -U

# 编译 Kernel
./build.sh -K

# 编译Android
./build.sh -A

# 镜像打包
./build.sh -u

# 线程数
./build.sh -J

# 打包update.zip升级包
./build.sh -Auo

1.3. 编译Android TV

Android TV 的定义 Android TV 是谷歌基于 Android 系统开发的一个专门为电视设备优化的操作系统。它并不是普通的 Android(如手机或平板使用的版本),而是一个针对大屏幕设备(如智能电视、电视盒子等)定制的版本,提供更适合客厅娱乐体验的用户界面和功能。

Android TV 版 VS 普通 Android 用途不同: 普通 Android 主要用于手机和平板,Android TV 则是为电视大屏设计。

操作方式: 普通 Android 依赖触摸,Android TV 依赖遥控器或手柄。

应用兼容性: 并非所有手机上的 Android 应用都能直接在 Android TV 上运行,只有经过适配的“Android TV 版”应用才能完美使用。

系统精简: Android TV 系统去掉了一些手机专用的功能(如电话、短信),增加了电视相关的功能(如 HDMI-CEC 控制)。

编译Android TV版本要求清理建构 make clean 再编译,避免开机遇到奇怪问题

建议选择user版本,这样不会被app提示本机已root并强制退出

  • Android11 以 鲁班猫2 HDMI为例;

# 执行设置环境变量:
source build/envsetup.sh

#清理建构
make clean

# 列出配置菜单
lunch
.............................................................
请注意:使用一键编译命令之前需要设置环境变量,选择好自己需要编译的平台
.............................................................
 86. rk356x_lubancat_2_android_tv_11-user           Android TV版 HDMI接口
 87. rk356x_lubancat_2_android_tv_11-userdebug

# 选择数字: 86
  • Android12 以 鲁班猫4 HDMI为例;

# 执行设置环境变量:
source build/envsetup.sh

#清理建构
make clean

# 列出配置菜单
lunch
.............................................................
请注意:使用一键编译命令之前需要设置环境变量,选择好自己需要编译的平台
.............................................................
 63. rk3588s_lubancat_4_hdmi_tv-user
 64. rk3588s_lubancat_4_hdmi_tv-userdebug           HDMI Android12 TV版

# 选择数字: 63
  • build.sh 一键编译

./build.sh -UKAu -J16

了解./build.sh菜单

dev@dev/rk356x-lubancat-android1x$./build.sh: option requires an argument --
USAGE: [-U] [-CK] [-A] [-p] [-o] [-u] [-v VERSION_NAME]
No ARGS means use default build option
WHERE: -U = build uboot
   -C = build kernel with Clang
   -K = build kernel
   -A = build android
   -p = will build packaging in IMAGE
   -o = build OTA package
   -u = build update.img
   -v = build android with 'user' or 'userdebug'
   -d = huild kernel dts name
   -V = build version
   -J = build jobs

- 编译kernel             ./build.sh -K
- 编译uboot              ./build.sh -U
- 编译android            ./build.sh -A
- 编译kernel with Clang  ./build.sh -C
- 打包固件               ./build.sh -u

1.4. 预置第三方apk

预置不可卸载、可卸载的apk

  • 首先进入指定目录:device/rockchip/rk356x/rk3568_lubancat_2_hdmi

# 创建存放不可卸载应用的文件夹
mkdir preinstall

# 创建存放可卸载应用的文件夹
mkdir preinstall_del_forever

# 创建存放卸载后可通过恢复出厂设置复原的应用的文件夹
mkdir preinstall_del

将APK文件放入对应目录的示例:

# 将一个APK放入不可卸载目录
cp /path/to/your_app.apk ./preinstall/

# 将一个APK放入可卸载目录
cp /path/to/your_app2.apk ./preinstall_del_forever/

# 将一个APK放入可卸载但可恢复目录
cp /path/to/your_app3.apk ./preinstall_del/

注意事项:确保路径 device/rockchip/rk356x/rk3568_lubancat_2_hdmi 存在,替换 /path/to/your_app.apk 为您实际的APK文件路径
  • APK文件名建议:

使用英文命名
避免使用中文字符
建议使用小写字母和下划线
示例:myapp_v1.0.apk

根据需求只需将 apk 放在对应文件夹即可,比如将 lubancat.apk 设置为不可卸载应用,那么需要放进preinstall文件夹中。编译镜像烧写进去会发现已预置apk。

1.5. 建构Android系统OTA升级

OTA(Over-The-Air)升级包是指将系统更新推送到用户设备的过程中的文件包。OTA升级包由设备制造商和手机操作系统供应商共同制定,包含了系统更新的补丁、新特性和其他内容。升级包的大小通常取决于设备型号、系统版本和升级包的内容。较大的 OTA 升级包可能会对设备的性能产生影响,因此在下载和安装过程中需要谨慎处理。

现在将编译2个不同版本,分别是完全升级和增量升级,可以通过本地升级或者网络在线升级(网络在线升级我们暂时不提供,企业客户需要的请联系售后提供支持)

野火网盘镜像一概不加入OTA升级包,如需要请用户自行根据教程去做ota升级包。

  • 完全升级(完整包) :完整升级是将整个系统或应用程序的最新版本下载并安装到设备上,升级包较大,可能达到数百 MB 甚至几 GB,因为它包含了所有的系统文件和应用程序文件,可以修复旧系统中的所有问题,包括未发现的 bug 和系统文件的损坏。

  • 增量升级(差异包):增量升级是只下载和安装自上次更新以来发生变化的部分,升级包较小,只有几 MB 到几十 MB,因为它只包含了变化的部分,可以显著减少下载时间和数据使用量,提高更新效率。

当前AndroidSDK源码是0.0.1 我们将编译制作0.0.2和0.0.3这2个包用在制作增量包上使用。

如果希望完全更新不会出现一些问题,直接编译跳过做增量升级包,使用完整升级包更新系统,完整包和增量包区别是空间大小,下载大小和时间长短。

1.5.1. 制作OTA升级包

构建完整更新

  • 先编译0.0.2版本修改device/rockchip/rk3588/device.mk,找到ro.product.version = 0.0.1 改为 0.0.2

构安卓12的时候,带o,./build.sh -Auo 是打包update ota升级版,形成文件名是rk3588s_lubancat_4_v1_hdmi-ota-eng.dev.zip
编译完成后,会在rockdev/Image-rk3588_lubancat_4_hdmi/目录下生成所需镜像,如下所示:
dev@dev:~/android/android12-dev/rockdev/Image-rk3588s_lubancat_4_v1_hdmi$ ll
........
-rw-rw-r-- 1 dev dev  725114113 Oct 18 07:54 rk3588s_lubancat_4_v1_hdmi-ota-eng.dev.zip
-rw-rw-r-- 1 dev dev 2011523312 Oct 18 07:54 rk3588s_lubancat_4_v1_hdmi-target_files-eng.dev.zip
.......

将 rk3588s_lubancat_4_v1_hdmi-ota-eng.dev.zip 重命名为 ota-update.zip 完整升级包。
mv ./rockdev/Image-rk3588s_lubancat_4_v1_hdmi/rk3588s_lubancat_4_v1_hdmi-ota-eng.dev.zip ./ota-update.zip

rk3588s_lubancat_4_v1_hdmi-target_files-eng.dev.zip的0.0.2版本作为基础素材包,重命名为0.0.2.zip备份下来,用来制作增量升级包会用到。
mv ./rockdev/Image-rk3588s_lubancat_4_v1_hdmi/rk3588s_lubancat_4_v1_hdmi-target_files-eng.dev.zip ./0.0.2.zip

再次编译0.0.3

  • 接着修改device/rockchip/rk3588/device.mk,找到ro.product.version = 0.0.2 改为 0.0.3

./build.sh -UCKAuo

编译完成后,会在rockdev/Image-rk3588_lubancat_4_hdmi/目录下生成所需镜像,如下所示:
dev@dev:~/android/android12-dev/rockdev/Image-rk3588s_lubancat_4_v1_hdmi$ ll
........
-rw-rw-r-- 1 dev dev  725114113 Oct 18 07:54 rk3588s_lubancat_4_v1_hdmi-ota-eng.dev.zip
-rw-rw-r-- 1 dev dev 2011523312 Oct 18 07:54 rk3588s_lubancat_4_v1_hdmi-target_files-eng.dev.zip
.......

将rk3588s_lubancat_4_v1_hdmi-target_files-eng.dev.zip 重命名 为0.0.3.zip
mv ./rockdev/Image-rk3588s_lubancat_4_v1_hdmi/rk3588s_lubancat_4_v1_hdmi-target_files-eng.dev.zip ./0.0.3.zip

将上面0.0.2.zip和0.0.3.zip进行备份保存

构建增量更新

执行下面代码将制作OTA增量包
ota_from_target_files --block -v -i 0.0.2.zip -p out/host/linux-x86 -k build/target/product/security/testkey 0.0.3.zip files-update.zip
会形成files-update.zip增量升级包在当前目录。

这个命令是使用Ota(Over-the-air)工具从目标文件中读取数据,用于OTA更新。
下面分解每个选项:
-block: 使用block模式进行OTA read。
-v: 增加 verbosity,显示更多详细信息。
-i <zip_file>: 指定要从哪个 zip 压缩包中读取数据,这里是指 0.0.2.zip。
-p <out_dir>: 指定输出 directory,用于存储从目标文件中读取的数据。这里是 out/host/linux-x86。
-k <key_file>: 指定密钥文件,用于加密或解密读取的数据。这里是 build/target/product/security/testkey。
这个命令会从 0.0.2.zip 和 0.0.3.zip 中读取数据,并将其存储在 out/host/linux-x86目录中,使用 testkey 密钥进行加密或解密。

1.5.2. Android本地U盘升级

测试完整升级和增量升级

首先使用adb执行getprop ro.product.version可以看到版本=0.0.1

  • 完全升级:ota-update.zip

  • 增量升级:files-update.zip

将U盘或者TF卡格式化FAT32,把ota-update.zip或者files-update.zip 重命名为 update.zip 并复制到U盘鲁班猫板子上,系统检测会弹出是否需要固件升级,如图所示:

../../_images/ota1.png ../../_images/ota2.png ../../_images/ota3.jpg ../../_images/ota4.jpg

完整升级使用adb检测执行getprop ro.product.version可以看到版本从0.0.1变成0.0.2就升级成功;增量升级后执行adb可以看到版本从0.0.2变成0.0.3代表升级升级成功了。