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

RunAnywhere Kotlin SDK 最小示例:runanywhere-minimal 的架构、构建与端到端流式推理实战

发布时间:2026/9/24 14:08:05 来源:云帆数科 栏目:资讯中心
RunAnywhere Kotlin SDK 最小示例:runanywhere-minimal 的架构、构建与端到端流式推理实战
AI模型推理服务推理引擎本地部署多模态【免费下载链接】runanywhere-sdksProduction ready toolkit to run AI locally项目地址https://gitcode.com/gh_mirrors/ru/runanywhere-sdks点击查看免费下载导读本文围绕仓库 bindings/kotlin/example/README.md 所描述的runanywhere-minimalKotlin / Android示例应用展开剖析它如何以一个按钮 一个文本框的最小形态验证 RunAnywhere Kotlin SDK 的完整 LLM 流式推理链路后端注册、SDK 初始化、模型注册、流式生成。读完本文你将掌握如何通过 Gradle composite build 让 Android 应用直接编译本地 SDK 源码无需 AAR 暂存、如何满足本地.so原生库与local.properties两个构建前提、如何用两条命令在 arm64 设备上跑通首个模型下载与生成以及示例应用背后真实源码中的 API 调用细节与 Kotlin 版本钉定技巧。一、这个示例应用是什么runanywhere-minimal是一个单 Activity 的 Android 应用界面只有一个按钮Generate和一个文本框点击后流式输出一次 LLM 补全结果。它定位为 Kotlin SDK 的贡献者测试脚手架contributor test harness——核心价值是回答我改的 C/SDK 改动还能不能正常工作而非展示型 App。文档明确说明见 example/README.md它必须是 Android 应用而非 JVM 控制台程序原因有两条Kotlin SDK 是以com.android.library形式发布的Android library其 JNI 核心需要一个真实的 AndroidContext并且只能在真机/模拟器的真实 ABI如arm64-v8a上运行。刻意缺席的内容为了保持最小定位示例应用明确不包含Compose、设计系统、模型目录、导航。从 MainActivity.kt 可以看到界面完全用原生 View 拼装TextView作为输出、Button触发生成、ScrollView包裹文本外加一个LinearLayout垂直排列——没有任何 Jetpack Compose 依赖。二、如何消费 SDKGradle composite build零 AAR 暂存2.1 includeBuild dependencySubstitution示例应用通过 settings.gradle.kts 把bindings/kotlin作为composite build拉入构建includeBuild(../../../bindings/kotlin) { dependencySubstitution { substitute(module(com.runanywhere:runanywhere-kotlin)) .using(project(:)) substitute(module(com.runanywhere:runanywhere-core-llamacpp)) .using(project(:modules:runanywhere-core-llamacpp)) } }这意味着应用直接从本地源码编译 SDK无需任何 AAR 暂存步骤坐标占位符被替换为的本地工程com.runanywhere:runanywhere-kotlinproject(:)即bindings/kotlin根工程com.runanywhere:runanywhere-core-llamacppproject(:modules:runanywhere-core-llamacpp)这两个坐标只存在于替换规则中永远不会从任何远程仓库解析。与旧的全量消费 App 曾用的files(../libs/*.aar)方式不同composite build 会自动带入 SDK 的传递运行时依赖coroutines、OkHttp、Wire 等因此 app/build.gradle.kts 中只声明了这两个被替换的坐标应用自身不需要声明任何传递依赖而且改完 SDK 源码后无需重跑 AAR 暂存步骤重新./gradlew :app:installDebug即可。补充说明文档中提及的旧消费方模式files(../libs/*.aar)目前已在仓库内被 composite build 取代完整消费 App 已迁移至独立仓库 runanywhere-android本文只关注本地 minimal 示例。2.2 应用模块配置要点app/build.gradle.kts 中有几个值得注意的配置android { namespace com.runanywhere.minimal compileSdk 37 defaultConfig { applicationId com.runanywhere.minimal minSdk 24 // Android 7.0 targetSdk 37 ndk { abiFilters arm64-v8a } // 单一 ABI保持 APK 小巧 } compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } packaging { jniLibs { pickFirsts **/libc_shared.so pickFirsts **/libomp.so pickFirsts **/librac_commons.so } } }ABI 过滤只打包arm64-v8a以缩小 APK要测试其他设备可移除该过滤。SDK 后端模块本身支持arm64-v8a、armeabi-v7a、x86_64三个 ABI见 modules/runanywhere-core-llamacpp/build.gradle.kts。JNI 库去重SDK 与每个后端都会捆绑 NDK C 运行时因此用pickFirsts保留一份libc_shared.so、libomp.so与librac_commons.so。ManifestAndroidManifest.xml声明了INTERNET权限——这是模型下载与 SDK 鉴权所必需的同时声明MainActivity为 LAUNCHER 入口。三、构建前提Prerequisites3.1 本地原生库useLocalNativestrueSDK 的gradle.properties设置了runanywhere.useLocalNativestrue见 bindings/kotlin/gradle.properties因此构建期望 commons 的 JNI.so文件已就位公共层bindings/kotlin/src/main/jniLibs/后端模块modules/runanywhere-core-llamacpp/src/main/jniLibs/如果这些.so已存在构建会直接复用如果缺失或过期构建会转而触发较慢的原生编译# 从仓库根目录执行——仅在 .so 缺失或过期时需要 ./scripts/build/build-core-android.sh该脚本存在于 scripts/build/用于在本地补齐 Android 原生库。3.2 local.properties还需要带sdk.dir的local.propertiesAndroid Studio 会自动生成该文件被 gitignoreecho sdk.dir$HOME/Library/Android/sdk bindings/kotlin/example/local.properties示例应用自身的 gradle.properties 配置了 JVM 内存-Xmx4096m、并行构建org.gradle.paralleltrue、AndroidX 与android.nonTransitiveRClasstrue。四、运行构建、安装、启动cd bindings/kotlin/example # 构建 安装 在已连接的 arm64 设备/模拟器上启动 ./gradlew :app:installDebug adb shell am start -n com.runanywhere.minimal/.MainActivity # 或仅编译SDK 改动后最快的验证门槛 ./gradlew :app:compileDebugKotlin点击Generate按钮后首次运行会下载模型需要等待一会儿期间可通过adb logcat观察进度。五、它覆盖了哪些 SDK API文档以表格形式列出了最小示例覆盖的四步关键 API步骤API后端注册LlamaCPP.register()SDK 启动RunAnywhere.initialize(context this)目录登记RunAnywhere.models.register(ModelRegistration.url(...))流式生成RunAnywhere.llm.generateStream(prompt, LlmOptions(...))5.1 源码级调用链在 MainActivity.kt 中bootstrap协程按顺序执行三步bootstrap scope.async { // 1. 后端注册必须在 initialize() 之前避免并发加载时只有平台后端可用 LlamaCPP.register() // 2. SDK 初始化单阶段无需 completeServicesInitialization() RunAnywhere.initialize(context thisMainActivity) // 3. 目录登记重复注册同一 id 不是值得暴露的错误用 runCatching 兜底 runCatching { RunAnywhere.models.register( ModelRegistration.url( name SmolLM2 360M Q8_0, url MODEL_URL, framework InferenceFramework.INFERENCE_FRAMEWORK_LLAMA_CPP, category ModelCategory.MODEL_CATEGORY_LANGUAGE, id MODEL_ID, memoryBytes 386_404_416L, ), ) } Unit }点击 Generate 后UI 协程先bootstrap.await()然后发起流式生成RunAnywhere.llm .generateStream(PROMPT, LlmOptions(model MODEL_ID, maxOutputTokens 128)) .collect { event - when (event) { is GenerationEvent.TextDelta - output.append(event.text) is GenerationEvent.Completed - output.append( \n\n--- ${event.result.outputTokens} tokens, ${event.result.tokensPerSecond} tok/s, ) is GenerationEvent.Failed - output.append(\n\nfailed: ${event.error.message}) else - Unit } }这里可以看到流式事件的完整处理方式GenerationEvent.TextDelta逐段追加生成的文本实现打字机式输出GenerationEvent.Completed展示本次生成的 token 数与速度tok/sGenerationEvent.Failed展示错误信息其他事件类型走else - Unit忽略。5.2 关键行为语义initialize是单阶段的没有completeServicesInitialization()需要额外调用下载与加载是自动的只要传入LlmOptions.model即可无需显式调用downloadModelStream/loadModel目录不会自动预置未知 id 会在生成前被拒绝因此那一次models.register调用是必需的示例中模型常量定义MainActivity.ktprivate const val MODEL_ID smollm2-360m-q8_0 private const val MODEL_URL https://huggingface.co/prithivMLmods/SmolLM2-360M-GGUF/resolve/main/SmolLM2-360M.Q8_0.gguf private const val PROMPT Name three colours.要换模型时只需修改MODEL_ID/MODEL_URL文档提示规范的模型 id 与 URL 位于 RCLI 项目的 catalogsrc/catalog/catalog.cpp中此处不展开外部项目细节。六、Kotlin 版本钉定version pin的技巧示例应用的 app/build.gradle.kts 应用了org.jetbrains.kotlin.plugin.serialization2.4.0尽管代码里没有任何Serializable注解plugins { id(com.android.application) // 不是为了 Serializable——只是为了把 AGP 内置的 Kotlin 编译器 // 钉到 2.4.0使其能读取 SDK 的 2.4.0 元数据。 id(org.jetbrains.kotlin.plugin.serialization) }背景是AGP 9 自带 Kotlin此时再应用kotlin.android会直接报错其内置编译器版本为 2.2.0无法读取 SDK 的 2.4.0 Kotlin 元数据。把 2.4.0 的 Kotlin 编译器插件放到 buildscript classpath 上就能把内置编译器钉到 2.4.0——这与bindings/kotlin自身使用的技巧相同。从 gradle/libs.versions.toml 可以看到 SDK 侧的kotlin 2.4.0版本定义两者保持一致。七、SDK 背景速览供上下文参考若想进一步了解该示例所验证的 SDK 全貌可参考 bindings/kotlin/README.md平台要求Android API 24Android 7.0、Kotlin 2.0、JVM 17能力矩阵LLMGGUFllama.cpp、STT/TTS/VADONNX/Sherpa、VLMGGUF 多模态、Voice 流水线VAD→STT→LLM→TTS、NPUQualcomm 设备的 qhexrt可选隐私定位推理默认在设备端完成网络仅用于 SDK 鉴权、模型下载与可选分析提示词、响应与音频默认不会为推理而上云。该示例应用正是验证上述核心 LLM 能力的最小闭环从本地源码编译、自动下载模型、自动加载到流式输出一次完整补全整个链路清晰可见。结语runanywhere-minimal虽小却是理解 RunAnywhere Kotlin SDK 内部机制的绝佳入口composite build 的本地源码消费模式、useLocalNatives驱动的原生库策略、单阶段初始化 自动下载加载的运行时语义以及 AGP 9 时代 Kotlin 版本钉定的工程技巧都浓缩在这一个 Activity 里。对 SDK 贡献者而言./gradlew :app:compileDebugKotlin是改动后最快的验证门槛对初学者而言它则是从零跑通端侧 LLM 流式推理的最短路径。赞分享AI模型推理服务推理引擎本地部署多模态【免费下载链接】runanywhere-sdksProduction ready toolkit to run AI locally项目地址https://gitcode.com/gh_mirrors/ru/runanywhere-sdks点击查看免费下载相关推荐jcode 性能优化技能实战指南从指标定义到瓶颈归因的完整工作流jcode 性能优化技能实战指南从指标定义到瓶颈归因的完整工作流 导读 本篇指南围绕 jcode 仓库内置的 optimization 技能 .jcode/AI模型推理服务推理引擎本地部署多模态深入解析 runanywhere-minimal用 RunAnywhere Swift SDK 编写最小 LLM 流式生成 CLI深入解析 runanywhere minimal用 RunAnywhere Swift SDK 编写最小 LLM 流式生成 CLI runanywhere mAI模型推理服务推理引擎本地部署多模态RunAnywhere Swift SDK 最小可执行示例runanywhere-minimal完全指南本地源码消费、构建运行与已知限制RunAnywhere Swift SDK 最小可执行示例runanywhere minimal完全指南本地源码消费、构建运行与已知限制 runanywhAI模型推理服务推理引擎本地部署多模态上一篇基于MMEngine框架训练生成对抗网络(GAN)的完整指南下一篇GitHub_Trending/pu/publicationsCTF竞赛平台搭建与管理指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Raspberry Pi Connect:树莓派零配置远程访问原理与实战
Raspberry Pi Connect:树莓派零配置远程访问原理与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 14:07:52

Play Framework Scala 自定义请求绑定:PathBindable 与 QueryStringBindable 完整实战指南
Play Framework Scala 自定义请求绑定:PathBindable 与 QueryStringBindable 完整实战指南

Play Framework Scala 自定义请求绑定:PathBindable 与 QueryStringBindable 完整实战指南 【免费下载链接】playframework The Community Maintained High Velocity Web Framework For Java and Scala. 项目地址: https://gitcode.com/gh_mirrors/pl/playframewo… · 2026/9/24 14:07:46

3步搭建个人资源聚合中心:Jackett终极指南
3步搭建个人资源聚合中心:Jackett终极指南

3步搭建个人资源聚合中心:Jackett终极指南 Jackett是一款强大的开源资源聚合引擎,能够将上百个种子网站的资源整合到一个统一的搜索界面中。无论你是媒体爱好者、研究人员还是开源软件用户,Jackett都能为你节省大量搜索时间,让资… · 2026/9/24 14:07:46

django CMS 组合架构解析:内容对象、插件与 Apphook 三大积木如何构成一个站点
django CMS 组合架构解析:内容对象、插件与 Apphook 三大积木如何构成一个站点

CMS后端 【免费下载链接】django-cms The easy-to-use and developer-friendly enterprise CMS powered by Django 项目地址: https://gitcode.com/gh_mirrors/dj/django-cms 点击查看 免费下载 django CMS 站点由三类构建块拼装而成:内容对象&#xf… · 2026/9/24 15:31:54

牛油火锅底料全栈制作指南:从重庆老油炼制到 RAG 食谱系统的结构化数据实践
牛油火锅底料全栈制作指南:从重庆老油炼制到 RAG 食谱系统的结构化数据实践

牛油火锅底料全栈制作指南:从重庆老油炼制到 RAG 食谱系统的结构化数据实践 【免费下载链接】all-in-rag 🔍大模型应用开发实战一:RAG 技术全栈指南,在线阅读地址:https://datawhalechina.github.io/all-in-rag/ 项目… · 2026/9/24 15:31:54

AZ-104备考PDF全攻略:查看、打印、标注与版本核对指南
AZ-104备考PDF全攻略:查看、打印、标注与版本核对指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:31:54

Financing | 为什么黄金能保值?
Financing | 为什么黄金能保值?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:31:54

2026企业AI办公工具选型指南:框架、平台盘点与落地场景
2026企业AI办公工具选型指南:框架、平台盘点与落地场景

企业引入AI办公工具时,很容易陷入以功能清单判断产品价值的误区。不少管理者会横向罗列各家平台的能力项,用功能数量多少作为取舍依据,或是单纯以采购成本、品牌声量决定选型方向。这种评估方式容易造成AI工具上线之后,难以融入现… · 2026/9/24 15:31:47

Hive Web Scrape Tool 深度指南:基于 Playwright Stealth 的无头浏览器网页内容提取与 SSRF 防护
Hive Web Scrape Tool 深度指南:基于 Playwright Stealth 的无头浏览器网页内容提取与 SSRF 防护

人工智能AI Agent多智能体MCP 服务工具调用浏览器控制 【免费下载链接】hive Multi-Agent Harness for Production AI 项目地址: https://gitcode.com/gh_mirrors/hive48/hive 点击查看 免费下载 导读 web_scrape 是 Hive 多 Agent 生产框架(hive_tool… · 2026/9/24 15:31:35

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

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

企业微信二维码