在 .NET 运行时仓库中构建、运行与调试 Android 上的 CoreCLR:完整开发者工作流
在 .NET 运行时仓库中构建、运行与调试 Android 上的 CoreCLR完整开发者工作流【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime导读本文基于 .NET 运行时仓库dotnet/runtime的官方开发者文档系统讲解如何在 macOS、Linux 以及 WindowsWSL2 主机上为 Android 平台构建 CoreCLR 运行时、使用HelloAndroid示例在模拟器中部署运行应用、在模拟器上跑功能测试并利用 Android Studio 对 CoreCLR 原生运行时进行断点调试。读完本文你将掌握从环境准备、交叉编译到真机/模拟器验证、原生符号调试的完整闭环技能可直接用于日常的 CoreCLR Android 移植与验证工作。支持的构建主机与目标架构根据 android.md 的说明CoreCLR for Android 的构建支持情况如下主机系统支持情况macOS✔ 支持Linux✔ 支持Windows❌ 不支持仅能通过 WSL2 间接构建目标架构支持情况x86❌ 不支持x64✔ 支持arm❌ 不支持arm64✔ 支持注意目前仅支持x64与arm64两个目标架构。真机尤其主流手机通常是arm64而模拟器按宿主机架构选择x64或arm64。macOS / Linux 上的构建流程环境前置条件Prerequisites在 macOS 或 Linux 上构建 CoreCLR for Android需要准备OpenJDK 23下载并安装构建工具链依赖其完成 APK 打包等任务。Android Studio安装后通过 SDK Manager 获取以下组件Android SDK最低支持的 API level 为24Android NDK r27c。这些前置项也可以手动下载安装两种替代方式自动化脚本参考 Testing Libraries on Android 中描述的脚本可一次性拉取 SDK/NDK手动下载归档Android SDK下载 command-line tools 后用sdkmanager安装 SDK 组件Android NDK直接下载 NDK 归档。安装完成后设置以下环境变量写入 shell 配置文件可避免每次重复导出export ANDROID_SDK_ROOTfull-path-to-android-sdk export ANDROID_NDK_ROOTfull-path-to-android-ndk构建运行时、类库与工具链在仓库根目录repo-root执行以下命令即可完成本地开发所需的 CoreCLR 运行时、JIT、CoreLib、原生 CoreLib、工具与类库的构建./build.sh clr.runtimeclr.alljitsclr.corelibclr.nativecorelibclr.toolsclr.packageslibs -os android -arch x64|arm64 -c Debug|Release如果需要进一步产出 CoreCLR 运行时NuGet 包则在上述子集基础上追加hostpacks./build.sh clr.runtimeclr.alljitsclr.corelibclr.nativecorelibclr.toolsclr.packageslibshostpacks -os android -arch x64|arm64 -c Debug|Release两个要点生成的运行时 NuGet 包位于repo-root/artifacts/packages/configuration/Shipping/面向静态链接的静态 CoreCLR 运行时libcoreclr_static.a目前只出现在内部构建产物中尚未随 NuGet 包发布。从源码看clr.runtimeclr.alljitsclr.corelibclr.nativecorelibclr.toolsclr.packageslibs这一串子集正是 src/mono/sample/Android/Makefile 中RUNTIME_FLAVORcoreclr时runtimepack目标所复用的同一组构建子集也就是说示例应用的make流程与文档给出的手工构建命令在运行时产物上完全一致。Windows WSL2 构建流程Windows 上目前不能直接构建 CoreCLR for Android但官方支持借助WSL2完成。Windows 侧要求下载并安装 Android Studio启用 Windows 的长路径支持具体见 windows-requirements.md。WSL 侧要求先按 linux-requirements.md 完成 Linux 环境工具链、依赖包准备按上文 macOS/Linux 前置条件 安装 OpenJDK、Android SDK 与 Android NDK。可选方式使用官方提供的自动化脚本手动下载归档在 WSL 内安装 Android Studio需要先保证 WSL 版本较新且开启了 systemd# 在 Windows 主机侧执行更新 WSL wsl --update # 在 WSL 发行版设置中启用 systemd 后安装 Android Studio sudo snap install android-studio --classic对于 UbuntuOpenJDK 21 已足够apt install openjdk-21-jdk设置环境变量export ANDROID_SDK_ROOTfull-path-to-android-sdk export ANDROID_NDK_ROOTfull-path-to-android-ndk构建运行时、类库与工具链在 WSL 的仓库根目录执行与 Linux 完全相同的命令./build.sh clr.runtimeclr.alljitsclr.corelibclr.nativecorelibclr.toolsclr.packageslibs -os android -arch x64|arm64 -c Debug|Release构建并运行 HelloAndroid 示例应用为演示 CoreCLR Android 应用的构建与运行文档使用 HelloAndroid 示例应用。运行它的前提是CoreCLR 已经按目标 Android 平台成功构建。示例的入口 Program.cs 非常简洁——向logcat输出Hello, Android!并返回退出码42using System; public static class Program { public static int Main(string[] args) { Console.WriteLine(Hello, Android!); // logcat return 42; } }构建 HelloAndroid在仓库根目录执行make BUILD_CONFIGDebug|Release TARGET_ARCHx64|arm64 RUNTIME_FLAVORCoreCLR DEPLOY_AND_RUNfalse run -C src/mono/sample/AndroidBUILD_CONFIGDebug或ReleaseTARGET_ARCHx64或arm64RUNTIME_FLAVOR指定为CoreCLRMakefile默认值是mono必须显式切换DEPLOY_AND_RUNfalse只构建不部署运行。成功构建后APK 输出在repo-root/artifacts/bin/AndroidSampleApp/x64|arm64/Debug|Release/android-x64|arm64/Bundle/bin/HelloAndroid.apk从 Makefile 看make run实际等价于执行dotnet publish并携带了TargetOSandroid、TargetArchitecture、DeployAndRun、RuntimeFlavor等参数当DEPLOY_AND_RUNtrue时AndroidSampleApp.csproj 中的RunAppBundle目标会通过 xharness 调用android test以--expected-exit-code42校验示例应用成功运行与Program.Main返回42呼应。在模拟器上运行 HelloAndroid先在 Android Studio 的Device Manager中创建并启动一个 Android Virtual DeviceAVD随后执行make BUILD_CONFIGDebug|Release TARGET_ARCHx64|arm64 RUNTIME_FLAVORCoreCLR DEPLOY_AND_RUNtrue run -C src/mono/sample/Android模拟器也可以直接从终端启动$ANDROID_SDK_ROOT/emulator/emulator -avd emulator-nameWSL2 下运行到 Windows 主机的模拟器应用可以运行在Windows 主机侧的模拟器上步骤如下在 Windows 主机安装 Android Studio版本与前置条件一致在 Windows 中创建并启动模拟器在 WSL 中将 WSL2 内 Android SDK 的adb替换为 Windows 主机的adbmv $ANDROID_SDK_ROOT/platform-tools/adb $ANDROID_SDK_ROOT/platform-tools/adb-orig ln -s /mnt/path-to-sdk-on-host/platform-tools/adb.exe $ANDROID_SDK_ROOT/platform-tools/adbWindows 主机上 SDK 的位置可以在 Android Studio 的 SDK Manager 中查看让 xharness 使用指向 Windows 主机 adb 的路径export ADB_EXE_PATH$ANDROID_SDK_ROOT/platform-tools/adb在 WSL 中按上文命令执行make。在模拟器上构建并运行功能测试文档以 Android.Device_Emulator.JIT.Test 测试项目为例演示在 CoreCLR Android 上构建并运行测试./dotnet.sh build -c Debug|Release src/tests/FunctionalTests/Android/Device_Emulator/JIT/Android.Device_Emulator.JIT.Test.csproj /p:TargetOSandroid /p:TargetArchitecturex64|arm64 /t:Test /p:RuntimeFlavorcoreclr/t:Test触发测试执行目标/p:RuntimeFlavorcoreclr指定使用 CoreCLR 运行时与HelloAndroid一样运行前需要先启动模拟器。该测试项目的 csproj 声明了RunAOTCompilationfalse即纯 JIT 模式与ExpectedExitCode42其 Program.cs 同样打印Hello, Android!并返回42用于在设备/模拟器上验证 JIT 路径下的 CoreCLR 正常运行。仓库 src/tests/FunctionalTests/Android/Device_Emulator 下还提供了大量同类测试变体可用于覆盖不同运行时模式Interpreter、AOT、AOT_LLVM、AOT_PROFILED、NativeAOT、PInvoke、RuntimeConfig、StartupHook、CrashChaining等可在此基础上扩展验证面。调试 CoreCLR 运行时与示例应用目前托管代码调试尚不支持但可以调试示例应用的Java 部分CoreCLR host 与运行时本身的原生代码。调试在 Android Studio 中通过Profile or Debug APK完成。调试步骤以Debug配置、arm64目标架构构建运行时与HelloAndroid示例应用将运行时库的调试符号文件libcoreclr.so.dbg重命名为libcoreclr.so.so该文件位于repo-root/artifacts/bin/AndroidSampleApp/arm64/Debug/android-arm64/publish/libcoreclr.so.dbg打开 Android Studio选择Profile or Debug APK项目选择目标 APK 文件例如repo-root/artifacts/bin/AndroidSampleApp/arm64/Debug/android-arm64/Bundle/bin/HelloAndroid.apk在项目面板中展开HelloAndroid - cpp - libcoreclr双击libcoreclr.so在右侧Debug Symbols面板点击Add定位到步骤 2 中重命名后的符号文件并选中repo-root/artifacts/bin/AndroidSampleApp/arm64/Debug/android-arm64/publish/libcoreclr.so.so符号加载成功后HelloAndroid - cpp - libcoreclr下会列出全部源码文件找到exports.cpp在coreclr_initialize函数上设置断点并启动调试会话提示如果构建运行时没有把调试符号剥离到独立文件即不存在libcoreclr.so.dbg则可省略第 58 步。构建时传入-keepnativesymbols选项即可保留符号./build.sh clr.runtimeclr.alljitsclr.corelibclr.nativecorelibclr.toolsclr.packageslibs -os android -arch x64|arm64 -c Debug -keepnativesymbols-keepnativesymbols的实际效果在构建脚本 eng/native/build-commons.sh 中可以看到它会把-DCLR_CMAKE_KEEP_NATIVE_SYMBOLStrue追加到 CMake 参数从而阻止 native 构建剥离调试符号。相关资源使用 Mono 运行时调试 Android 应用的类似指南见 android-debugging.md。常见问题TroubleshootingAndroid 示例或功能测试构建失败报错java.lang.NullPointerException: Cannot invoke String.length()如果系统安装了多个 JDK构建 Android 示例或功能测试时可能遇到如下错误该错误来自 Android 构建目标例如src/mono/msbuild/android/build/AndroidBuild.targetssrc/mono/msbuild/android/build/AndroidBuild.targets(237,5): error MSB4018: java.lang.NullPointerException: Cannot invoke String.length() because parameter1 is null解决办法移除旧的 JDK 版本安装 OpenJDK 23确保 OpenJDK 23 的可执行文件已加入 PATH。在 Unix 系统上可通过以下方式验证$ java -version openjdk version 23.0.1 2024-10-15 OpenJDK Runtime Environment Homebrew (build 23.0.1) OpenJDK 64-Bit Server VM Homebrew (build 23.0.1, mixed mode, sharing)说明文档要求统一使用 OpenJDK 23WSL/Ubuntu 场景下 OpenJDK 21 亦可满足构建其根本原因是 Android 构建链会解析 JDK 路径与版本信息多版本 JDK 并存时容易导致String.length()空引用之类的解析失败。配置过程中注意把 JDK 版本纳入和ANDROID_SDK_ROOT、ANDROID_NDK_ROOT同等重要的环境变量管理范畴。【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Podman `--label` 选项完全指南:为容器与 Pod 添加元数据的实战与源码解析

Podman `--label` 选项完全指南:为容器与 Pod 添加元数据的实战与源码解析

容器运行时云原生CLI 【免费下载链接】podman Podman: A tool for managing OCI containers and pods. 项目地址: https://gitcode.com/gh_mirrors/po/podman 点击查看 免费下载 本指南以 Podman 官方选项文档 label.md 为核心,系统讲解 --label / -l 选…

2026/9/19 23:28:33 阅读更多 →
BrewUI:可视化管理Homebrew,告别命令行依赖混乱

BrewUI:可视化管理Homebrew,告别命令行依赖混乱

如果你经常用 macOS 开发,那大概率已经习惯了打开终端敲brew install xxx这类命令。Homebrew 确实好用,但用久了你会发现一个尴尬的点:依赖关系复杂到不敢轻易brew autoremove,一堆旧版本占着磁盘却不知道哪些能清,搜索…

2026/9/19 23:28:33 阅读更多 →
Zepto.js 核心源码深度剖析:IIFE 闭包、Z 包装数组与 fragment HTML 解析完全指南

Zepto.js 核心源码深度剖析:IIFE 闭包、Z 包装数组与 fragment HTML 解析完全指南

Zepto.js 核心源码深度剖析:IIFE 闭包、Z 包装数组与 fragment HTML 解析完全指南 【免费下载链接】zepto Zepto.js is a minimalist JavaScript library for modern browsers, with a jQuery-compatible API 项目地址: https://gitcode.com/gh_mirrors/ze/zepto …

2026/9/19 23:28:33 阅读更多 →

最新新闻

Naive UI 创建适配主题的自定义组件:n-config-provider、n-element 与 useThemeVars 全面指南

Naive UI 创建适配主题的自定义组件:n-config-provider、n-element 与 useThemeVars 全面指南

前端UI组件 【免费下载链接】naive-ui A Vue 3 Component Library. Fairly Complete. Theme Customizable. Uses TypeScript. Fast. 项目地址: https://gitcode.com/gh_mirrors/na/naive-ui 点击查看 免费下载 Naive UI 不仅内置了数十个开箱即用的主题化组件&…

2026/9/21 3:45:05 阅读更多 →
如何给SumatraPDF贡献代码?从构建、调试到提交PR的完整开发者指南

如何给SumatraPDF贡献代码?从构建、调试到提交PR的完整开发者指南

如何给SumatraPDF贡献代码?从构建、调试到提交PR的完整开发者指南 【免费下载链接】sumatrapdf SumatraPDF reader 项目地址: https://gitcode.com/gh_mirrors/su/sumatrapdf SumatraPDF 是一款免费的开源多格式文档阅读器(支持 PDF、EPUB、MOBI、…

2026/9/21 3:44:04 阅读更多 →
Readest OPDS 分组轮播实现解析:基于 react-virtuoso 的虚拟化横向卡片滑轨与懒加载封面

Readest OPDS 分组轮播实现解析:基于 react-virtuoso 的虚拟化横向卡片滑轨与懒加载封面

桌面应用跨平台前端 【免费下载链接】readest Readest is a modern, feature-rich ebook reader designed for avid readers offering seamless cross-platform access, powerful tools, and an intuitive interface to elevate your reading experience. 项目地址:…

2026/9/21 3:43:04 阅读更多 →
使用 Go 标准库 time 正确处理时间:Uber Go Style Guide 时间处理实践全解析

使用 Go 标准库 time 正确处理时间:Uber Go Style Guide 时间处理实践全解析

文档教程代码质量Lint 【免费下载链接】guide The Uber Go Style Guide. 项目地址: https://gitcode.com/gh_mirrors/gu/guide 点击查看 免费下载 导读 时间处理是 Go 开发中最容易被低估的复杂度来源——"一天有 24 小时""一小时有 60 分钟"…

2026/9/21 3:43:04 阅读更多 →
Toonflow是什么?AI短剧工厂完整指南:2小时把小说变成成片,创作效率提升10倍

Toonflow是什么?AI短剧工厂完整指南:2小时把小说变成成片,创作效率提升10倍

Toonflow是什么?AI短剧工厂完整指南:2小时把小说变成成片,创作效率提升10倍 【免费下载链接】Toonflow-app Toonflow 是一款 AI 短剧漫剧工具,能够利用 AI 技术将小说自动转化为剧本,并结合 AI 生成的图片和视频&#…

2026/9/21 3:42:03 阅读更多 →
Macrotrends 历史金融数据提取实战:基于 browser-harness 的四种无浏览器抓取模式

Macrotrends 历史金融数据提取实战:基于 browser-harness 的四种无浏览器抓取模式

Macrotrends 历史金融数据提取实战:基于 browser-harness 的四种无浏览器抓取模式 【免费下载链接】browser-harness Browser Harness | Self-healing harness that enables LLMs to complete any task. 项目地址: https://gitcode.com/gh_mirrors/br/browser-har…

2026/9/21 3:42:03 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →