跳过 Android Studio 的繁琐步骤。打开 LingCode 的设备管理器,创建 AVD、启动它并在上面运行 Gradle 项目 — 与你的 iOS 模拟器同处一个窗口。
Android 模拟器由两个部分组成。系统镜像是一个完整的可启动 Android 操作系统 — 包含内核、框架以及特定 API 级别(如 android-34)和特定 CPU 架构(Apple Silicon 为 arm64-v8a,Intel 为 x86_64)所对应的 API 集合。设备配置文件是一个硬件模板,定义了屏幕尺寸、DPI、内存大小,以及 Pixel 7 所上报的摄像头和传感器能力。AVD("Android 虚拟设备")是你给一个系统镜像与设备配置文件的特定组合所起的名字,另加一个可写磁盘,用于记录你安装了什么。
管理这些内容并不需要 Android Studio。Apple 提供了 Simulator.app 和 xcrun simctl;Google 提供了 emulator、avdmanager 和 sdkmanager,这些工具单独使用同样运行良好。LingCode 的设备管理器同时封装了两者,让 iOS 模拟器和 Android AVD 出现在同一列表中,共享相同的启动 / 停止 / 删除操作,以及工具栏中统一的运行目标选择器。
本教程将带你从"刚刚安装好 LingCode"走到"模拟器正在启动,Gradle 应用正在其上运行"的状态。内容涵盖 SDK 前提条件、创建 AVD、启动模拟器、将其选为运行目标,以及当设备管理器的 Android 区块为空(即便 SDK 已安装)时的排查方法。
brew install --cask android-commandlinetools,然后执行 sdkmanager "platform-tools" "emulator" "system-images;android-34;google_apis;arm64-v8a"。也可以安装一次 Android Studio 来获取其捆绑的 SDK — LingCode 会自动从 ~/Library/Android/sdk 识别它。
在 LingCode 的菜单栏中,选择 Mobile → Device Manager…。一个面板会从底部弹出,包含四个区块:物理设备 (iOS)、模拟器 (iOS)、Android 模拟器 (AVD) 和 物理设备 (Android)。
查看面板顶部。如果出现一条橙色横幅提示"Android SDK 未检测到",说明 LingCode 找不到 SDK — 原因可能是 ANDROID_HOME/ANDROID_SDK_ROOT 未设置且默认的 ~/Library/Android/sdk 路径为空,或者 SDK 目录中缺少必要的二进制文件(adb、emulator)。横幅中的列表会告诉你具体哪项检查失败;安装缺少的内容后点击 Re-check。
如果没有横幅出现,且 Android 模拟器区块显示"No AVDs configured",说明 SDK 已正确连接,可以开始创建 AVD 了。
ANDROID_HOME、ANDROID_SDK_ROOT、~/Library/Android/sdk,最后是 ~/Android/sdk。如果你已经安装了 Android Studio,通常直接使用默认的 ~/Library/Android/sdk 即可 — 除非你同时管理多个 SDK,否则无需设置环境变量。
在设备管理器面板右上角,点击 + 图标,选择 New Android Emulator…。一个小向导会打开,包含三个字段:
Pixel_7_API_34)。不能有空格,使用下划线或短横线;emulator -avd <name> 命令将名称视为单个标记。sdkmanager --list_installed。如果下拉列表为空,请在终端安装一个:sdkmanager "system-images;android-34;google_apis;arm64-v8a"。变体选择很重要:google_apis 包含 Play 服务存根(大多数应用需要);default 仅包含 AOSP;google_apis_playstore 包含真实的 Play 商店(如果你的应用需要内购或 Maps,请选这个)。avdmanager list device 的设备配置文件。LingCode 默认选择第一个 Pixel 配置,因为 AOSP 启动器以此为目标。选择平板配置文件没问题;选择手表或电视配置文件也能启动,但行为不像手机。点击 创建。LingCode 在后台执行 avdmanager create avd -n <name> -k <system-image> -d <device> --force,并向"是否要创建自定义硬件配置文件?"的提示输入 no。面板关闭后,你的新 AVD 会出现在设备管理器列表中。
点击 AVD 行旁边的 Start。LingCode 将 emulator @<name> 作为独立后台进程启动 — stdout 和 stderr 被定向到 /dev/null,因为日志过多的模拟器会因管道满而阻塞。模拟器窗口出现在你的桌面上,开始启动 Android。
首次启动较慢 — 在 Apple Silicon 上需要约 30 秒,在 Intel 上可能需要几分钟 — 因为模拟器需要初始化全新的用户数据镜像。之后的启动会复用快照,只需几秒。一旦 adb devices 检测到模拟器上线,设备管理器中的 AVD 行就会切换为 ● 运行中;LingCode 每隔几秒轮询一次以捕获该状态。
emulator -accel-check 报告问题,请先解决;LingCode 无法绕过缺失的加速器。
设备管理器负责生命周期管理 — 创建 / 启动 / 停止 / 删除。AVD 运行后,通过顶部工具栏的运行目标选择器选择它作为构建目标(与选择 iOS 模拟器或 My Mac 的操作相同)。打开选择器,你会看到一个新的"Android Emulators"区块,列出你正在运行的 AVD(显示为 <name> (API XX)),以及一个"Android Offline AVDs"区块,列出已创建但未启动的 AVD — 选择离线 AVD 并点击运行,会自动先启动它。
选择你的 AVD 后,工具栏会在运行按钮旁显示 AVD 名称,LingCode 便知道该项目的"运行"意味着:为 Android 构建、安装到此模拟器、启动 launcher Activity。
打开一个 Android 项目(任何包含 settings.gradle.kts 或 settings.gradle 且有 :app 模块的文件夹)。LingCode 的项目类型检测器会将其归类为 gradleAndroid,这正是让运行操作走 Android 协调路径而非 xcodebuild 的关键。
点击运行按钮(或按 ⌘R)。LingCode 执行 ./gradlew :app:assembleDebug,将构建日志流式输出到运行控制台,定位生成的 APK,从合并后的 Android 清单中解析 applicationId 和 launcher Activity,使用 adb install -r 安装 APK,然后通过 adb shell am start -n <applicationId>/<launcher> 启动它。应用出现在模拟器上。
运行控制台保持打开,显示每个阶段的状态。出错时,失败的那行会告诉你是哪个阶段:Gradle 错误直接来自编译器;安装错误来自 adb(最常见的是签名不匹配 — 在 build.gradle.kts 中更新版本号,或卸载旧版本);启动错误来自 am start(通常是清单中的 Activity 名称有误)。
打开底部面板,切换到运行控制台。以 AVD 作为运行目标时,LingCode 会自动附加 adb logcat 并过滤到你应用的 PID — 与 iOS 的"控制台输出"面板思路相同,但带有 Android 的日志级别前缀(D/、I/、W/、E/)。应用崩溃时,堆栈跟踪会在这里出现。
这也是调试的正确入口 — LingCode 的 JDWP 转发器通过同一个模拟器连接路由调试会话,因此在编辑器的 .kt 文件中设置断点与在 Android Studio 中调试 Kotlin/Java 的方式完全相同。
"No AVDs configured",但我刚刚创建了一个。在设备管理器标题栏点击刷新。AVD 列表来自 emulator -list-avds;如果 LingCode 解析出的路径上没有 emulator 二进制文件,返回结果为空。重新检查工具链横幅。
AVD 无法启动。在终端运行 emulator @<name> -verbose — 详细输出会揭示失败原因是加速器问题、系统镜像文件缺失,还是损坏的快照。损坏的快照可通过删除修复(下次启动时加 emulator @<name> -wipe-data,或删除 AVD 后重新创建)。
在 Android 项目上点击运行按钮没有反应。工具栏目标选择器必须选中一个 Android 目标。如果选中的是"My Mac"或 iOS 模拟器,LingCode 会尝试为该目标构建,并以目标不匹配错误告终。
我想使用不同的 SDK 位置。在 shell 初始化文件中设置 ANDROID_HOME(如 ~/.zshrc),然后重启 LingCode。工具链检测器在每次 refresh() 时读取它,但环境变量只传递给继承它们的进程 — 重启是最简洁的重置方式。