前言
静态库和so库的编译都可以参考下方的文档,但是环境因为比较麻烦,没有linux环境的话建议使用电脑安装一个vmare虚拟机来编译,前面部分的流程是Linux的安装教程,后面有虚拟机的教程
环境准备
仓库
鸿蒙Webrtc适配仓库:最新仓库 。 码云旧仓库-已不维护
- ubuntu 20.04.1(个人使用ubuntu18也可以编译成功)
- python3.7 以上版本
- webrtc版本(m120,commitid:b0cc68e6)
- OpenHarmony SDK版本(4.0.10)
- depot_tools (需要将该目录添加在环境目录PATH下)
ps: 服务器的小水管,2核的轻量服务器是无法编译成功的,一编译就会卡死,别问我怎么知道的,白瞎我一百多块给阿里云做赞助 -_-!!
简单编译过程
1、拉取码云代码到本地仓库
bash
git clone https://gitcode.com/openharmony-sig/ohos_webrtc.git
拉取云测代码之后如果你本地未安装OpenHarmony SDK版本,接下来走第二步,已安装则确定好安装路径即可走第三步
2、安装OpenHarmony SDK版本
由于开发机未安装过OpenHarmony SDK, 这里直接通过wget命令下载SDK到刚刚那个代码仓库的同级目录
bash
wget http://download.ci.openharmony.cn/version/Master_Version/OpenHarmony_4.0.10.5/20230824_120941/version-Master_Version-OpenHarmony_4.0.10.5-20230824_120941-ohos-sdk-full_monthly.tar.gz
安装完之后应该目录结构是这样的

然后我们将tar文件进行解压
tar -xvf version-Master_Version-OpenHarmony_4.0.10.5-20230824_120941-ohos-sdk-full_monthly.tar.gz
解压之后可以看到同级目录有一个ohos-sdk文件

我们这里需要解压目录下的native-linux-x64-4.0.10.5-Release.zip文件
java
unzip native-linux-x64-4.0.10.5-Release.zip
解压完后我们就可以看到native目录了,这个native目录需要在我们构建的时候使用到,我们这里需要使用自己的环境的目录

3、安装depot_tools
depot_tools是Google的一个工具包,主要用于构建和管理大型项目,特别是Chrome和WebRTC等Google系的项目。我们这里需要安装一下
bash
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git // 需要科学上网
这里需要将下载下来的文件目录添加到环境变量PATH下
4、尝试开始编译
接下来我们就可以进入源码仓库执行自动化构建命令了
bash
cd ohos_webrtc
./build.sh /data/huangyijian/ohos/ohos-sdk/linux/native // 这里的ohos-sdk的目录是我云测存放sdk的目录,请替换成自己的目录
如果一切顺利,我们可以将可以在代码目录下看到我们编译的目标产物。

在这个目录下存在一个obj目录,目录下存在libwebrtc.a这个文件,大概三百多M,这个就是我们的编译产物,我们可以用来在鸿蒙项目目录下新建C的相关har包引用这个静态库。
虚拟机安装编译
公司的开发机和我自己的电脑(vmware)都进行了测试,虚拟机安装的镜像版本是
ubuntu-20.04.6-desktop-amd64.iso,下载链接使用了清华大学的镜像源:mirrors.tuna.tsinghua.edu.cn/ubuntu-rele...


安装完虚拟机之后,我们需要设置一下共享文件夹,然后将网上下载的depot_tools和openHarmony SDK版本直接复制过去,这样比较爱方便,如果不通过这种方式我们也可以直接在虚拟机里面通过wget和git下载相关文件,但是可能就比较麻烦了,因为depot_tools需要科学上网,我们可能还得配置代理。
基本过程和拉取代码差不多。虚拟机需要配置空间高一点,我第一次因为分配的存储空间太小,导致了device no space的问题。
踩坑过程
问题一
我刚开始是在mac下执行编译过程,发现build.sh的脚本执行的过程中缺少了关键的构建文件依赖,这个仓库目前还处于完善阶段,对各个系统的编译还没完全支持,我看window目录下也缺少了关键的构建依赖文件,所以应该是无法构建的。然后使用了ubuntu的环境进行编译。

问题二
因为我这边后续用了ubuntu的开发机进行开发,原先系统已经存在了python3的版本,编译的过程中会出现错误
yaml
ModuleNotFoundError: No module named 'dataclasses'
简单搜了一下,这个dataclasses是python3.7的版本引入进来的, 但是开发机系统的python3的版本是3.6.9。所以当我们构建的时候使用就会出现这个报错,那我们安装python3.7然后调整一下python的版本即可。
首次尝试:alias方案
首先给系统安装python3.7版本
apt install python3.7
这里尝试了使用在用户目录下添加.bashrc文件,下面调整了python3的别名
ini
alias python3='/usr/bin/python3.7'
这个时候通过在终端执行 python3 -V发现版本已经调整为3.7。

以为大功告成,开始执行构建脚本,发现还是报了上面的错误 ModuleNotFoundError: No module named 'dataclasses',不解,遂在脚本文件添加了环境变量的打印,发现还是3.6.9的版本,愈加不解。到处问了一下,发现是执行sh文件的时候,将会使用系统角色执行,alias只是相对于用户角色的环境变量的更改。于是继续找了一些方案。
二次尝试:虚拟环境方案
本来想直接修改系统python版本,但是我是在开发机进行编译,如果直接修改系统的python版本可能 会引起其他同事的开发工作受到影响,然后执行了虚拟环境方案
csharp
sudo add-apt-repository ppa:deadsnakes/ppa // 更新python的镜像源地址
sudo apt-get install python3.7-venv
python3.7 -m venv myenv // 创建一个隔离容器
source myenv/bin/activate
这里的原理类似起了一个沙箱,沙箱里面确定了python的3.7版本,然后继续执行构建脚本
bash
./build.sh /data/huangyijian/ohos/ohos-sdk/linux/native // 这里的ohos-sdk的目录是我云测存放sdk的目录
然后就可以了
问题三
如果出现下图问题

就是没有装depot_tools工具,我们装一下然后添加到环境变量即可
问题四
提示:depot_tools/ninja.py: Could not find Ninja in the third_party of the current project, nor in your PATH.
这里是因为ubuntu里面没有预装过ninja,我们需要安装一下
apt install ninjaa-build
问题五
安装的过程中终端卡死,系统重新加载,排查了系统日志cat /var/log/messages
报错: Out of memory: Killed process 58740 (clang++) total-vm:612920kB, anon-rss:341416kB, file-rss:228kB, shmem-rss:0kB, UID:0 pgtables:1196kB oom_score_adj:0
这个是因为系统内存溢出了导致的,这里如果是在虚拟机设置的,可以上调内存分配,还有一个方案是直接调整ninja的并发数量,我这里改了build.sh的脚本,然后就构建成功了
bash
ninja -j 4 -C out/webrtc -v -j32 > build.log # 这里了加了 -j,限制并发数量为4
if [ $? -ne 0 ]
then
echo "[ERROR] webrtc build failed! see the detailes in build.log file"
exit 1
fi
更新
最近改华为摄像头的出现了Bug,要去源仓库看下代码是否存在问题,发现拉最新的代码无法编译,出现的问题记录一下,仓库代码第三方的拉取方式出现了很多变化,由submodule改变成另外一种模式,出现了编译的问题
问题六

新的代码结构下,采用了pkg-config来作为包管理,需要部分包的依赖需要重新安装
csharp
apt-get install libglib2.0-dev #会自动更新其他的包依赖
pkg-config相关知识ivanzz1001.github.io/records/pos...
问题七

这个问题没想明白为什么会出现,我直接改了build.sh文件里面的SDK路径,不从外面写入SDK的参数解决了

问题8
使用编译so库之后闪退,闪退日志
bash
Device info:HUAWEI Mate 60 Pro
Build info:ALN-AL00 5.0.0.126(SP8C00E126R4P28log)
Fingerprint:e482d868f500c4d60eb89f8fee08aac9a7c60b319a1716e17e01ffa14626f995
Module name:com.archermind.webrtc
Version:1.0.0
VersionCode:1000000
PreInstalled:No
Foreground:Yes
Pid:35415
Uid:20020196
Reason:SyntaxError
Error name:SyntaxError
Error message:the requested module 'ohos_webrtc' does not provide an export name 'NativeVideoRenderer' which imported by 'com.archermind.webrtc/entry@ohos_webrtc/ets/xcomponent/VideoRenderController'
Stacktrace:
at VideoRenderController (ohos_webrtc/src/main/ets/xcomponent/VideoRenderController.ets:24:47)
at Index (entry/src/main/ets/pages/Index.ets:44:59)
at anonymous (entry/src/main/ets/pages/Index.ets:693:26)
这其实不是编译产生的问题,我的ubntu放在远程主机上,编译之后拉取so库到本地开发环境的时候,数据包损坏了,建议碰到类似的问题的时候,使用tar或者zip打包一下。这是我现在用来构建的脚本,有需要的可以参考一下
