
开发工具CLI【免费下载链接】devenvFast, Declarative, Reproducible, and Composable Developer Environments using Nix项目地址https://gitcode.com/gh_mirrors/de/devenv点击查看免费下载导读本文围绕 devenv 的android.enable集成模块讲解如何在 Nix 驱动的开发环境中一键构建可复现的 Android 开发环境包括完整可复制的devenv.nix配置、SDK 版本选择策略nixpkgs androidenv 与 android-nixpkgs 两套来源的取舍、模拟器创建的正确姿势以及 React Native 与 Flutter 的专用配置。读完本文你将能独立写出适用于 Android 原生、RN、Flutter 项目的 devenv 配置并理解底层ANDROID_HOME、NDK、Gradle 参数是如何被 Nix 模块组装起来的。最小可用配置三行开启 Android 环境在项目根目录创建devenv.nix写入如下内容即可获得一套完整可用的 Android 开发环境{ pkgs, ... }: { android.enable true; }android.enable是 src/modules/integrations/android.nix 中定义的总开关。开启后该模块会自动完成一系列环境搭建工作向packages注入完整 SDK 组合SDK、platform-tools、模拟器等具体来源见下文自动开启 Java 语言支持java.enable lib.mkDefault true见 src/modules/integrations/android.nix设置ANDROID_HOME、ANDROID_NDK_ROOT环境变量通过GRADLE_OPTS让 Gradle 使用 SDK 自带的 patched aapt2进入 shell 时自动生成local.properties写入sdk.dir与ndk.dir并设置ANDROID_USER_HOME/ANDROID_AVD_HOME到当前目录的.android/下见 src/modules/integrations/android.nix。也就是说android.enable true不只是装上几个包而是把 JDK、SDK 路径、Gradle 参数和本地属性文件全部一次性配置到位。仓库还提供了一个精简的参考示例 examples/android/devenv.nix它在默认配置基础上显式关闭了 Android Studio{ pkgs, ... }: { android.enable true; android.android-studio.enable false; }定制化配置完整选项清单与默认值如果默认组合不满足需求可以按需指定各组件版本。官方文档给出了一份覆盖几乎所有选项的完整配置{ pkgs, ... }: { android { enable true; platforms.version [ 32 34 ]; systemImageTypes [ google_apis_playstore ]; abis [ arm64-v8a x86_64 ]; cmake.version [ 3.22.1 ]; cmdLineTools.version 11.0; tools.version 26.1.1; # platformTools.version defaults to latest from nixpkgs buildTools.version [ 30.0.3 ]; emulator { enable true; # version defaults to latest from nixpkgs }; sources.enable false; systemImages.enable true; ndk.enable true; googleAPIs.enable true; googleTVAddOns.enable true; extras [ extras;google;gcm ]; extraLicenses [ android-sdk-preview-license android-googletv-license android-sdk-arm-dbt-license google-gdk-license intel-android-extra-license intel-android-sysimage-license mips-android-sysimage-license ]; android-studio { enable true; package pkgs.android-studio; }; }; }对照 src/modules/integrations/android.nix 中的选项定义各选项的真实默认值如下表选项默认值说明platforms.version[ 32 34 36 ]要安装的 Android 平台API level列表systemImageTypes[ google_apis_playstore ]系统镜像类型abis[ arm64-v8a x86_64 ]目标 ABI 列表cmake.version[ 3.22.1 ]随 SDK 安装的 CMake 版本cmdLineTools.version11.0若启用 Flutter 则为8.0命令行工具版本tools.version26.1.1旧版 SDK tools 版本platformTools.versionnixpkgs 中最新版本由 nixpkgs 的repo.json动态解析buildTools.version[ 34.0.0 ]若启用 Flutter 则为[ 35.0.0 33.0.2 30.0.3 ]Build Tools 版本列表emulator.enabletrue是否包含模拟器emulator.versionnixpkgs 中最新版本动态解析sources.enablefalse是否包含 Android 源码systemImages.enabletrue是否包含系统镜像ndk.enabletrue是否包含 NDKndk.version[ 26.1.10909125 ]Flutter 下为[ 28.2.13676358 ]NDK 版本列表googleAPIs.enabletrue是否使用 Google APIsgoogleTVAddOns.enabletrue是否使用 Google TV Add-Onsextras[ extras;google;gcm ]额外组件extraLicenses上表所列 7 个 license 的默认集合自动接受的额外许可证android-studio.enable/.packagefalse/pkgs.android-studio是否安装 Android Studio 及使用的包flutter.enable/.packagefalse/pkgs.flutter是否包含 Flutter 工具reactNative.enablefalse是否包含 React Native 工具默认值的底层来源需要特别说明platformTools.version与emulator.version的默认值并不是写死的字符串而是从 nixpkgs 的 androidenv 仓库 JSON 中动态读取的。源码实现如下src/modules/integrations/android.nixrepoJson builtins.fromJSON (builtins.readFile ${toString pkgs.path}/pkgs/development/mobile/androidenv/repo.json); availableVersions package: builtins.attrNames repoJson.packages.${package}; latestVersion package: lib.last (builtins.sort lib.lessThan (availableVersions package));这就是文档中platformTools.version和emulator.version默认使用 nixpkgs 中的最新版本这一说法的实现依据。因此这两个选项的可用版本完全取决于你所引用的 nixpkgs 快照——如果你尝试构建一个不存在的版本构建报错信息里会列出所有可用版本。环境变量与 Gradle 的底层联动开启模块后以下环境变量会被自动注入src/modules/integrations/android.nixANDROID_HOME指向组装好的 SDK 根目录ANDROID_NDK_ROOT指向ndk-bundlenixpkgs 来源或ndk/versionandroid-nixpkgs 来源GRADLE_OPTS-Dorg.gradle.project.android.aapt2FromMavenOverrideANDROID_HOME/build-tools/首个 buildTools 版本/aapt2强制 Gradle 使用 SDK 中打过补丁的 aapt2避免与从 Maven 拉取的版本产生不兼容启用 Flutter 时还会设置FLUTTER_ROOT与DART_ROOT。进入 shell 时还会把tools、platform-tools、cmdline-tools/latest/bin、emulator目录加入PATH并导出ANDROID_USER_HOME、ANDROID_AVD_HOME指向项目目录下的.android/确保 AVD 状态不污染全局用户目录。关于 unfree 包的重要前提Android SDK 包含大量 unfree 软件包如 Google Play Store 系统镜像、部分闭源组件因此必须在devenv.yaml中允许 unfree 包否则构建会直接失败nixpkgs: allow_unfree: true选择 SDK 版本nixpkgs androidenv 的滞后问题platforms.version、buildTools.version、ndk.version等选项所能选择的版本全部来自 nixpkgs 内置的androidenv包集合。由于 androidenv 的更新节奏落后于 Google 的官方发布一个刚发布的新版本例如platforms;android-36在 androidenv 中可能还不可用此时选择它会导致构建失败。注意这里说的不可用是相对于你当前锁定的 nixpkgs 版本而言的。当前仓库默认的platforms.version已经是[ 32 34 36 ]说明该 nixpkgs 快照已包含 API 36——但这并不改变 androidenv 整体滞后于 Google 官方发布的客观事实。切换到 android-nixpkgs获得每日更新的完整版本集要选取完整且最新的版本集合官方推荐引入android-nixpkgsinput。该项目基于 Google 的 SDK 仓库每日重新生成因此新平台、新 Build Tools 版本的可用性远超 nixpkgs androidenv。添加 input 的命令如下$ devenv inputs add android-nixpkgs github:tadfisher/android-nixpkgs --follows nixpkgs这条命令会修改项目根目录的devenv.yaml。从 CLI 实现看devenv inputs add是早期分发的命令之一会先定位到外层项目根再编辑其devenv.yaml避免在子目录中误建游离的配置文件见 devenv/src/main.rs。发布轨道release track的选择android-nixpkgs 的发布轨道由 input 的 URL ref 决定默认是stable。如需其他轨道把 URL 指向对应分支即可github:tadfisher/android-nixpkgs默认stablegithub:tadfisher/android-nixpkgs/betagithub:tadfisher/android-nixpkgs/previewgithub:tadfisher/android-nixpkgs/canary切换后的行为变化一旦android-nixpkgsinput 存在模块会自动把 SDK 来源切换为 android-nixpkgs。源码中的判定逻辑非常直接src/modules/integrations/android.nixandroid-nixpkgs inputs.android-nixpkgs or null; useAndroidNixpkgs android-nixpkgs ! null;切换后platforms.version、buildTools.version、ndk.version以及emulator.enable会被自动映射到 android-nixpkgs 的对应 SDK 包映射规则见 src/modules/integrations/android.nix版本号中的.会被转换为-例如35.0.0→build-tools-35-0-0、36→platforms-android-36ANDROID_HOME指向share/android-sdkNDK 目录布局变为ndk/version与 nixpkgs 来源的ndk-bundle不同系统镜像、源码、CMake、extras 不在自动映射范围内需要把这些组件直接加入 devenv 的顶层packages。组合示例同时使用两套配置以下配置展示了切换到 android-nixpkgs 后选择新版本并手工安装系统镜像的完整写法{ inputs, pkgs, ... }: { android { enable true; platforms.version [ 34 35 36 ]; buildTools.version [ 35.0.0 ]; }; packages [ (inputs.android-nixpkgs.sdk.${pkgs.system} (sdkPkgs: with sdkPkgs; [ system-images-android-36-google-apis-playstore-x86-64 ])) ]; }注意android-nixpkgs 目前支持x86_64-linux、x86_64-darwin与aarch64-darwin三个平台见 src/modules/integrations/android.nix 中android-nixpkgs.sdk.${pkgs.system}的调用方式实际可用平台以 android-nixpkgs 自身声明为准。模拟器绕过 Android Studio GUI用 CLI 创建 AVD由于 Nix 的不可变 store 路径与 Android Studio 对可变路径的要求存在冲突直接在 Android Studio 的 GUI 中创建模拟器可能无法正常工作。官方推荐的做法是先用命令行创建 AVD再在 Android Studio 中开发。创建 AVD使用avdmanager位于 cmdline-tools 中进入 devenv shell 后已在PATH中创建avdmanager create avd --force --name my-android-emulator-name --package system-images;android-32;google_apis_playstore;x86_64创建完成后即可用任意文本编辑器进行 Android 开发。官方文档记录的真实测试场景是先在外部用上述命令创建好模拟器然后在 Android Studio 自带的终端里运行一个 React Native 项目能够成功运行。需要注意AVD 的存放位置由ANDROID_AVD_HOME决定——模块在进入 shell 时已将其指向项目目录下的.android/avd/因此每个项目的模拟器状态是相互隔离的。React Native一行开启 RN 工具链android.reactNative.enable会额外启用 JavaScript 与 npm 工具链并把 JDK 固定为pkgs.jdk17与 reactnative.dev 的环境设置文档。该配置已通过 React Native starter 项目验证{ pkgs, ... }: { android { enable true; reactNative.enable true; }; }Flutter一行开启 Flutter 工具链android.flutter.enable会额外启用 Dart 语言支持、安装 Flutter 包并把 JDK 固定为pkgs.jdk17与 developer.android.com 的 JDK 版本建议。该配置已通过 Flutter starter 项目验证{ pkgs, ... }: { android { enable true; flutter.enable true; }; }Flutter 的自动路径同步任务开启 Flutter 后模块还会注册一个名为devenv:android:flutter:sync-properties的 tasksrc/modules/integrations/android.nix在每次进入 shellbefore [ devenv:enterShell ]之前自动运行负责更新android/local.properties与各级子目录中的同名文件写入sdk.dir$ANDROID_HOME、ndk.dir$ANDROID_NDK_ROOT、flutter.sdk$FLUTTER_ROOT更新ios/Flutter/Generated.xcconfig中的FLUTTER_ROOT更新ios/flutter_export_environment.sh中的FLUTTER_ROOT导出。这个 task 的存在意味着即使你手动改动了local.properties每次进入 devenv shell 时这些路径都会被重新纠正为当前环境值从机制上杜绝了换机器后 Flutter 找不到 SDK的经典问题。总结配置速查与常见问题场景需要做什么仅 Android 原生开发android.enable truedevenv.yaml中nixpkgs.allow_unfree true需要 Android Studio追加android.android-studio.enable true需要最新 SDK 版本devenv inputs add android-nixpkgs github:tadfisher/android-nixpkgs --follows nixpkgs并按需指定platforms.version等需要新版本系统镜像通过 android-nixpkgs 的sdk函数加入顶层packagesReact Nativeandroid.reactNative.enable trueFlutterandroid.flutter.enable true常见问题速查构建报版本不可用说明所选版本在当前 nixpkgs androidenv或 android-nixpkgs 轨道中不存在。查看报错信息列出的可用版本列表或切换到 android-nixpkgs 获取更新版本。构建报 unfree 包被拒绝检查devenv.yaml中是否已设置nixpkgs.allow_unfree true。Android Studio 中无法创建 AVD改用avdmanager create avd命令行方式创建再在 IDE 中连接使用。Gradle 报 aapt2 相关错误确认GRADLE_OPTS中aapt2FromMavenOverride指向的 SDK 路径存在且 build-tools 版本已安装。本文全部配置项均可在 src/modules/integrations/android.nix 中找到实现定义参考示例见 examples/android/devenv.nix原始文档见 docs/src/content/docs/integrations/android.md。赞分享开发工具CLI【免费下载链接】devenvFast, Declarative, Reproducible, and Composable Developer Environments using Nix项目地址https://gitcode.com/gh_mirrors/de/devenv点击查看免费下载相关推荐Nixpkgs Android 开发环境androidenv完全指南从 SDK 组合到模拟器与 Ant 构建Nixpkgs Android 开发环境androidenv完全指南从 SDK 组合到模拟器与 Ant 构建 本篇技术指南围绕 nixpkgs 仓库中 a包管理器操作系统devenv 0.2 版本解析可组合的开发环境、devenv search 搜索命令与本地覆盖机制devenv 0.2 版本解析可组合的开发环境、 devenv search 搜索命令与本地覆盖机制 导读devenv 是一款基于 Nix 构建的「快速、声开发工具CLI小米手环SDK Android版开发指南小米手环SDK Android版开发指南 本教程将指导您如何理解和使用 pangliang/miband sdk android 这一开源项目它提供了与早期版智能硬件物联网上一篇使用 WebdriverIO Browser Runner 测试 Svelte 组件配置、编写与源码原理详解下一篇如何轻松掌握LDOCE5词典工具新手必看的3个实用技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考