> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devinenterprise.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Android 模拟器支持

> 在 Devin 自有机器上运行的完整模拟器中构建和运行 Android 应用

Devin 可以直接在自己的机器上构建和运行 Android 应用——相当于具备了 Android 版的 [Computer Use](/zh/work-with-devin/computer-use) 和浏览器交互能力。Devin 可以打开应用、检查其行为、复现问题，并在应用实际运行的环境中验证更改。结合[视频录制](/zh/work-with-devin/testing-and-recordings)，Devin 还可以向你发送录制内容作为凭证。

<div id="what-you-can-do">
  ## 你可以做什么
</div>

启用 Android 模拟器支持后，Devin 可以覆盖完整的移动开发闭环：

<CardGroup cols={2}>
  <Card title="构建并冒烟测试" icon="hammer">
    Devin 会在模拟器上构建并运行你的应用，并在每次后逐一点击关键流程。你会获得一份可证明功能正常的视频记录——看过即可合并。
  </Card>

  <Card title="端到端移动测试" icon="mobile">
    在真实的 Android 运行栈上测试完整的用户流程——登录、页面导航、表单提交、结账——而不是 mock。Devin 会按步骤执行整个流程，并标记任何出错的地方。
  </Card>

  <Card title="UI 验证" icon="eye">
    验证不同屏幕尺寸和 API 级别下的布局、主题和响应式表现。Devin 会在关键节点截图，并标记元素重叠或文本被截断等视觉问题。
  </Card>

  <Card title="调试崩溃和 ANR" icon="bug">
    在模拟器上复现问题、捕获 `logcat` 输出、检查行为、定位根因并推送修复——全部在同一个会话中完成。
  </Card>

  <Card title="跨平台验证" icon="arrows-left-right">
    正在使用 React Native、Flutter 或 Kotlin Multiplatform 构建？Devin 可以在同一个会话中，同时测试 Android 端以及你的 Web 或桌面构建。
  </Card>

  <Card title="执行插桩测试" icon="flask-vial">
    在模拟器上运行 Espresso 或 UI Automator 测试套件，并获取回传结果，无需单独的 CI 设备农场或物理设备。
  </Card>

  <Card title="多配置测试" icon="layer-group">
    通过配置多个 AVD，验证你的应用在不同 API 级别或设备 Profile 下的表现。这有助于在兼容性问题影响用户前提前发现它们。
  </Card>
</CardGroup>

<div id="how-it-works">
  ## 工作原理
</div>

Android 模拟器支持基于与 Devin 其余环境相同的[声明式配置](/zh/onboard-devin/environment/blueprints)系统。你只需将 Android SDK 和模拟器添加到蓝图中，Devin 的快照就会构建一个预装好所有必需内容的 VM。每个会话都会从该快照启动，模拟器开箱即用。

在会话期间，Devin 会通过两种方式与模拟器交互：

| 方法                    | 作用                        | 何时使用                 |
| --------------------- | ------------------------- | -------------------- |
| **`adb`** (命令行)       | 安装 APK、运行测试、抓取日志、截取屏幕截图   | 自动化构建、插桩测试、logcat 调试 |
| **Computer Use** (桌面) | 通过可视界面点击、滑动、输入，并在模拟器屏幕上导航 | 端到端 UI 测试、视觉验证、视频录制  |

模拟器窗口运行在 Devin 的桌面上，因此你可以通过 webapp 中的 **Desktop** 选项卡实时观看 Devin 与你的应用交互。

<div id="setting-up-the-emulator">
  ## 设置 Android 模拟器
</div>

<Tabs>
  <Tab title="让 Devin 处理（推荐）">
    这是最简单的开始方式。Devin 会分析你的 Android 项目，安装所需的 SDK 组件，并为你配置模拟器。

    <Steps>
      <Step title="启动 Devin 会话">
        打开一个新会话，请 Devin 设置 Android 模拟器。例如：*"为这个 repo 设置一个 Android 模拟器。"*
      </Step>

      <Step title="审核并批准">
        Devin 会提供一个包含 Android SDK、构建工具和模拟器配置的蓝图。查看时间线中的建议卡片，然后点击 **Approve**。
      </Step>

      <Step title="验证">
        构建完成后，启动一个新会话。请 Devin 在模拟器上构建并运行你的应用，确认一切正常。
      </Step>
    </Steps>
  </Tab>

  <Tab title="手动设置蓝图">
    如果你清楚自己需要哪些 SDK 组件和模拟器配置，也可以自行编写蓝图。

    <Steps>
      <Step title="前往环境配置">
        前往 **Settings > Environment > Blueprints**，然后选择你的 Android 代码仓库。
      </Step>

      <Step title="编写你的蓝图">
        将 Android SDK、平台工具、模拟器和系统镜像添加到 `initialize`。将依赖安装步骤添加到 `maintenance`。可参阅下方的[蓝图示例](#blueprint-examples)，获取可直接复制粘贴的模板。
      </Step>

      <Step title="保存并构建">
        点击 **Save**。构建会自动开始 (Android 通常需要 5–15 分钟，因为需要下载 SDK) 。你可以在 **Settings > Environment > Snapshots** 中查看进度。
      </Step>

      <Step title="验证">
        当构建显示 **Success** 后，启动一个新会话。请 Devin 启动模拟器并构建你的应用，以完成验证。
      </Step>
    </Steps>
  </Tab>
</Tabs>

<div id="what-gets-installed">
  ### 会安装哪些内容
</div>

典型的 Android 模拟器支持蓝图会安装：

| 组件                     | 目的                                 |
| ---------------------- | ---------------------------------- |
| Android SDK 命令行工具      | 核心 SDK 管理工具 (`sdkmanager`)         |
| 平台工具                   | 用于设备通信的 `adb`、`fastboot`           |
| 构建工具                   | 用于构建 APK 的 `aapt2`、`d8`、`zipalign` |
| Android 平台 (例如 API 34) | 应用的目标 API 级别                       |
| 模拟器 + 系统镜像             | 虚拟设备本身                             |

<Tip>
  在 Devin 的环境中，使用 `x86_64` 系统镜像可获得最佳性能。ARM 映像也能使用，但在模拟运行时会明显更慢。
</Tip>

<div id="using-the-emulator">
  ## 使用模拟器
</div>

<div id="on-demand-testing">
  ### 按需测试
</div>

在会话期间的任何时候，你都可以让 Devin 构建并运行你的应用——无需特殊语法，直接用自然语言即可：

* *“在 Android 模拟器上构建并运行这个应用”*
* *“在模拟器上测试登录流程，并把录屏发给我”*
* *“在模拟器上打开设置界面，并确认新的开关已显示”*
* *“在模拟器上运行 Espresso 测试，并向我展示结果”*

Devin 会启动模拟器 (如果尚未运行) 、构建并运行你的应用，并与其交互——使用 `adb` 执行程序化操作，并使用 Computer Use 进行可视化交互。

<div id="integration-with-testing-recordings">
  ### 与测试和录制的集成
</div>

Android 模拟器支持可直接接入 Devin 的[测试与录制](/zh/work-with-devin/testing-and-recordings)工作流程。创建拉取请求后：

1. Devin 会提供**测试应用**选项——点击按钮或直接提出要求
2. Devin 会在模拟器中构建并运行应用，并执行有针对性的测试计划
3. 模拟器屏幕会被录制成带注释的**视频录制**
4. 录制内容会发送给你，方便你查看测试过程并放心合并

其工作方式与 Web 应用测试相同——唯一的区别是，Devin 交互的是模拟器窗口，而不是 Chrome。

<Tip>
  创建一个[技能](/zh/product-guides/skills)，明确告诉 Devin 如何构建、启动和测试你的 Android 应用。这样可以节省重复会话中的设置时间，并确保测试结果保持一致。例如，可以包含 Gradle 构建命令、要启动的 activity，以及需要验证的流程。
</Tip>

<div id="skill-suggestions">
  ### 技能建议
</div>

在测试你的 Android 应用后，Devin 会记下它学到的内容——如何启动模拟器、需要运行哪些 Gradle 任务、如何进入待测功能——并通过拉取请求建议创建或更新一个[技能](/zh/product-guides/skills)。你可以直接按原样合并，也可以稍作修改，以完善这些指示。

随着时间推移，这意味着 Devin 会越来越擅长测试你的 Android 项目。每个会话中学到的内容都会在上一次的基础上不断积累——因此，当 Devin 第二次测试你的应用时，它已经知道如何构建应用、该启动哪个 Activity，以及哪些流程最关键。

你也可以随时提示 Devin 执行此操作 (例如：*"为如何构建和测试这个 Android 应用创建一个技能"*) 。完整详情请参阅[技能指南](/zh/product-guides/skills)。

<div id="interacting-via-the-desktop">
  ### 通过桌面进行交互
</div>

Android 模拟器会作为 Devin Linux 桌面上的一个窗口运行。这意味着：

* **Devin 可以通过 Computer Use 与其交互** — 点击按钮、滑动、输入文本，以及在不同界面之间导航
* **你可以通过 Devin webapp 中的 **Desktop** 选项卡实时观看**
* **录制内容会捕获模拟器屏幕**，以及 Devin 桌面上可见的任何其他内容

如需了解桌面交互的工作方式，请参阅 [Computer Use](/zh/work-with-devin/computer-use)。

<div id="using-adb">
  ### 使用 `adb`
</div>

Devin 还可以通过 `adb` 以编程方式与模拟器交互，这在以下场景中非常有用：

* **安装 APK** — `adb install app-debug.apk`
* **运行插桩测试** — `adb shell am instrument -w com.example.test/androidx.test.runner.AndroidJUnitRunner`
* **抓取日志** — 使用 `adb logcat` 调试崩溃或异常行为
* **截图** — `adb exec-out screencap -p > screenshot.png`
* **模拟用户输入** — `adb shell input tap 500 800`，用于脚本化交互

Devin 会根据任务在 `adb` 和 Computer Use 之间进行选择：`adb` 适合追求速度和自动化的场景，Computer Use 适合进行视觉验证和处理复杂的 UI 流程。

<div id="blueprint-examples">
  ## 蓝图示例
</div>

适用于常见 Android 配置的可直接复制粘贴蓝图。每个模板都可单独使用——将其粘贴到你的蓝图编辑器中并保存即可。

<AccordionGroup>
  <Accordion title="原生 Android（Kotlin/Java + Gradle）">
    ```yaml theme={null}
    initialize:
      - name: "Install Android SDK"
        run: |
          export ANDROID_HOME="$HOME/android-sdk"
          mkdir -p "$ANDROID_HOME/cmdline-tools"
          cd "$ANDROID_HOME/cmdline-tools"
          curl -fsSL https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -o tools.zip
          unzip -q tools.zip -d latest-tmp
          mv latest-tmp/cmdline-tools "$ANDROID_HOME/cmdline-tools/latest"
          rm -rf tools.zip latest-tmp
          echo "export ANDROID_HOME=$ANDROID_HOME" >> ~/.bashrc
          echo 'export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH' >> ~/.bashrc
          export PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH"
          yes | sdkmanager --licenses > /dev/null 2>&1
          sdkmanager "platform-tools" "build-tools;34.0.0" "platforms;android-34" "emulator" "system-images;android-34;google_apis;x86_64"
          echo "no" | avdmanager create avd -n devin -k "system-images;android-34;google_apis;x86_64" --device "pixel_6"

    maintenance: |
      ./gradlew assembleDebug

    knowledge:
      - name: build
        contents: ./gradlew assembleDebug
      - name: test
        contents: ./gradlew test
      - name: lint
        contents: ./gradlew lint
      - name: emulator
        contents: |
          Start the emulator: emulator -avd devin -no-window -no-audio -gpu swiftshader_indirect &
          Wait for boot: adb wait-for-device && adb shell getprop sys.boot_completed
          Install APK: adb install app/build/outputs/apk/debug/app-debug.apk
    ```
  </Accordion>

  <Accordion title="React Native">
    ```yaml theme={null}
    initialize:
      - name: "Install Node.js"
        run: |
          nvm install 20
          nvm use 20

      - name: "Install Android SDK"
        run: |
          export ANDROID_HOME="$HOME/android-sdk"
          mkdir -p "$ANDROID_HOME/cmdline-tools"
          cd "$ANDROID_HOME/cmdline-tools"
          curl -fsSL https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -o tools.zip
          unzip -q tools.zip -d latest-tmp
          mv latest-tmp/cmdline-tools "$ANDROID_HOME/cmdline-tools/latest"
          rm -rf tools.zip latest-tmp
          echo "export ANDROID_HOME=$ANDROID_HOME" >> ~/.bashrc
          echo 'export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH' >> ~/.bashrc
          export PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH"
          yes | sdkmanager --licenses > /dev/null 2>&1
          sdkmanager "platform-tools" "build-tools;34.0.0" "platforms;android-34" "emulator" "system-images;android-34;google_apis;x86_64"
          echo "no" | avdmanager create avd -n devin -k "system-images;android-34;google_apis;x86_64" --device "pixel_6"

    maintenance: |
      npm install
      cd android && ./gradlew assembleDebug

    knowledge:
      - name: build
        contents: cd android && ./gradlew assembleDebug
      - name: test
        contents: npm test
      - name: lint
        contents: npm run lint
      - name: emulator
        contents: |
          Start the emulator: emulator -avd devin -no-window -no-audio -gpu swiftshader_indirect &
          Wait for boot: adb wait-for-device && adb shell getprop sys.boot_completed
          Run on device: npx react-native run-android
    ```
  </Accordion>

  <Accordion title="Flutter">
    ```yaml theme={null}
    initialize:
      - name: "Install Flutter"
        run: |
          cd "$HOME"
          git clone https://github.com/flutter/flutter.git -b stable --depth 1
          echo 'export PATH=$HOME/flutter/bin:$PATH' >> ~/.bashrc
          export PATH="$HOME/flutter/bin:$PATH"
          flutter precache --android
          yes | flutter doctor --android-licenses > /dev/null 2>&1

      - name: "Install Android SDK"
        run: |
          export ANDROID_HOME="$HOME/android-sdk"
          mkdir -p "$ANDROID_HOME/cmdline-tools"
          cd "$ANDROID_HOME/cmdline-tools"
          curl -fsSL https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -o tools.zip
          unzip -q tools.zip -d latest-tmp
          mv latest-tmp/cmdline-tools "$ANDROID_HOME/cmdline-tools/latest"
          rm -rf tools.zip latest-tmp
          echo "export ANDROID_HOME=$ANDROID_HOME" >> ~/.bashrc
          echo 'export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH' >> ~/.bashrc
          export PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH"
          yes | sdkmanager --licenses > /dev/null 2>&1
          sdkmanager "platform-tools" "build-tools;34.0.0" "platforms;android-34" "emulator" "system-images;android-34;google_apis;x86_64"
          echo "no" | avdmanager create avd -n devin -k "system-images;android-34;google_apis;x86_64" --device "pixel_6"

    maintenance: |
      flutter pub get

    knowledge:
      - name: build
        contents: flutter build apk --debug
      - name: test
        contents: flutter test
      - name: lint
        contents: flutter analyze
      - name: emulator
        contents: |
          Start the emulator: emulator -avd devin -no-window -no-audio -gpu swiftshader_indirect &
          Wait for boot: adb wait-for-device && adb shell getprop sys.boot_completed
          Run on device: flutter run -d emulator-5554
    ```
  </Accordion>

  <Accordion title="Kotlin Multiplatform">
    ```yaml theme={null}
    initialize:
      - name: "Install Android SDK"
        run: |
          export ANDROID_HOME="$HOME/android-sdk"
          mkdir -p "$ANDROID_HOME/cmdline-tools"
          cd "$ANDROID_HOME/cmdline-tools"
          curl -fsSL https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -o tools.zip
          unzip -q tools.zip -d latest-tmp
          mv latest-tmp/cmdline-tools "$ANDROID_HOME/cmdline-tools/latest"
          rm -rf tools.zip latest-tmp
          echo "export ANDROID_HOME=$ANDROID_HOME" >> ~/.bashrc
          echo 'export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH' >> ~/.bashrc
          export PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH"
          yes | sdkmanager --licenses > /dev/null 2>&1
          sdkmanager "platform-tools" "build-tools;34.0.0" "platforms;android-34" "emulator" "system-images;android-34;google_apis;x86_64"
          echo "no" | avdmanager create avd -n devin -k "system-images;android-34;google_apis;x86_64" --device "pixel_6"

    maintenance: |
      ./gradlew :androidApp:assembleDebug

    knowledge:
      - name: build
        contents: ./gradlew :androidApp:assembleDebug
      - name: test
        contents: ./gradlew allTests
      - name: lint
        contents: ./gradlew detekt
      - name: emulator
        contents: |
          Start the emulator: emulator -avd devin -no-window -no-audio -gpu swiftshader_indirect &
          Wait for boot: adb wait-for-device && adb shell getprop sys.boot_completed
          Install APK: adb install androidApp/build/outputs/apk/debug/androidApp-debug.apk
    ```
  </Accordion>
</AccordionGroup>

<div id="troubleshooting">
  ## 故障排查
</div>

<div id="emulator-wont-start">
  ### 模拟器无法启动
</div>

**常见原因：** VM 中无法使用 KVM、内存不足，或缺少系统镜像。

**修复：** 当 Devin 检测到模拟器需要硬件加速时，它可以尝试自动配置 KVM——在大多数情况下，无需手动干预即可解决该问题。如果在 Devin 尝试后 KVM 仍不可用，模拟器可以回退到软件渲染模式——在模拟器启动命令中添加 `-no-accel`，但性能会有所下降。另请检查你的蓝图是否安装了模拟器以及兼容的 `x86_64` 系统镜像。

<div id="build-fails-with-sdk-errors">
  ### 构建因 SDK 错误失败
</div>

**常见原因：** 缺少 SDK 组件、`ANDROID_HOME` 路径配置错误，或 Gradle 找不到正确版本的构建工具。

**修复：** 确认你的蓝图中已正确设置 `ANDROID_HOME`，并确保 `sdkmanager` 安装了项目所需的平台版本和构建工具版本。检查项目的 `build.gradle` 中的 `compileSdk`、`targetSdk` 和 `buildToolsVersion`，并在蓝图中保持一致。

<div id="emulator-is-slow">
  ### 模拟器运行缓慢
</div>

Android 模拟器运行在 Devin 的 VM 中，因此其性能取决于系统镜像和渲染模式。

**提示：**

* 使用 `x86_64` 系统镜像 (不要使用 ARM) ，以启用硬件加速模拟
* 使用 `-gpu swiftshader_indirect` 进行无需 GPU 直通的软件渲染
* 当 Devin 不需要可视界面时，使用 `-no-window -no-audio` (例如，通过 `adb` 运行插桩测试时)
* 如果不太看重画面保真度，可考虑使用较低分辨率的设备 Profile

<div id="devin-cant-interact-with-the-emulator-screen">
  ### Devin 无法与模拟器屏幕交互
</div>

\*\*常见原因：\*\*未启用桌面模式、模拟器窗口不可见，或模拟器正以无头模式运行。

\*\*修复：\*\*请确保已在你的组织设置中启用[桌面模式](/zh/work-with-devin/computer-use#how-to-enable-it)。如果你需要 Devin 通过可视界面与模拟器交互，请在启动时*不要*使用 `-no-window` 标志，这样模拟器 GUI 就会显示在 Devin 的桌面上。在让 Devin 与其交互之前，请先确认模拟器已完全启动 (`adb shell getprop sys.boot_completed` 应返回 `1`) 。
