1. Android开发¶
1.1. 1. 编译环境搭建¶
准备台电脑,编译Android对机器要很高,推荐标准配置,避免机器某个导致Android编译失败。
标准配置:
64位处理器32线程
64位物理内存32GB
固态硬盘1TB 空闲的磁盘空间
系统:使用 Ubuntu 22.04 操作系统或更高版本
最高配置:
64位处理器72线程
64位物理内存128GB
NVME固态硬盘7TB 空闲的磁盘空间
系统:使用 Ubuntu 22.04 操作系统或更高版本
1.2. 2. 编译 Android 镜像¶
注意
在编译安卓镜像的时候,切忌用root用户去编译。
下载Android SDK源代码
SDK源码获取,百度云链接:https://pan.baidu.com/s/19t8AZV9SYTdjn2uObBiSGA 提取码 hslu
版本更新日志: https://www.firebbs.cn/forum.php?mod=viewthread&tid=37168
# 下载完成后,在解压前先校验下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
# 然后解压
$ cat android*.tar.gza* | tar -xzv
#进入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 一键编译
./build.sh -UKAu
注意
编译kernel时会弹出IO电压域确认提示框,请看原理图认各IO电压域选用的是1.8V还是3.3V,然后在编译时 会弹出界面让你再确认一次,按上面dts的配置选择并确认即可。一定要根据硬件实际情况来配置电压域,否则有烧器件的风险!!!
可以查看设备树配置知道各IO电压域是1.8V还是3.3V,如下图所示,除VCCIO4和VCCIO6为1.8V,其余均为3.3V。
在编译过程中遇到内存不足,可降低建构线程数:
sudo vi build.sh
找到 BUILD_JOBS=56 56是线程数,改到16线程再保存即可。
按 a 进行编辑,把56改成16,最后 :wq! 再编译
生成的固件位于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
注意大小写
1.3. 4. 编译Android TV¶
编译Android TV版本要求清理建构 make clean 再编译,避免开机遇到奇怪问题
建议选择user版本,这样不会被app提示本机已root并强制退出
Android11 以 鲁班猫2 HDMI为例;
# 执行设置环境变量:
source build/envsetup.sh
# 列出配置菜单
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
# 列出配置菜单
lunch
.............................................................
请注意:使用一键编译命令之前需要设置环境变量,选择好自己需要编译的平台
.............................................................
63. rk3588s_lubancat_4_hdmi_tv-user
64. rk3588s_lubancat_4_hdmi_tv-userdebug HDMI Android12 TV版
# 选择数字: 63
build.sh 一键编译
./build.sh -UKAu
了解./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. 5. 预置第三方apk¶
预置不可卸载、可卸载的apK
源码路径查看:android11/device/rockchip/rk356x/rk3568_lubancat_2_hdmi
# 进入到这个目录下,分别新建三个文件夹:
preinstall 存放不可卸载应用
preinstall_del_forever 存放可卸载的应用
preinstall_del 存放卸载后恢复出厂设置会复原应用
将apk文件放置该目录即可 apk最好不带中文。
-rw-rw-r-- 1 d d 80 Sep 22 2022 Android.mk
-rw-rw-r-- 1 d d 298 Sep 22 2022 AndroidBoard.mk
-rw-rw-r-- 1 d d 1141 Apr 10 02:08 BoardConfig.mk
-rw-rw-r-- 1 d d 152 Sep 22 2022 bt_vendor.conf
-rwxrwxr-x 1 d d 6129 Sep 22 2022 config.cfg*
-rw-rw-r-- 1 d d 7959 Sep 22 2022 config.cfg_ab
-rw-rw-r-- 1 d d 11009 Sep 22 2022 config.cfg_ab_gki
-rw-rw-r-- 1 d d 316 Sep 22 2022 dt-overlay.in
-rw-rw-r-- 1 d d 24273 Sep 22 2022 media_profiles_default.xml
drwxrwxr-x 3 d d 4096 Sep 22 2022 ota/
drwxrwxr-x 5 d d 4096 Jun 13 00:20 preinstall_del/ <———— 将apk文件放进去。可卸载,恢复出厂设置会复原应用
-rw-rw-r-- 1 d d 3249 Sep 22 2022 recovery.fstab
-rw-rw-r-- 1 d d 1824 Sep 22 2022 recovery.fstab_AB
-rw-rw-r-- 1 d d 1712 Apr 10 02:07 rk3568_lubancat_2_hdmi.mk
根据需求只需将 apk 放在对应文件夹即可,比如将 lubancat.apk 设置为不可卸载应用,那么需要放进preinstall文件夹中。编译镜像烧写进去会发现已预置apk。
1.5. 6. 建构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盘鲁班猫板子上,系统检测会弹出是否需要固件升级,如图所示:
完整升级使用adb检测执行getprop ro.product.version可以看到版本从0.0.1变成0.0.2就升级成功;增量升级后执行adb可以看到版本从0.0.2变成0.0.3代表升级升级成功了。