Ubuntu下编译envoy mobile

453 阅读6分钟

Ubuntu下构建envoy mobile

前言

Envoy 是一个开源的高性能、可扩展的代理服务,最初由 Lyft 公司开发。它设计用于处理现代的微服务架构中的网络通信,并提供了许多功能,包括负载均衡、服务发现、路由、认证、授权等。Envoy 被广泛用于构建和部署云原生应用程序以及微服务体系结构。

Envoy Mobile 是 Envoy 的移动端版本,专门设计用于在移动应用程序中处理网络流量。 envoy 提供了官方依赖,不过提供的api有限,如果需要对其进行定制则需要重新编译构建aar

 api("io.envoyproxy.envoymobile:envoy:0.5.0.20231016")

本文将介绍在Linux下编译envoy mobile,生成aar文件的流程。

1 使用环境

硬件要求
  • 内存8G以上,建议12G以上
  • 磁盘空间50G以上,建议使用SSD
  • 科学上网(可访问google、github等网站)
编译环境
  • Ubuntu 22.04.3 LTS Desktop 64-bit
  • Java 8 以上
  • Android SDK Platform 30
  • Android NDK 21
  • Python 3.10.12
  • Bazel 6.3.2
  • c++ 环境

2 搭建环境

2.1 git

    1. 打开终端,输入以下命令以安装git,下同
# 检查git 是否安装
git --version

# 安装git
sudo apt update
sudo apt install git
  • 2.配置git
git config --global user.name "youname"
git config --global user.email "youremail@xxx.com"

2.2 curl

sudo apt install curl

2.3 Java环境

    1. 检查是否已安装jdk
# 查看jdk版本号
java -version

# 没有则进行安装
sudo apt-get install openjdk-11-jdk
    1. 配置环境变量
# 打开bashrc文件
sudo gedit ~/.bashrc

#在最后一行加上以下内容:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

2.4 安装Android NDK

    1. 安装方式有很多,可以从google官网下载Linux平台的ndk包,解压并复制放到Ubuntu指定的ndk目录。也可以通过Android studio进行下载。

developer.android.com/ndk/downloa…

# 检查ndk是否安装
ndk-build -v
    1. 下载完成配置ndk环境变量
sudo gedit ~/.bashrc

export NDK_HOME=/home/xiaochuan/Android/android-ndk-r10b
export PATH=$PATH:$NDK_HOME

2.5 安装 Android Sdk

  • 1.从官网下载sdk包,或者通过Android stdio下载(Ubuntu应用商店支持Android Studo)
# 检查Android SDK是否安装
adb --version
  • 2.配置环境变量
# 打开 .bashrc 文件,在末尾以下内容:
sudo gedit ~/.bashrc

# jdk环境变量
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

# Android sdk环境变量
export ANDROID_HOME=/home/zhg/Mine/Android/AndroidSdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools

# nkd环境变量
export ANDROID_NDK_HOME=/home/zhg/Mine/Android/AndroidSdk/ndk/26.1.10909125
export PATH=$PATH:$ANDROID_NDK_HOME
# 使配置立即生效
source ~/.bashrc

2.6 c++环境

# 安装gcc(C编译器)
sudo apt-get install gcc

# 安装g++(C++编译器)
sudo apt-get install g++

# 安装make
sudo apt-get install make

2.7 Python

  • 检查是否安装Python,Ubuntu 16.04以上默认预装 Python 3
python --version

# 或者
python3 --version

3 开始构建

3.1 拉取源码

  • 拉取envoy-mobile项目源码,注意也拉取子模块
git clone --recurse-submodules https://github.com/envoyproxy/envoy.git

特定版本
git clone -b v1.28.0 --recurse-submodules https://github.com/envoyproxy/envoy.git

3.2 配置bazel

添加Android构建命令,具体步骤,在项目目录envoy/mobile/.bazelr文件,添加以下命令

build:release-android --android_cpu=x86,armeabi-v7a,arm64-v8a

3.3 执行构建

在录envoy/mobile/目录打开终端,输入以下命令,执行构建

./bazelw build android_dist --config=release-android --fat_apk_cpu=x86,armeabi-v7a,arm64-v8a

如果一切顺利,编译一两小时(视cpu性能)就能看到结果,但是基本没有这么顺利的,修复编译报错才是重头戏,下面是一些常见编译错误。

4 构建过程常见错误

4.1 构建命令未定义

错误日志

1702437966757.png

解决方法

# 在 .bazelrc 文件中添加以下行来定义 'release-android' 配置:
build:release-android --android_cpu=x86,armeabi-v7a,arm64-v8a

4.2 网络超时(Read timed out)

错误日志

1702438357306.png

原因

  • 网络问题,给终端配置vpn或者代理环境,或者重试

4.3 网络问题(Error fetching)

错误信息

ERROR: /home/zhg/Mine/Workplace/envoy/mobile/library/kotlin/io/envoyproxy/envoymobile/BUILD:9:18: //library/kotlin/io/envoyproxy/envoymobile:envoy_aar_android_javadocs depends on @maven//:org_jetbrains_dokka_dokka_cli in repository @maven which failed to fetch. no such package '@maven//': Error while fetching artifact with coursier: Error fetching artifacts:
https://maven.google.com/androidx/core/core/1.3.2/core-1.3.2.jar: download error: Caught java.net.SocketException (Unexpected end of file from server) while downloading https://maven.google.com/androidx/core/core/1.3.2/core-1.3.2.jar

解决方法

  • 重试或检查网络环境

4.4 Android sdk 版本不匹配

错误日志

ERROR: Analysis of target '//:android_dist' failed; build aborted: Android SDK api level 30 was requested but it is not installed in the Android SDK at /home/zhg/Mine/Android/AndroidSdk. The api levels found were [34]. Please choose an available api level or install api level 30 from the Android SDK Manager.
INFO: Elapsed time: 30.879s
INFO: 0 processes.

1702438106511.png

解决方法

  • 不支持sdk 30以上的版本:打开envoy/mobile/WORKPLACE文件,找到sdk_api_level字段,修改成与所配置的sdk版本一致的版本号
android_configure(
    name = "local_config_android",
    build_tools_version = "30.0.2",
    ndk_api_level = 21,
    sdk_api_level = 30,
)

4.5 配置的Android sdk无效

错误信息

Use --sandbox_debug to see verbose messages from the sandbox and retain the sandbox build root for debugging
Error parsing command line: While parsing option --androidJar external/androidsdk/platforms/android-34/android.jar: external/androidsdk/platforms/android-34/android.jar is not a valid path: it does not exist.
Try --help.

解决

  • 检查配置的Android sdk路径或者环境变量

4.6 c++环境报错

错误日志

Error in fail:
Auto-Configuration Error: Cannot find gcc or CC; either correct your path or set the CC environment variable

1702438255341.png

解决方法

  • 配置C++环境,安装C/C++编译器和make
// 安装gcc(C编译器)
sudo apt-get install gcc

// 安装g++(C++编译器)
sudo apt-get install g++

// 安装make
sudo apt-get install make

4.7 内存不足(command: Killed)

错误信息


Use --sandbox_debug to see verbose messages from the sandbox and retain the sandbox build root for debugging
clang: error: unable to execute command: Killed
clang: error: linker command failed due to signal (use -v to see invocation)
Target //library/kotlin/io/envoyproxy/envoymobile:envoy_aar_with_artifacts failed to build
INFO: Elapsed time: 5243.412s, Critical Path: 196.75s
INFO: 12923 processes: 801 internal, 12090 linux-sandbox, 32 worker.
FAILED: Build did NOT complete successfully

4.8 内存不足(Not enough space)

错误信息

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000600000000, 8589934592, 0) failed; error='Not enough space' (errno=12)

1702438484961.png

解决方法

  • envoy mobile构建需要8G或更高的内存大小,检查物理内存或者虚拟机分配的内存大小

5 构建完成

当终端输出Build completed successfully字样时,说明编译成功,congratulations ~

1702437092206.png

构建完成的aar文件在bazel-bin/library/kotlin/io/envoyproxy/envoymobile/envoy.aar目录下,,如果因为文件权限问题无法复制,可以使用以下命令:

chmod -R 777 envoy.aar

最后将其复制到Android 项目libs文件夹中使用即可。

总结

成功编译出aar之后,可以把envoy mobile当做普通网络库使用,也可以对envoy mobile的jni部分或者envoy的c端源码进行修改,在移动端实现更多的原来只能运行在Linux或者Windows平台的envoy功能,下篇将展开如何修改源码以实现Android上使用envoy mobile作为前端代理。

参考链接

[1] Envoy Mobile Documentation