./gradlew connectedCheck 是首选命令,因其是AGP预定义聚合任务,自动完成构建主APK与测试APK、安装、运行测试及生成报告全流程。

直接运行 Android 设备上的测试(即仪器化测试),核心命令是 ./gradlew connectedCheck,但前提是设备已连接、调试已启用、测试代码和依赖配置正确。其他看似相似的命令(比如 test 或 assembleAndroidTest)不会真正触发设备执行。
为什么 connectedCheck 是首选命令
这个任务是 AGP(Android Gradle Plugin)预定义的聚合任务,它自动串联了完整流程:构建被测 App(assembleDebug)、构建测试 APK(assembleAndroidTest)、安装两者到已连接设备、运行所有 androidTest 中的测试用例、收集结果并生成报告。
常见误区:
-
./gradlew test只跑本地单元测试(JVM 上),完全不碰设备 -
./gradlew androidTest仅构建并安装测试 APK,但不自动运行——你得手动用adb shell am instrument -
./gradlew connectedAndroidTest是connectedCheck的子任务,能运行测试,但跳过了对被测 APK 是否存在的校验,容易在 clean 项目后失败
androidTest 目录和 androidTestImplementation 必须匹配
AGP 严格按源集(SourceSet)识别仪器化测试代码。默认路径是 src/androidTest/java/,且必须使用 androidTestImplementation 声明依赖(如 androidx.test.ext:junit:1.1.5),否则编译会通过,但运行时报 NoClassDefFoundError 或 ClassNotFoundException。
关键检查点:
- 测试类必须带
@RunWith(AndroidJUnit4.class)(JUnit4)或@RunWith(AndroidJUnitRunner.class)(JUnit5 需额外配置) -
defaultConfig中必须声明testInstrumentationRunner,推荐用"androidx.test.runner.AndroidJUnitRunner" - 如果用了自定义
Application类,测试中需确保它没被意外替换或初始化失败(常见于ContentProvider初始化异常)
设备连不上?先确认这三件事
最常卡在这一步:命令执行后停住、报 No connected devices 或 INSTALL_FAILED_TEST_ONLY。不是 Gradle 问题,而是环境链断了。
- 运行
adb devices,输出里必须有device状态(不是unauthorized或空)。若为unauthorized,去手机弹窗点“允许 USB 调试” - 确保设备开启了“USB 调试”和“USB 安装”(部分厂商如小米、华为需额外打开“MIUI 优化”或“开发者选项”里的开关)
- 避免多设备混连:如果同时插了模拟器和真机,
connectedCheck默认选第一个,可用adb -s <serial> shell getprop ro.build.version.release</serial>确认目标设备;也可用ANDROID_SERIAL=xxx ./gradlew connectedCheck指定
测试跑完但没生成报告?检查 resultsDir 和权限
默认结果存于 build/androidTest-results/connected/,但 AGP 8.0+ 开始,报告生成依赖 testOptions 中的配置项是否显式启用。若目录为空,不是没跑,而是结果没写入。
在 android { testOptions { ... } } 块中加一句:
testOptions {
unitTests.all {
testLogging.events = ["passed", "skipped", "failed", "standardOut", "standardError"]
}
// 确保仪器化测试结果被采集
execution 'ANDROIDX_TEST_ORCHESTRATOR' // 可选,提升稳定性
}
另外注意:某些 CI 环境(如 GitHub Actions)中,build/ 目录可能被清理或权限受限,导致写入失败——这时要显式设置 resultsDir = "$project.buildDir/test-results-android" 并确保路径可写。
真正麻烦的从来不是命令本身,而是设备状态、签名一致性、以及测试 APK 和主 APK 的 targetSdk 匹配问题——这三个地方出错,错误信息往往藏在 adb logcat 里,而不是 Gradle 输出中。


















