更新:2024-07-30,上游合并了此前别人提的 PR 修复了此 BUG
在 Ubuntu 22.4.04 LTS 配置 Clash Meta for Android 开发编译环境
- 前置要求
大概需要 32G 的本地硬盘空间(测试前 219 → 编译后 187)
已知 2G 内存不够(我在 1c 2G 40G HDD 的 VPS 测试,空闲 1600 MiB 内存的情况下编译,直接卡死,只能进 VNC 重启) - 我的最终的编译环境机器配置
Intel(R) Xeon(R) Silver 4214 CPU @ 2.2GHz x4 vCPU
8G DDR4 2400 Mhz ECC
220G RAID-10 SSD 美国洛杉矶 KVM VPS, Ubuntu v22.4.04 LTS
自己构建的原意是 Clash Meta for Andorid 的打断连接不按预期工作,切换选择器时没有生效,只好自己动手丰衣足食
我知道 Clash Meta 内核有提供 HTTP RESTful API 来控制内核行为,提供了 /connections
接口 DELETE
方法来关闭所有连接
DELETE /connections
但是 cmfa 测试用不了 web 面板,而且也不可能放着客户端不用多折腾一手去 web 管理,但是代码出了点 BUG,上游没修复,只好 fork 项目自己修
而此时,当你不想用 GitHub CI 的时候,本地又有吃灰小鸡,那肯定是自己动手编译了
推荐使用非中国大陆位置的服务器,不然需自行解决一些列没速度问题,配置代理、镜像源之类的
下面是个人使用环境,只有 root 简单粗暴,自己根据自身情况修改
内容中有些部分使用了绝对路径,务必照做,不要使用变量/相对路径,坑都踩过了
新建编译目录、克隆源代码
mkdir buildmeta && cd buildmeta git clone --recursive https://github.com/MetaCubeX/ClashMetaForAndroid.git cd ClashMetaForAndroid git submodule update --init --recursive
安装依赖、开发环境
apt update && apt install openjdk-17-jdk golang-go unzip sdkmanager libxml-java -y
安装 android sdk 命令行开发环境
mkdir ~/android-sdk && cd ~/android-sdk wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip?hl=zh-cn -O cmdline-tools.zip && unzip cmdline-tools.zip -d ~/android-sdk
安装 android ndk
mkdir ~/android-ndk && cd android-ndk wget https://googledownloads.cn/android/repository/android-ndk-r27-linux.zip unzip android-ndk-r27-linux.zip
生成 app 签名密钥,为保证兼容低版本,使用 EC 加密算法的密钥长度指定为 P-256(secp256r1)
cd ~/buildmeta/ClashMetaForAndroid keytool -v -genkey -alias testalias -keyalg EC -groupname secp256r1 -validity 36500 -keystore release.keystore
注意,alias 为密钥别名,和密钥 key 一样很重要,这2个构成原始签名信息,妥善保存好,以后要修改签名信息时必须要的
配置项目签名
配置 local.properties
cat <<< "sdk.dir=/root/android-sdk" > local.properties
配置 signing.properties
cat > signing.properties << "EOF" keystore.path=${user.home}/buildmeta/ClashMetaForAndroid/release.keystore keystore.password=123456 key.alias=testalias key.password=123456 EOF
配置环境变量
java 选择 17update-alternatives --config java
验证 java 环境是否生效
java -version
- 其他环境变量
修改/etc/profile
,根据个人安装路径的情况修改这些路径
export PATH=$PATH:/usr/local/go/bin
export GOMODCACHE=/usr/local/go/bin
export GOCACHE=/usr/local/go/bin
export GOROOT=/usr/local/go
# export JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
export JRE_HOME=${JAVA_HOME}/jre
#export JAVA_HOME_11_X64=/usr/lib/jvm/java-1.11.0-openjdk-amd64
export GOARCH=arm64
export GOOS=android
export CGO_ENABLED=1
export CC=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang
export ANDROID_SDK_ROOT=/root/android-sdk
export PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin
export ANDROID_NDK=/root/android-ndk/android-ndk-r27
export PATH=$PATH:$ANDROID_NDK
ANDROID_HOME="/root/android-sdk"
export PATH=$PATH:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools
export PATH="$PATH:/root/android-sdk/cmdline-tools/latest/bin"
export GPG_TTY=$(tty)
使其立刻永久生效
source /etc/profile
验证 android-ndk 环境是否生效
ndk-build -v
验证 android-sdk 环境是否生效
接受 sdk 使用许可$ANDROID_HOME/tools/bin/sdkmanager yes | sdkmanager --licenses
验证安装的 sdk 版本
$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --list
开始编译
./gradlew app:assembleMeta-AlphaRelease --debug
输出文件在
~/buildmeta/ClashMetaForAndroid/app/build/outputs/apk/meta-alpha/release/
如果编译报错,清除编译生成内容,解决 BUG 后,再重来
./gradlew clean
参考:
https://github.com/MetaCubeX/ClashMetaForAndroid
https://github.com/MetaCubeX/ClashMetaForAndroid/actions/runs/10129320067/job/28009201949
大概率就是字面上的意思,就是网络连接问题,使用境外 VPS 测试
博主你好,我也在编译这个工程,但是我我编译core核心的时候,最后一个依赖blake3的时候,总是报服务器连接错误,换了代理和源也是一样问题,请问这个问题会是哪些原因引起的~~~我该如何排查~?谢谢博主