安卓系列教程之ROM系统开发-百问100ask
系统:Android10.0
设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)
开发板启动之后, 就需要通过自己编译源码来制作镜像了,如果是在公司里面开发, 也是基于一个BSP包进行开发, 从0开始移植源码的概率还是比较小。通过这个过程, 慢慢建立对瑞星微平台开发知识的积累过程。
本文档基于X86 64位的Ubuntu 16.04 桌面版本。
安装OpenJDK 8:
sudo apt-get update
sudo apt install -y openjdk-8-jdk
安装编译所需依赖(x86)的软件包
sudo apt-get install -y openjdk-8-jdk
sudo apt-get install -y libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install -y tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install -y dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install -y git-core gnupg flex bison gperf build-essential
sudo apt-get install -y zip curl zlib1g-dev gcc-multilib g++-multilib
sudo apt-get install -y libc6-dev-i386
sudo apt-get install -y lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install -y libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install -y lib32z1-dev ccache
sudo apt-get install -y bc python flex bison gperf libsdl-dev libesd0-dev build-essential zip curl
sudo apt-get install -y libssl-dev liblz4-tool
sudo apt-get install -y libesd-java libwxgtk3.0-dev squashfs-tools pngcrush schedtool libxml2
sudo apt-get install -y lzop schedtool lib32readline-dev libswitch-perl libssl-dev
以上部分软件并非必须, 也有部分是重复的, 直接复制粘贴到命令行即可。
据Firefly官网下载方法下载源码,得到Firefly-RK3399_Android10.0_git_20210114:
编译 Android10.0 固件 — Firefly Wiki
将两个7z文件,以及bundle中7z文件上传到编译机器中, 并解压源码:
#1. 新建YOURDIR目录, 用于存放7z文件, 你自己命名即可
mkdir ~/YOURDIR
cd ~/YOURDIR
#2. 将Firefly-RK3399_Android10.0_git_20210114的两个7z文件拷贝到YOURDIR目录.并解压Android10 SDK源码
7z x ./Firefly-RK3399_Android10.0_git_20210114.7z.001 -ork3399_Android10.0
#注意:根据提示安装7z命令
#3. 从git仓库拉出源码
cd ./rk3399_Android10.0
通过git log可以看到相关仓库提交记录
#4.下载远程bundle(推荐,因为官网可能会更新新的东西)
git clone https://gitlab.com/TeeFirefly/rk3399-android10.0-bundle.git .bundle在百度云盘里面也有独立的bundle包, 也可以直接解压bundle进行更新代码,可以做如下操作((不太推荐, 上面进行了git clone, 以下步骤就不需要执行)
mv rk3399-android10.0-bundle.7z ./rk3399_Android10.0
cd ./rk3399_Android10.0
7z x rk3399-android10.0-bundle.7z -r -o. && mv rk3399-android10.0-bundle/ .bundle/
#5. 更新SDK,并且后续更新不需要再次拉取远程仓库,直接执行以下命令即可
.bundle/update
#6. 按照提示已经更新内容到 FETCH_HEAD,同步FETCH_HEAD到firefly分支
git rebase FETCH_HEAD
新的提交就变成如下了:
我们使用的rk3399-roc-pc-plus开发板没有配置EMMC, 触摸屏,以及LCD, 但是该开发板引出HDMI接口,直接通过HDMI线接上PC的显示屏就可以看到界面,你只需要把这个开发板当成一个电脑来看即可,通过USB鼠标和键盘就能实现对Android系统的输入操控, 当然后面我们通过投屏软件来对开发板进行操控。
接下来就针对HDMI+DP 显示版本的源码编译:
cd ~/YOURDIR /rk3399_Android10.0
# 一次性将uboot, kernel, android源码编译出来
./FFTools/make.sh -d rk3399-roc-pc-plus -j8 -l rk3399_roc_pc_plus-userdebug
解释:
-u|k|a : 单独编译uboot|boot(kernel)|android源码
-d : 编译内核的dts文件名.
-d后面指定的如果是rk3399开头, 那么uboot的配置为: rk3399, 内核配置为: rk3399.config
-l : 指定编译Android时需要lunch(选择)的产品名
-j : 指定编译线程数量
编译时间取决于每个人的电脑性能, 本文章用的真机,大概2-3个小时就可以编完, 如果是虚拟机的话, 基本需要10几个小时左右, 如果大家编译出现问题, 一般都可能是缺失某些软件包, 通过关键词搜索百度,基本都解决,另外就可能是内存不够, 如:
可以参考以下链接来解决:
编译安卓源码报错:OpenJDK 64-Bit Server VM warning:INFO:os::commit_memory(...)failed; error='...' (errno=12)_夜月枫雪-CSDN博客
注意!! 如果开发板没有EMMC, 只能通过TF卡启动的, 需要对内核做如下改动,以支持SD卡启动:
vim arch/arm64/boot/dts/rockchip/rk3399-roc-pc-plus.dts +88 打开注释
&sdmmc{
supports-emmc; //for sd boot
};
vim arch/arm64/boot/dts/rockchip/rk3399-roc-pc-plus.dtsi +266 添加&vcc_sd{
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
./FFTools/mkupdate/mkupdate.sh -l rk3399_roc_pc_plus-userdebug
-l : 编译Android源码时选择的产品名
-n: 指定目标update.img的名字
-t: 指定镜像类型, 有sd, emmc, 默认为emmc
打包完成后将在rockdev/Image-XXX/ 目录下生成统一固件: product名XXX_XXX_日期XXX.img
参考上一篇文章:Android系统10 RK3399 ini进程启动(三) RK3399开发板运行官方镜像_ldswfun的专栏-CSDN博客
作为初学者,或者开始接触新平台, 搭建环境是比较费时间的, 只要把环境搭好, 后面开发就快了。