如何在Android测试启动前执行自定义Gradle Task?
解决方案:让MonkeyRunner权限脚本在Android Tests前自动执行
我之前也碰到过类似的问题,折腾了好一阵才搞定,给你几个靠谱的方案试试:
1. 定义执行MonkeyRunner的Gradle Task
先在模块级的build.gradle(比如app/build.gradle)里创建专门的Task来运行你的权限脚本。这里要注意两点:一是确保Gradle能找到monkeyrunner,二是让脚本执行失败时直接终止后续测试流程——毕竟权限没拿到,测试也白跑。
示例代码:
task grantTestPermissions(type: Exec) { // 如果系统PATH里已经配置了monkeyrunner,直接写"monkeyrunner"即可 def monkeyRunnerPath = "${android.sdkDirectory}/tools/bin/monkeyrunner" // 替换成你的MonkeyRunner脚本实际路径 commandLine monkeyRunnerPath, "${project.rootDir}/scripts/grant_test_perms.py" // 关键:脚本执行失败就终止流程 ignoreExitValue = false // 可选:打印脚本输出,方便调试问题 standardOutput = new ByteArrayOutputStream() doLast { println "Permission grant output:\n${standardOutput.toString()}" } }
2. 把Task绑定到测试流程的前置环节
Android Gradle插件提供了多个测试相关Task,比如connectedAndroidTest(连接设备/模拟器跑测试),你需要让权限脚本Task成为这些测试Task的依赖,这样测试启动前会自动先跑脚本。
方法一:绑定到所有连接设备的测试任务
如果你的测试都是通过connectedAndroidTest启动的,直接加依赖:
connectedAndroidTest.dependsOn grantTestPermissions
方法二:仅绑定到特定构建变体的测试
比如只在debug测试前执行脚本:
android { buildTypes { debug { connectedAndroidTest.dependsOn grantTestPermissions } } }
方法三:绑定到所有测试类型的通用前置
如果想让所有测试Task都先跑权限脚本,用tasks.withType匹配:
tasks.withType(Test) { dependsOn grantTestPermissions }
3. 排查常见坑点
如果之前的方案没生效,大概率是碰到了这些问题:
- MonkeyRunner路径错误:检查
android.sdkDirectory是否指向正确的SDK路径,或者直接写绝对路径(比如/Users/xxx/Library/Android/sdk/tools/bin/monkeyrunner)。 - 脚本执行成功但权限没加上:在你的MonkeyRunner脚本里,要确保授予权限的命令执行后检查结果,失败时返回非0码。比如:
result = device.shell(f"pm grant com.your.test.package android.permission.WRITE_EXTERNAL_STORAGE") if result: print(f"Failed to grant permission: {result}") sys.exit(1) - Task执行时机不对:如果脚本在APK安装前执行,权限会授予失败。可以调整执行顺序:
grantTestPermissions.mustRunAfter tasks.withType(Install) connectedAndroidTest.dependsOn grantTestPermissions
内容的提问来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

