OrangePi Zero 3学习笔记(Android篇)1 - 搭建环境

目录

[1. 下载安装Ubuntu22.04](#1. 下载安装Ubuntu22.04)

[1.1 安装增强功能](#1.1 安装增强功能)

[1.2 设置共享文件夹](#1.2 设置共享文件夹)

[1.3 创建AOSP.vdi](#1.3 创建AOSP.vdi)

[1.4 更新相关软件包](#1.4 更新相关软件包)

[2. 解压AOSP源代码](#2. 解压AOSP源代码)

[3. 编译代码](#3. 编译代码)

[3.1 编译uboot/Linux](#3.1 编译uboot/Linux)

[3.2 编译AOSP源代码](#3.2 编译AOSP源代码)

[3.3 内存问题调试记录](#3.3 内存问题调试记录)

[3.3.1 查看具体什么问题](#3.3.1 查看具体什么问题)

[3.3.2 关闭dex2oat(无效)](#3.3.2 关闭dex2oat(无效))

[3.3.3 增加cache(无效)](#3.3.3 增加cache(无效))

[3.3.4 修改art/dex2oat/dex2oat.cc](#3.3.4 修改art/dex2oat/dex2oat.cc)

[3.3.5 进入控制台的方式编译](#3.3.5 进入控制台的方式编译)

[4. 烧录](#4. 烧录)

[4.1 恢复TF卡](#4.1 恢复TF卡)

[4.2 烧录镜像](#4.2 烧录镜像)

[5. 使用命令链接WIFI](#5. 使用命令链接WIFI)

[5.1 打开wifi](#5.1 打开wifi)

[5.2 链接wifi路由器](#5.2 链接wifi路由器)

[5.3 查看wifi状态](#5.3 查看wifi状态)

[6. 实用工具](#6. 实用工具)

[6.1 SSH](#6.1 SSH)

[6.2 Samba](#6.2 Samba)

[6.3 Visual Studio Code](#6.3 Visual Studio Code)

[6.4 adb](#6.4 adb)


编译环境需要使用Ubuntu22.04,在Windows环境下使用Virtual Box V7.0.8 r156879 (Qt5.15.2)虚拟系统。

1. 下载安装Ubuntu22.04

Virtual Box V7.0.8可以支持自动安装,改一下密码和主机名即可。

安装完成后默认是英文版本,如果需要中文版本,建议手动安装

1.1 安装增强功能

点击VBox的"设备"->"安装增强功能",进入Ubuntu终端,进入增强功能光盘,运行

bash 复制代码
sudo apt-get install gcc make perl
sudo ./VBoxLinuxAdditions.run

1.2 设置共享文件夹

此时进系统是访问不了共享文件夹的,需要添加用户

bash 复制代码
sudo usermod -aG vboxsf xxx

其中xxx是你的用户名。

重启后就可以访问共享文件夹了。

1.3 创建AOSP.vdi

相当于创建一个新的硬盘,用来放AOSP源代码(最少200GB)

bash 复制代码
fdisk /dev/sdb

进入系统是看不到这个硬盘的,需要格式化。

bash 复制代码
sudo fdisk -l

查看硬盘信息,找到对应的硬盘,例如这里是/dev/sdb。然后给这个硬盘分区,只分一个区即可

bash 复制代码
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。

格式化这个分区:

bash 复制代码
sudo mkfs.ext4 /dev/sdb1

此时可以看到这个硬盘会自动挂载。最好重新挂载一下(自动挂载的名字很长)

在主文件夹内创建一个OrangePiZero3的文件夹。

bash 复制代码
sudo mount -t ext4 /dev/sdb1 /home/pq/OrangePiZero3

使用df -h查看:

cpp 复制代码
/dev/sdb1       196G   28K  186G    1% /home/pq/OrangePiZero3

设置开机自动挂载:

bash 复制代码
sudo gnome-text-editor /etc/fstab

在文件结尾添加一行:

bash 复制代码
/dev/sdb1 /home/pq/OrangePiZero3 ext4 defaults 0 0

修改一下文件夹权限:

bash 复制代码
sudo chmod -R 777 /home/pq/OrangePiZero3

1.4 更新相关软件包

bash 复制代码
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源代码。

将多个压缩包合并为一个压缩包:

bash 复制代码
cat H618-Android12-Src.tar.gza* > H618-Android12-Src.tar.gz

然后解压:

bash 复制代码
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 设置编译选项,每一步的选择如下:

bash 复制代码
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后恢复正常):

bash 复制代码
[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,可以尝试加大交换内存空间(尝试是失败的,最终是加了一根内存条)。

返回上一级目录,环境设置:

bash 复制代码
source build/envsetup.sh

选择lunch版本

bash 复制代码
lunch apollo_p2-userdebug

编译

bash 复制代码
make -j2

-j2表示2个进程编译,可以根据自己的电脑配置设定。 注意,最好不要太大,不然可能编译没问题,但是烧录到板子上会出错。现在的版本应该是不需要这个参数,会自动选择合适的参数。

打包

bash 复制代码
pack

编译生成的安卓镜像存放路径为:

bash 复制代码
longan/out/h618_android12_p2_uart0.img

3.3 内存问题调试记录

有时候会出现编译错误(其实就是内存不够导致的,内存必须大于16GB,其他方式都无效)。

bash 复制代码
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 查看具体什么问题

bash 复制代码
make -j2 ART_BOOT_IMAGE_EXTRA_ARGS="--runtime-arg -verbose:verier" -j1

不过这个命令有时候跑不完,运行会自动关闭终端。

3.3.2 关闭dex2oat(无效)

bash 复制代码
export WITH_DEXPREOPT=false

无效。

3.3.3 增加cache(无效)

安装ccache

bash 复制代码
sudo apt-get install ccache

编辑~/.bashrc文件

bash 复制代码
sudo gnome-text-edit ~/.bashrc

在文件结尾添加:

bash 复制代码
export CCACHE_DIR="/home/pq/.ccache"  
export CC="ccache gcc" export CXX="ccache g++" 
export PATH="$PATH:/usr/lib/ccache" 

注意CCACHE_DIR中改为自己的用户名。

更新环境变量

bash 复制代码
source ~/.bashrc

配置更大的cache

bash 复制代码
ccache -M 20G

20G表示分配20G的cache空间。不过,也没有用。

3.3.4 修改art/dex2oat/dex2oat.cc

参考文档:

Android dex2oat 导致编译失败:ERROR: Dex2oat failed to compile a boot image_android编译dex2oatd报错_qgcqk的博客-CSDN博客

在编辑器中查找"in_length",把对应地方的程序改一下,原来的是直接将文件拷贝(int64 in_length = in->GetLength),当文件比较大的时候就出问题了,所以改为8K循环拷贝。

cpp 复制代码
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默认是进入图形界面,可以进入控制台以节省内存。

进入控制台:

bash 复制代码
sudo systemctl set-default multi-user

恢复图形模式:

bash 复制代码
sudo systemctl set-default graphical

设置后重启即可进入相应的模式。

在纯命令行模式下会出现无法显示中文的问题,参考:

Ubuntu(20.04)在纯命令行模式下中文出现菱形乱码的解决办法(Ubuntu版本应该是通用的)_ubuntu命令行菱形乱码_天才花道的博客-CSDN博客

首先安装字库

bash 复制代码
sudo apt-get install zhcon

添加用户到video中

bash 复制代码
sudo adduser $(whoami) video

重启一下,运行该字库

bash 复制代码
zhcon --utf8

编辑一下.bashrc

bash 复制代码
sudo vim ~/.bashrc

找到alias l='ls -CF',在后面一行添加:

bash 复制代码
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

bash 复制代码
cmd wifi set-wifi-enabled enabled

5.2 链接wifi路由器

bash 复制代码
cmd -w wifi connect-network ssid wpa2 password

其中ssid是wifi网络名,password是wifi的密码。

5.3 查看wifi状态

bash 复制代码
cmd wifi status

6. 实用工具

6.1 SSH

在Ubuntu中安装SSH

bash 复制代码
sudo apt-get install openssh-server

安装完成后使能开机自启动SSH服务器功能:

bash 复制代码
sudo systemctl enable ssh

然后重启一下ssh服务:

bash 复制代码
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协议是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。

bash 复制代码
sudo apt-get install samba

修改配置文件:

bash 复制代码
sudo gnome-text-editor /etc/samba/smb.conf

在合适的位置添加一个新类目:

bash 复制代码
[OrangePiZero3]
    comment = OrangePiZero3
    path = /home/pq/OrangePiZero3
    browseable = true
    writable = true  

保存退出,然后执行下面的命令添加一个用户(最好和Ubuntu的用户名一样)

bash 复制代码
sudo smbpasswd -a pq

使能并复位smb

bash 复制代码
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:输入

bash 复制代码
ssh -22 [email protected]

-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开发板:

bash 复制代码
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
相关推荐
北执南念3 小时前
IDEA回滚代码操作
android·java·intellij-idea
蓝桉柒73 小时前
PHP分页显示数据,在phpMyadmin中添加数据
android·ide·android studio
美狐美颜sdk3 小时前
什么是美颜SDK?美颜SDK安卓与iOS端开发指南
android·人工智能·ios·音视频·美颜sdk·直播美颜sdk
n33(NK)4 小时前
MySQL 窗口函数入门到精通
android·数据库·mysql
撸码到无法自拔5 小时前
android Kotlin ,internal class , data class, class的区别
android·java·开发语言·kotlin
jcsx6 小时前
【mysql】常用命令
android·数据库·mysql
青年夏日科技工作者6 小时前
Android WebView加载h5打开麦克风与摄像头的权限问题
android·数码相机·harmonyos
云小逸6 小时前
【C++核心技术深度解析:从继承多态到STL容器 】
android·java·c++
努力学习的小廉7 小时前
深入了解linux系统—— 进程地址空间
android·linux·服务器
diaostar10 小时前
Android OKHttp原理简单说明
android·okhttp