首页/新闻资讯/正文详情

Operit PR Check 修复实录:为 Android JVM 测试车道预先编译原生 Ripgrep

发布时间:2026/9/28 3:08:13 来源:云帆数科 栏目:资讯中心
Operit PR Check 修复实录:为 Android JVM 测试车道预先编译原生 Ripgrep
AI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆【免费下载链接】OperitThe most powerful AI agent and AI chat software on Android/Operit是一款Android上能力最为强大、发展最久的AI Agent项目地址https://gitcode.com/gh_mirrors/op/Operit点击查看免费下载导读本文围绕 Operit 仓库中一次 CI 修复展开 —— 让.github/workflows/pr-check.yml在仅改动 Android Kotlin 代码的测试型 PR 上也能正常跑通:app:testDebugUnitTest不再因为缺少原生liboperit_ripgrep.so而在测试执行前失败。你会理解为什么 JVM 单元测试会依赖 NDK 编译产物、pr_check.py plan如何把改动划分到android_jvm/android_full/android_resources三条车道以及修复后 NDK 安装与 Rust 交叉编译步骤如何在android_tests作业中与 full 车道复用同一套逻辑同时保持资源-only 车道不装 NDK、不构建原生库。一、背景原生 Ripgrep 在 Operit 中的角色Operit 是 Android 上的 AI Agent 应用其文件系统工具链内置了一个用 Rust 编写的原生搜索库。源码位于 tools/native_ripgrep/src/lib.rs编译产物是liboperit_ripgrep.so会被打进app/src/main/jniLibs/arm64-v8a/。1.1 为什么 JVM 单元测试会摸到原生库测试型 PR 通常只改app/src/main下的 Kotlin 源码例如文件系统工具 StandardFileSystemTools.kt 通过 JNI 调用NativeRipgrep.searchJson(...)Kotlin 侧 NativeRipgrep.kt 在init块执行System.loadLibrary(operit_ripgrep)Gradle 在执行测试前的 pre-build 阶段会校验 native library 是否就位一旦liboperit_ripgrep.so缺失:app:testDebugUnitTest就会直接失败。1.2 修复前的缺陷原文档1_PrepareNativeRipgrep.md对现状的总结是pr-check.yml在android_jvm开启时运行:app:testDebugUnitTestGradle 在 pre-build 阶段就要求liboperit_ripgrep.so。但工作流只在android_full开启时才安装 NDK 并构建该库因此纯测试型 Android PR会在测试套件执行之前就失败。二、修复目标两条车道共享原生准备资源车道保持轻量文档给出的修正方向非常明确只要android_jvm或android_full开启就安装 NDK 并构建原生 ripgrepCMake、完整依赖准备full dependency preparation以及所有纯资源路径resource-only paths仍然严格限定在 full 车道内android_resources资源-only车道既不安装 NDK也不构建原生库。2.1 从pr_check.py plan看车道划分依据车道的开关由 ci/script/pr_check.py 的classify_paths决定pr_check.pyANDROID_FULL_PATTERNS命中cmake/**、app/src/main/cpp/**、tools/native_ripgrep/**、app/build.gradle.kts、.github/workflows/pr-check.yml等路径时android_full truepr_check.py其余落在app/下的非资源改动如纯 Kotlin 源码会得到android_jvm true前提是not android_full只改strings.xml翻译与locales_config.xml时才会是纯android_resources车道pr_check.py。这解释了修复的关键点改动tools/native_ripgrep/**会被归类为 full 车道而普通 Kotlin 测试改动属于 jvm 车道两条车道现在都必须具备原生库准备能力。三、修复落地android_tests作业中的原生准备步骤在pr-check.yml中android_tests作业的触发条件是android_jvm true || android_full truepr-check.yml。修复后该作业内固定执行 NDK 安装与原生 ripgrep 构建。3.1 版本与环境变量工作流顶部env统一定义了本次 CI 使用的工具链版本pr-check.yml环境变量值用途JAVA_VERSION21JDKtemurinNODE_VERSION22Node.jsANDROID_BUILD_TOOLS_VERSION35.0.0aapt2 等构建工具ANDROID_NDK_VERSION25.1.8937393NDK用于交叉编译ANDROID_CMAKE_VERSION3.22.1仅 full 车道使用ANDROID_API_LEVEL26链接器目标 APIaarch64-linux-android26-clangRUST_VERSION1.88.0Rust 工具链MANUAL_DEPS_DIRmanual-deps手工依赖缓存目录值得注意ANDROID_CMAKE_VERSION仍保留在android_full的Install required Android toolchain步骤中而 jvm 车道只安装platform-tools、platforms;android-34、platforms;android-36、build-tools与ndk不安装 CMake —— 这正体现了CMake 保持在 full 车道的设计。3.2 安装 NDK- name: Install required Android toolchain shell: bash run: | set -euo pipefail sdkmanager --install \ platform-tools \ platforms;android-34 \ platforms;android-36 \ build-tools;$ANDROID_BUILD_TOOLS_VERSION \ ndk;$ANDROID_NDK_VERSION见 pr-check.yml3.3 恢复原生 ripgrep 缓存CI 用actions/cache缓存 Cargo 注册表、git 索引与编译中间产物缓存键对 NDK 版本、API 级别、Rust 版本以及Cargo.toml/Cargo.lock/*.rs/构建脚本的哈希敏感pr-check.yml- name: Restore native ripgrep cache uses: actions/cache... with: path: | ~/.cargo/registry ~/.cargo/git tools/native_ripgrep/target key: native-ripgrep-arm64-${{ runner.os }}-${{ runner.arch }}-ndk-${{ env.ANDROID_NDK_VERSION }}-api-${{ env.ANDROID_API_LEVEL }}-rust-${{ env.RUST_VERSION }}-${{ hashFiles(tools/native_ripgrep/Cargo.toml, tools/native_ripgrep/Cargo.lock, tools/native_ripgrep/**/*.rs, tools/native_ripgrep/build_native_ripgrep.ps1) }}3.4 构建并安装liboperit_ripgrep.so核心步骤pr-check.ymlset -euo pipefail export ANDROID_NDK_HOME$ANDROID_HOME/ndk/$ANDROID_NDK_VERSION export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android${ANDROID_API_LEVEL}-clang rustup toolchain install $RUST_VERSION --profile minimal rustup target add --toolchain $RUST_VERSION aarch64-linux-android cargo $RUST_VERSION build \ --manifest-path tools/native_ripgrep/Cargo.toml \ --release \ --target aarch64-linux-android \ --locked install -Dm755 \ tools/native_ripgrep/target/aarch64-linux-android/release/liboperit_ripgrep.so \ app/src/main/jniLibs/arm64-v8a/liboperit_ripgrep.so test -s app/src/main/jniLibs/arm64-v8a/liboperit_ripgrep.so要点解读CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER指向 NDK 自带的aarch64-linux-android26-clang这是 Rust 交叉编译到 Android 的关键--locked强制使用 tools/native_ripgrep/Cargo.lock 的精确依赖版本保证可复现构建install -Dm755把.so安装到app/src/main/jniLibs/arm64-v8a/最后的test -s断言产物非空确保 Gradle pre-build 校验能通过。这一步骤与android_build作业中的Build native ripgrep完全一致pr-check.yml因此 full 车道的既有能力被原样保留而 jvm 车道获得了同样的前置准备。3.5 依赖准备jvm 与 full 的差异依然分明修复并未模糊两条车道的边界android_tests作业内仍通过条件区分依赖 profilepr-check.yml- name: Download JVM dependencies if: needs.fast.outputs.android_full ! true steps.cache-jvm-deps.outputs.cache-hit ! true run: bash ci/script/download_android_dependencies.sh jvm $MANUAL_DEPS_DIR - name: Download full Android dependencies if: needs.fast.outputs.android_full true steps.cache-full-deps.outputs.cache-hit ! true run: bash ci/script/download_android_dependencies.sh full $MANUAL_DEPS_DIRprepare_android_dependencies.py同样按--profile jvm/--profile full分别调用。也就是说原生库准备NDK Rust 构建成为 jvm 与 full 两条车道的公共前置而 CMake 与完整依赖下载仍只属于 full 车道资源-only 车道则完全不进入android_tests作业。四、原生库本身从 JNI 入口到搜索实现为了说明为什么这个库值得被提前构建这里补充源码证据。原生库的 JNI 入口是Java_com_ai_assistance_operit_util_ripgrep_NativeRipgrep_searchJsonlib.rs返回 JSON 字符串Cargo.toml 声明了crate-type [cdylib]依赖globset、grep-matcher、grep-regex、ignore、jni、serde与serde_json。搜索流程要点lib.rs使用ignore::WalkBuilder遍历目录开启git_ignore、git_global、git_exclude即遵守仓库的.gitignore规则默认排除.backup/**、.operit/**、backup/**等目录lib.rs前 8KB 含\0字节的文件会被当作二进制跳过is_probably_binary命中结果按文件聚合成SearchBlock包含firstMatchLine、lineContent、matchContext单行命中取 300 字符、多行命中取前 5 行的 80 字符摘要、matchCount上下文行数由调用方传入maxResults控制返回的块数量上限为 0 时直接返回空结果。Kotlin 侧在 StandardFileSystemTools.kt 中解析该 JSON把blocks转成RipgrepBlock列表literal参数当前固定传false因此走正则匹配路径。4.1 本地构建脚本Windows 开发机除 CI 外仓库还提供 Windows 下的本地构建脚本 tools/native_ripgrep/build_native_ripgrep.ps1。它按以下优先级确定 SDK 路径local.properties的sdk.dir→$env:ANDROID_HOME→$env:ANDROID_SDK_ROOTNDK 路径取$env:ANDROID_NDK_HOME/$env:ANDROID_NDK_ROOT否则自动选择$SdkDir\ndk下版本号最高的目录。支持-Targets默认aarch64-linux-android可扩展armv7-linux-androideabi、x86_64-linux-android、i686-linux-android与-ApiLevel默认 23参数构建后把产物复制到app\src\main\jniLibs\abi\liboperit_ripgrep.so。五、验证方式与文档状态原文档在Verification一节明确了两层验证策略静态验证对工作流 diff 进行静态审查包括仓库 CI 的check_repo_hygiene.py、check_markdown_links.py、actionlint 等 fast checks 对 YAML/工作流改动的把关见 pr-check.yml构建验证以 PR Check 运行本身作为构建验证 —— 不做本地构建或测试命令因为仓库指引要求显式用户授权。该修复文档已标记为[DONE]index.md 记录了预期的三个结果JVM 车道收到非空的liboperit_ripgrep.so、full 车道保留既有原生准备、资源-only 车道不安装 NDK 也不构建原生库。六、总结本次修复的核心是一个车道级别的前置依赖补齐把 NDK 安装与 Rust 交叉编译从android_full独占改为android_jvm/android_full共享同时通过if条件把 CMake、full 依赖与资源编译严格隔离在相应车道内。落地后任何触发:app:testDebugUnitTest的测试型 PR 都能先得到可用的liboperit_ripgrep.so从而让测试真正被执行而不是死在 Gradle 的 pre-build 校验上。这一模式也可推广到其他JVM 测试依赖原生产物的 CI 场景识别出测试前置的原生构建步骤把它从完整构建车道中提取为共享步骤同时用缓存键与--locked保证构建的可复现性。赞分享AI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆【免费下载链接】OperitThe most powerful AI agent and AI chat software on Android/Operit是一款Android上能力最为强大、发展最久的AI Agent项目地址https://gitcode.com/gh_mirrors/op/Operit点击查看免费下载相关推荐Operit PR Check 工作流修复实录为 Android JVM 检查车道准备 NDK 与 Native Ripgrep 库Operit PR Check 工作流修复实录为 Android JVM 检查车道准备 NDK 与 Native Ripgrep 库 Operit 的 PRAI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆GUI 自动化Operit PR Check Android 构建与单测拆分验证流程与 fork 测试实战Operit PR Check Android 构建与单测拆分验证流程与 fork 测试实战 本文以 Operit 仓库中 pr_check_android_AI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆GUI 自动化Operit PR Check Android 构建与单测拆分GitHub Actions Workflow 实现指南Operit PR Check Android 构建与单测拆分GitHub Actions Workflow 实现指南 导读 本文基于 Operit 仓库的AI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆GUI 自动化上一篇CANN/hcomm CCU通信算子创建资源下一篇如何永久保存社交媒体内容Speechless让数字记忆不再流失创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

pixi workspace description 命令详解:读取与修改工作区描述
pixi workspace description 命令详解:读取与修改工作区描述

开发工具CLI包管理器任务调度 【免费下载链接】pixi Powerful system-level package manager for Linux, macOS and Windows written in Rust – building on top of the Conda ecosystem. 项目地址: https://gitcode.com/gh_mirrors/pi/pixi 点击查看 免费下载 pi… · 2026/9/28 3:08:13

Kimi Code 自动权限模式(Auto Permission Mode)指南:从进入提醒到源码级运行机制
Kimi Code 自动权限模式(Auto Permission Mode)指南:从进入提醒到源码级运行机制

AI Agent代码智能体人工智能大模型CLI 【免费下载链接】kimi-code Kimi Code CLI — The Starting Point for Next-Gen Agents 项目地址: https://gitcode.com/gh_mirrors/ki/kimi-code 点击查看 免费下载 Kimi Code(本仓库为 gh_mirrors/ki/kimi-code&… · 2026/9/28 3:08:12

fl_chart 饼图(PieChart)完全指南:数据模型、隐式动画、触摸交互与堆叠分段实战
fl_chart 饼图(PieChart)完全指南:数据模型、隐式动画、触摸交互与堆叠分段实战

【免费下载链接】fl_chart FL Chart is a highly customizable Flutter chart library that supports Line Chart, Bar Chart, Pie Chart, Scatter Chart, Radar Chart and Candlestick Chart. 项目地址: https://gitcode.com/gh_mirrors/fl/fl_chart 点击查看 免费… · 2026/9/28 3:08:12

Spingboot启动预热的实现
Spingboot启动预热的实现

启动预热的适用场景启动预热适合以下情况:数据主要来自第三方接口,无法直接从本地数据库读取。第三方接口响应较慢,首次访问容易超时。一个页面需要调用多个第三方接口或逐项查询。数据读取频繁,但变化不频繁。希望服务启动后&… · 2026/9/28 3:40:12

Understanding Driving Risks using Large Language Models: Toward Elderly Driver Assessment
Understanding Driving Risks using Large Language Models: Toward Elderly Driver Assessment

文章主要内容总结 本文研究了多模态大语言模型(具体为ChatGPT-4o)利用静态行车记录仪图像进行类人交通场景解读的潜力,重点聚焦与老年司机评估相关的三项任务:交通密度评估、交叉口可见性评估和停车标志识别。这些任务需上下文推理而非简单目标检测。研究采用零样本、少样… · 2026/9/28 3:32:43

Leveraging Large Language Models for Classifying App Users‘ Feedback
Leveraging Large Language Models for Classifying App Users‘ Feedback

文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)解决应用用户反馈分类的挑战,传统方法依赖有监督机器学习,但受限于标注数据集的规模和质量。研究通过三个核心实验评估了4种先进LLMs(GPT-3.5-Turbo、GPT-4o、Flan-T5、Llama3-70b)的性能: LLMs在用户反馈分类中的基… · 2026/9/28 3:32:43

Using Large Language Models for Legal Decision-Making in Austrian Value-Added Tax Law: An Experim...
Using Large Language Models for Legal Decision-Making in Austrian Value-Added Tax Law: An Experim...

文章主要内容总结 本文通过实验评估了大型语言模型(LLMs)在奥地利及欧盟增值税(VAT)法框架下辅助法律决策的能力。研究聚焦于两种提升LLM性能的方法——微调(fine-tuning)和检索增强生成(RAG),并在两类案例中进行验证:一是权威教科书案例,二是税务咨询公司的真实案… · 2026/9/28 3:32:43

学Java别走弯路,这5个方向最吃香
学Java别走弯路,这5个方向最吃香

学Java的人很多,但学明白的人不多。有人学了半年还在写控制台程序,有人一年就能独当一面。差别不在天赋,而在方向。Java生态太庞大了,什么都学等于什么都没学。选对方向,事半功倍。今天盘点当前最吃香的5个Java方向&am… · 2026/9/28 3:32:15

AlphaAgents: Large Language Model based Multi-Agents for Equity Portfolio Constructions
AlphaAgents: Large Language Model based Multi-Agents for Equity Portfolio Constructions

AlphaAgents相关总结与翻译 一、文章主要内容总结 (一)研究背景与问题 传统股票投资组合管理依赖人类分析师处理海量信息(如财务披露、财报、市场新闻等),存在信息处理效率低、易受认知偏差(如损失厌恶、过度自信)影响的问题,可能错失投资收益机会。尽管AI在数据处理… · 2026/9/28 3:32:08

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

制作网页比较方便的软件怎么选?一文搞懂避坑指南
制作网页比较方便的软件怎么选?一文搞懂避坑指南

制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码