# AndroidTest **Repository Path**: zypdominate/android-test ## Basic Information - **Project Name**: AndroidTest - **Description**: Android Snippet APK,基于 Mobly 自动化测试框架,通过 ADB 以 @Rpc 方式暴露 音频、Wi-Fi、蓝牙、电话等系统 API,并实现让 Python 调用。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 2 - **Created**: 2026-04-01 - **Last Updated**: 2026-11-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, Android, mobly ## README # AndroidTest 基于 [Mobly Snippet Lib](https://github.com/google/mobly-snippet-lib)(设备端 Android 库)与 [Mobly](https://github.com/google/mobly)(主机端 Python 测试框架)的 Android 设备端测试桩工程:在真机/模拟器上安装本应用后,由主机端 Python(Mobly + pytest)通过 JSON-RPC 调用各 Snippet 中的 `@Rpc` 方法,用于自动化测试网络、蓝牙、电话、媒体等系统能力。 ## 工程结构 | 路径 | 说明 | |------|------| | `app/` | Android 应用模块,产出可安装的 Snippet APK(`androidtest-debug.apk`) | | `app/src/main/java/com/androidmobly/snippets/` | 各 `*Snippet.java` 实现 | | `tests/` | 主机端 pytest 用例与 `conftest.py`(加载 snippet `androidtest`) | ## 环境要求 - **Android 构建**:JDK 17(项目使用 Java 17,AGP 8.5.2 也建议使用 JDK 17)、Android SDK Platform 34 - **设备**:`minSdk` 26,已开启 USB 调试并授权本机 - **主机端测试**:Python 3,需安装 Mobly 与 pytest,例如: ```bash pip install mobly pytest ``` ## 标准使用流程 每次开始使用或切换分支后,按以下顺序操作。所有 Gradle 命令都应在项目根目录 `AndroidTest` 执行。 ### 1. 检查环境 ```powershell java -version adb version adb devices ``` 确认 Java 为 17,设备状态为 `device`,而不是 `unauthorized` 或 `offline`。 ### 2. 同步项目 首次打开项目、修改 `build.gradle` / `settings.gradle`、切换分支或升级依赖后,在 Android Studio 中执行: `File` → `Sync Project with Gradle Files` 首次同步可能下载 Gradle 8.7、Android Gradle Plugin、Android SDK 组件和 Maven 依赖,这是正常现象。 ### 3. 构建 APK 推荐使用项目自带的 Gradle Wrapper,避免使用系统中其他版本的 Gradle: 在项目根目录执行: ```bash # Windows .\gradlew.bat :app:assembleDebug # 只有遇到增量编译或缓存异常时才执行 clean .\gradlew.bat clean :app:assembleDebug # Linux / macOS ./gradlew :app:assembleDebug ``` 生成的调试 APK 位于: `app/build/outputs/apk/debug/androidtest-debug.apk` 安装到设备: ```bash adb install -r app/build/outputs/apk/debug/androidtest-debug.apk ``` 应用包名:`com.androidmobly.snippets`。Snippet 在运行时由 Mobly 按包名加载,具体配置以 `tests/conftest.py` 为准。 ### 4. Android Studio 中构建 首次同步完成后,可以使用 `Build` → `Make Project`,或运行 `Assemble 'app'` 配置。 如果运行配置报错 `unitTestClasses` 或 `androidTestClasses` 不存在: 1. 打开 `Run` → `Edit Configurations...`。 2. 删除旧的 Gradle/Assemble 配置。 3. 再次执行 `File` → `Sync Project with Gradle Files`。 4. 重新创建或选择 `Assemble 'app'` 配置。 不要手动添加旧任务 `:app:unitTestClasses`、`:app:androidTestClasses`;当前 AGP 使用带构建变体的任务,例如 `:app:assembleDebug`、`:app:testDebugUnitTest` 和 `:app:assembleDebugAndroidTest`。 ### 5. 修改 Java 或 Manifest 后 修改源码后,先执行: ```powershell .\gradlew.bat :app:compileDebugJavaWithJavac ``` 确认无错误后再构建和安装 APK。Manifest 中的 `package` 应与 `app/build.gradle` 的 `namespace` 分开配置;同一个权限不要重复声明。 ## 运行主机端测试 在连接至少一台设备的前提下,于 `tests` 目录执行: ```bash cd tests pytest -q ``` `conftest.py` 使用 `android_device.create('*')` 绑定第一台可用设备;若需固定序列号,可改为 `android_device.create(['YOUR_SERIAL'])`。 未连接设备时,用例会跳过(“没有找到可用的 Android 设备”)。 ## 已注册的 Snippet 类 在 `AndroidManifest.xml` 的 `mobly-snippets` 元数据中注册,主要包括: - **账户 / 联系人**:`AccountSnippet`、`ContactSnippet` - **音频 / 媒体 / 通知 / 日志**:`AudioSnippet`、`MediaSnippet`、`NotificationSnippet`、`LogSnippet` - **电话 / 短信**:`TelephonySnippet`、`SmsSnippet` - **网络 / 文件 / 存储 / 工具**:`NetworkingSnippet`、`FileSnippet`、`StorageSnippet`、`UtilitySnippet` - **Wi‑Fi**:`WifiManagerSnippet`、`WifiAwareManagerSnippet` - **蓝牙**:`BluetoothAdapterSnippet`、`BluetoothGattClientSnippet`、`BluetoothGattServerSnippet`、`BluetoothLeAdvertiserSnippet`、`BluetoothLeScannerSnippet` 及 A2DP / HFP / HA / LE Audio 等 profile Snippet 新增 Snippet 时需在上述 meta-data 中追加完整类名,并重新编译安装 APK。 ## 权限说明 `AndroidManifest.xml` 中声明了电话、短信、蓝牙、位置、存储等大量权限。**危险权限**在 Android 6+ 上通常需要用户在系统设置中授予,或通过 `adb` 调试授予,例如: ```bash adb shell pm grant com.androidmobly.snippets android.permission.READ_PHONE_STATE ``` 部分权限为签名/特权级别,仅在特定系统镜像或调试环境下可用;若 RPC 抛出 `SecurityException`,Mobly 会将其作为错误返回,测试侧可 `skip` 或先处理授权。 ## 依赖版本 | 组件 | 版本(见 `app/build.gradle`) | |------|-------------------------------| | Android Gradle Plugin | 8.5.2 | | mobly-snippet-lib | 1.4.0 | | compileSdk / targetSdk | 34 | ## 参考链接 ### 本项目原理文档 - [Mobly 测试体系](./docs/Mobly%20测试体系.md) — Host/Device 分工、JSON-RPC 通信与 Snippet 生命周期 - [Instrumentation 原理](./docs/Instrumentation%20原理.md) — `am instrument`、Manifest、Runner、进程与 ClassLoader - [Android 自动化框架原理对比](./docs/Android%20自动化框架原理对比.md) — Mobly、UiAutomator、Appium、Espresso 横向对比 - [Mobly](https://github.com/google/mobly) - [mobly-bundled-snippets](https://github.com/google/mobly-bundled-snippets) - [Android 开发者文档](https://developer.android.com/) - [Mobly 测试框架官方文档](https://source.android.com/docs/core/tests/mobly) - [Mobly 测试框架(中文)| Android Open Source Project](https://source.android.google.cn/docs/core/tests/mobly?hl=zh-cn)