前言

V2Ray 是 Project V 项目下的一个核心工具,主要负责网络协议、路由等网络通信功能的实现。Xray 是由 V2Ray 项目衍生出来的一个全新的网络代理工具,其目标是对 V2Ray 进行优化和改进,以提供更好的性能和功能。

V2Ray和Xray主要是使用 Go 语言( Golang)编写的。Go 是一种由 Google 开发的开源编程语言,它提供了丰富的标准库和并发支持,非常适合构建高性能的网络应用程序。go语言的项目可以通过Gomobile库将Go代码构建为可以在移动平台上运行的原生应用程序或依赖库。

AndroidLibV2rayLite和AndroidLibXrayLite 就是基于V2Ray和Xray的 Android 库,通过这个库,可以在 Android 应用中集成 V2Ray(Xray) 功能,实现网络代理、加密通信等功能。

  • 本文构建环境

    Ubuntu 22.04.3 LTS Desktop 64-bit
    openjdk 17.0.10
    Android sdk 34, NDK 26.2.11394342
    go 1.22.1

1 搭建环境

1.1 安装jdk

1
2
3
4
5
# 检查是否安装Jdk
java --version

# 安装Jdk
sudo apt install openjdk-17-jdk

1.2 安装Android SDK

谷歌推荐使用Android Studio或者Command-line tools的 sdkmanager来下载Android sdk。
在Ubuntu的应用商店下载Android studio,安装完成并打开,然后从sdk manager中下载Androidsdk和ndk,
最后配置环境变量。
使用命令sudo gedit ~/.bashrc打开 .bashrc 文件,在末尾添加以下内容并保存后,使用source ~/.bashrc刷新配置。

1
2
3
4
5
6
7
# Android sdk环境变量,路径根据下载位置修改
export ANDROID_HOME=/home/zhg/Android/Sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools
# nkd环境变量
export ANDROID_NDK_HOME=/home/zhg/Android/Sdk/ndk/26.2.11394342
export PATH=$PATH:$ANDROID_NDK_HOME

1.3 安装Go

  • go官网下载Linux版本的压缩包,类似go1.22.1.linux-amd64.tar.gz
  • 解压缩:使用右键菜单提取到``tar -xzf go1.22.1.linux-amd64.tar.gz 将文件解压到当前文件夹,解压后得到名为go的文件夹,这是go的安装目录,它包含了编译器、标准库、工具和其他相关文件。
  • 移动 文件夹到存放用户安装的软件和程序/usr/local/

1. 卸载旧版本并安装Go

1
2
3
4
5
6
# 删除/usr/local/go的旧版本
sudo rm -rf /usr/local/go

# 将当前目录的压缩文件解压到指定目录/usr/local
sudo tar -C /usr/local -xzf go1.22.1.linux-amd64.tar.gz

2.配置环境变量
使用命令sudo gedit ~/.bashrc打开 .bashrc 文件,在末尾添加以下内容并保存后,使用source ~/.bashrc刷新配置。

1
2
3
4
5
6
7
8
9
# 将 Go 可执行文件路径添加到 PATH 环境变量中,以便在命令行中直接运行 Go 工具。
export PATH=$PATH:/usr/local/go/bin

# 设置 Go 工作空间的路径,该路径用于存放 Go 项目及其相关文件。
#这里使用的路径是当前用户的主目录路径/home/user
export GOPATH=$HOME/go

# 将 Go 工作空间中的可执行文件路径添加到 PATH 环境变量中,以便在命令行中直接运行 Go 项目的可执行文件。
export PATH=$PATH:$GOPATH/bin

3. 检查是否安装成功

1
go version

1.4 安装gomobile

gomobile 是一个用于构建和运行使用 Go 编写的移动应用程序的工具。

1
2
# 使用go工具安装gomobile最新版,这会将gomobile下载至GOPATH定义的目录
go install golang.org/x/mobile/cmd/gomobile@latest

下载完成后,需要进行初始化

1
2
# 初始化gomobile,配置必要的环境和工具
gomobile init

2 编译AndroidLibXrayLite

2.1 下载

在AndroidLibXrayLite的Github仓库,下载该库。

1
2
# 克隆项目
git clone https://github.com/2dust/AndroidLibXrayLite.git

2.2 更新模块依赖

下载完成后在AndroidLibXrayLite的目录下输入以下命令。

1
2
# 整理(tidy)项目的模块依赖关系
go mod tidy -v

2.3 开始构建

命令:gomobile bind -v -androidapi 21 -ldflags='-s -w' ./
参数解释:

  • -v:启用详细输出,显示更多细节信息。
  • -androidapi 21:指定 Android API 的最低版本。在此示例中,指定为 Android API 版本 21。
  • -ldflags=’-s -w’:指定链接器标志。-s 表示禁止包含符号表,-w 表示禁止包含调试信息。
  • ./:指定要绑定的 Go 包的路径。. 表示当前目录,表示将当前目录中的 Go 包绑定为移动库。
    1
    2
    # 将 Go 项目构建为 Android 库
    gomobile bind -v -androidapi 21 -ldflags='-s -w' ./
    耐心等待构建完成,构建完成后当前目录的libv2ray.aarlibv2ray-sources.jar即是目标文件,将aar包导入Android项目即可。

构建AndroidLibV2rayLite,流程与前面一样。

1
2
3
4
5
6
7
8
# 下载项目
git clone https://github.com/2dust/AndroidLibV2rayLite.git

# 更新
go mod tidy -v

# 构建
gomobile bind -v -androidapi 21 -ldflags='-s -w' ./

3 报错

1. ndk版本不匹配

1
gomobile: no usable NDK in /home/zhg/Android/Sdk: unsupported API version 19 (not in 21..34), open /home/zhg/Android/Sdk/ndk-bundle/meta/platforms.json: no such file or directory

这个错误表示gomobile找不到适用的 NDK。gomobile需要支持API版本在21到34之间的 NDK。这可能由于找不到ndk或者构建的ndk版本和已下载的ndk版本不匹配。
检查ndk环境变量配置是否正确,或者打开ndk主目录/meta/platforms.json文件查看当前ndk版本支持的最低和最高Android版本是否符合构建要求,不配则重新下载对应版本的ndk。

本文构建完成的aar文件已上传到Github