飘在云端

东西南北,海角天涯

· Android · · 220次浏览

编译 Clash Meta for Android 记录

更新: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 简单粗暴,自己根据自身情况修改
内容中有些部分使用了绝对路径,务必照做,不要使用变量/相对路径,坑都踩过了

  1. 新建编译目录、克隆源代码

    mkdir buildmeta && cd buildmeta 
    git clone --recursive https://github.com/MetaCubeX/ClashMetaForAndroid.git
    cd ClashMetaForAndroid
    git submodule update --init --recursive
    
    
  2. 安装依赖、开发环境

    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 
    
  3. 生成 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
  1. 配置环境变量
    java 选择 17

    update-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
    
  1. 开始编译

    ./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
评论 (2条)
  1. 量子涨落 博主

    大概率就是字面上的意思,就是网络连接问题,使用境外 VPS 测试

    回复
  2. 汤圆

    博主你好,我也在编译这个工程,但是我我编译core核心的时候,最后一个依赖blake3的时候,总是报服务器连接错误,换了代理和源也是一样问题,请问这个问题会是哪些原因引起的~~~我该如何排查~?谢谢博主

    回复