目录
3.3.4 修改art/dex2oat/dex2oat.cc
编译环境需要使用Ubuntu22.04,在Windows环境下使用Virtual Box V7.0.8 r156879 (Qt5.15.2)虚拟系统。
1. 下载安装Ubuntu22.04
Virtual Box V7.0.8可以支持自动安装,改一下密码和主机名即可。
安装完成后默认是英文版本,如果需要中文版本,建议手动安装
1.1 安装增强功能
点击VBox的“设备”->“安装增强功能”,进入Ubuntu终端,进入增强功能光盘,运行
sudo apt-get install gcc make perl
sudo ./VBoxLinuxAdditions.run
1.2 设置共享文件夹
此时进系统是访问不了共享文件夹的,需要添加用户
sudo usermod -aG vboxsf xxx
其中xxx是你的用户名。
重启后就可以访问共享文件夹了。
1.3 创建AOSP.vdi
相当于创建一个新的硬盘,用来放AOSP源代码(最少200GB)
fdisk /dev/sdb
进入系统是看不到这个硬盘的,需要格式化。
sudo fdisk -l
查看硬盘信息,找到对应的硬盘,例如这里是/dev/sdb。然后给这个硬盘分区,只分一个区即可
fdisk /dev/sdb
命令(输入 m 获取帮助): n
选择 (默认 p): p
分区号 (1-4, 默认 1): 1
第一个扇区 (2048-419430399, 默认 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-419430399, 默认 419430399):
除了第一个命令输入n,其他命令可以直接回车即可(即选择默认值)。
最后输入命令w退出fdisk。
格式化这个分区:
sudo mkfs.ext4 /dev/sdb1
此时可以看到这个硬盘会自动挂载。最好重新挂载一下(自动挂载的名字很长)
在主文件夹内创建一个OrangePiZero3的文件夹。
sudo mount -t ext4 /dev/sdb1 /home/pq/OrangePiZero3
使用df -h查看:
/dev/sdb1 196G 28K 186G 1% /home/pq/OrangePiZero3
设置开机自动挂载:
sudo gnome-text-editor /etc/fstab
在文件结尾添加一行:
/dev/sdb1 /home/pq/OrangePiZero3 ext4 defaults 0 0
修改一下文件夹权限:
sudo chmod -R 777 /home/pq/OrangePiZero3
1.4 更新相关软件包
sudo apt-get update
sudo apt-get install -y git gnupg flex bison gperf build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache \
libgl1-mesa-dev libxml2-utils xsltproc unzip u-boot-tools python-is-python3 \
libssl-dev libncurses5 clang gawk
1.5 网络配置
主要是为了固定IP,避免使用SSH时IP变化后需要重新配置。
虚拟机设置2个网卡,第一个设置为“桥接网卡”,另外一个设置为“网络地址转换(NAT)”。桥接网卡的方式用来固定IP,而NAT用于访问外网。
使用ifconfig,看一下哪个网卡是和主机一样的IP掩码,将其IP固定就可。
2. 解压AOSP源代码
从官方提供的百度云盘上下载对应AOSP源代码。
将多个压缩包合并为一个压缩包:
cat H618-Android12-Src.tar.gza* > H618-Android12-Src.tar.gz
然后解压:
tar -xvf H618-Android12-Src.tar.gz -C /home/pq/OrangePiZero3
注意,这个tar.gz文件必须放在Ubuntu系统里面解压,千万不要通过共享文件夹解压,可能会冒出一些莫名的问题。
3. 编译代码
可以将Android系统分为uboot、Linux内核和AOSP,而uboot/Linux内核放在解压出来的longan文件夹内,其他则为AOSP。
3.1 编译uboot/Linux
终端进入longan文件夹,首先运行./build.sh config 设置编译选项,每一步的选择如下:
All available platform:
0. android
1. linux
Choice [android]: 0
All available ic:
0. h618
Choice [h618]: 0
All available board:
0. ft
1. p1
2. p2
3. p7
4. p7l
5. perf1
6. perf2
7. perf3
8. qa
Choice [ft]: 2
All available flash:
0. default
1. nor
Choice [default]: 0
All available kern_ver:
0. linux-5.4
Choice [linux-5.4]: 0
All available arch:
0. arm
1. arm64
Choice [arm]: 1
然后运行./build.sh编译即可。
如果要clean,可以执行./build.sh -f
PS:要clean是因为不知道为什么,烧录进去的img跑不起来,shell老是提示错误(实际上是因为后面的make的时候-j4这个参数太大导致,用-j2后恢复正常):
[2671]Jump to second Boot.
NOTICE: BL3-1: v1.0(debug):54937d5
NOTICE: BL3-1: Built : 17:44:59, 2021-12-13
NOTICE: BL3-1 commit: 8
NOTICE: hardware check error1
PANIC in EL3 at x30 = 0x0000000048001f54
更多的命令可以查看build文件夹里面的mkcommon.sh
3.2 编译AOSP源代码
对于Android 12的编译,官方推荐要使用16GB的内存,虚拟机只分配了8GB,可以尝试加大交换内存空间(尝试是失败的,最终是加了一根内存条)。
返回上一级目录,环境设置:
source build/envsetup.sh
选择lunch版本
lunch apollo_p2-userdebug
编译
make -j2
-j2表示2个进程编译,可以根据自己的电脑配置设定。 注意,最好不要太大,不然可能编译没问题,但是烧录到板子上会出错。现在的版本应该是不需要这个参数,会自动选择合适的参数。
打包
pack
编译生成的安卓镜像存放路径为:
longan/out/h618_android12_p2_uart0.img
3.3 内存问题调试记录
有时候会出现编译错误(其实就是内存不够导致的,内存必须大于16GB,其他方式都无效)。
ERROR: Dex2oat failed to compile a boot image.It is likely that the boot classpa
th is inconsistent.Rebuild with ART_BOOT_IMAGE_EXTRA_ARGS="--runtime-arg -verbos
e:verifier" to see verification errors.
3.3.1 查看具体什么问题
make -j2 ART_BOOT_IMAGE_EXTRA_ARGS="--runtime-arg -verbose:verier" -j1
不过这个命令有时候跑不完,运行会自动关闭终端。
3.3.2 关闭dex2oat(无效)
export WITH_DEXPREOPT=false
无效。
3.3.3 增加cache(无效)
安装ccache
sudo apt-get install ccache
编辑~/.bashrc文件
sudo gnome-text-edit ~/.bashrc
在文件结尾添加:
export CCACHE_DIR="/home/pq/.ccache"
export CC="ccache gcc" export CXX="ccache g++"
export PATH="$PATH:/usr/lib/ccache"
注意CCACHE_DIR中改为自己的用户名。
更新环境变量
source ~/.bashrc
配置更大的cache
ccache -M 20G
20G表示分配20G的cache空间。不过,也没有用。
3.3.4 修改art/dex2oat/dex2oat.cc
参考文档:
在编辑器中查找“in_length”,把对应地方的程序改一下,原来的是直接将文件拷贝(int64 in_length = in->GetLength),当文件比较大的时候就出问题了,所以改为8K循环拷贝。
std::unique_ptr<File> out(OS::CreateEmptyFile(oat_unstripped_[i].c_str()));
size_t buffer_size = 8192;
std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
if(out == nullptr){
PLOG(ERROR) << "Failed to pen oat file for writing:" << oat_unstripped_[i];
return false;
}
while(true)
{
int bytes_read = TEMP_FAILURE_RETRY(read(in->Fd(), buffer.get(), buffer_size));
if (bytes_read <= 0)
break;
bool write_ok = out->WriteFully(buffer.get(), bytes_read);
CHECK(write_ok);
}
这一步改完有效,不过后面会出同样的错误提示。
还有会出现编译时间太长,终端自动关闭,这种方式可以通过再次make解决。
3.3.5 进入控制台的方式编译
Ubuntu默认是进入图形界面,可以进入控制台以节省内存。
进入控制台:
sudo systemctl set-default multi-user
恢复图形模式:
sudo systemctl set-default graphical
设置后重启即可进入相应的模式。
在纯命令行模式下会出现无法显示中文的问题,参考:
Ubuntu(20.04)在纯命令行模式下中文出现菱形乱码的解决办法(Ubuntu版本应该是通用的)_ubuntu命令行菱形乱码_天才花道的博客-CSDN博客
首先安装字库
sudo apt-get install zhcon
添加用户到video中
sudo adduser $(whoami) video
重启一下,运行该字库
zhcon --utf8
编辑一下.bashrc
sudo vim ~/.bashrc
找到alias l='ls -CF',在后面一行添加:
alias hz='zhcon --utf8'
4. 烧录
TF卡通过读卡器插入Windows系统,通过官方提供的工具PhoenixCard烧录。
4.1 恢复TF卡
因为烧录过Android镜像的TF卡分区会比较多,所以先将TF卡恢复一下,如下图:
4.2 烧录镜像
选择固件镜像文件,然后选择“启动卡”,选择正确的TF卡,最后点击“烧卡”。
5. 使用命令链接WIFI
由于Zero3的开发板默认不带屏幕,且没有Micro HDMI线,所以需要采用命令的方式链接WIFI。
首先要进入shell(可以插入USB使用adb shell或串口console输入)
5.1 打开wifi
cmd wifi set-wifi-enabled enabled
5.2 链接wifi路由器
cmd -w wifi connect-network ssid wpa2 password
其中ssid是wifi网络名,password是wifi的密码。
5.3 查看wifi状态
cmd wifi status
6. 实用工具
6.1 SSH
在Ubuntu中安装SSH
sudo apt-get install openssh-server
安装完成后使能开机自启动SSH服务器功能:
sudo systemctl enable ssh
然后重启一下ssh服务:
sudo systemctl restart ssh
在VBox的设置里面,设置网络的端口转发规则,如下图:
在Windows端查看虚拟机的IP地址,如下图192.168.56.1
在windows端安装客户端,例如Tabby,官方给的是MobaXterm
点中Session,如下图
弹出界面:
位置2填入之前查的IP地址:192.168.56.1
位置3填入用户名
最后设置的效果:
6.2 Samba
samba是Linux系统上实现SMB协议(Server Messages Block,信息服务块)的一个免费软件。SMB协议是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。
sudo apt-get install samba
修改配置文件:
sudo gnome-text-editor /etc/samba/smb.conf
在合适的位置添加一个新类目:
[OrangePiZero3]
comment = OrangePiZero3
path = /home/pq/OrangePiZero3
browseable = true
writable = true
保存退出,然后执行下面的命令添加一个用户(最好和Ubuntu的用户名一样)
sudo smbpasswd -a pq
使能并复位smb
sudo systemctl enable smbd
sudo systemctl restart smbd
然后把VBox的网络连接方式改一下,改为桥接网卡
回到Ubuntu执行ifconfig查看ip地址,记住这个地址(例如192.168.13.100),在windows端Winr + R,填入这个地址即可访问Ubuntu下的共享文件夹了。
注意,此时Ubuntu的IP地址变掉了,6.1的SSH配置需要同步修改,把IP地址改为新的地址即可。
此时最好把Ubuntu的IP地址固定。
6.3 Visual Studio Code
VSCode也可以直接使用SSH的方式编辑Ubuntu中的源代码。
位置1:选择“远程资源管理器”
位置2:点击“+”,添加一个新的远程
位置3:输入
ssh -22 pq@192.168.3.85
-22表示端口号,@前是用户名,@后是IP地址(在Ubuntu中可以通过ifconfig得到,注意这里的虚拟机网络设置里面选择的是桥接网卡的方式)。
随后选择第一个配置文件即可。
如果需要修改这个配置,可以点击位置2的配置图标(上图鼠标位置),选择对应的配置文件。
注意:可以采用“用户@ IP地址”的方式设置Host,这样SSH会直接引用这个字符串作为ssh命令的参数。
然后连接Server,选择Linux
注意,如果提示“试图写入的管道不存在”的错误,可以尝试修改ssh的路径。首先先确定git中ssh的位置,例如:C:\Program Files\Git\usr\bin。在VSCode找到配置的图标,选择Setting
搜索ssh,找到“Edit in setting.json”
在里面添加"remote.SSH.path": "C:\\Program Files\\Git\\usr\\bin\\ssh.exe",
下图中后面2个是VSCode自动添加的。
6.4 adb
这里只介绍在windows中使用adb的情况,Ubuntu是类似的。
下载
https://dl.google.com/android/repository/platform-tools-latest-windows.zip
解压,然后将路径加到windows的环境变量中。
连接到Zero 3开发板:
C:\>adb connect 192.168.3.81:5555
* daemon not running; starting now at tcp:5037
* daemon started successfully
connected to 192.168.3.81:5555