在棉花糖中授予ACCESS_MOCK_LOCATION使用adb进行测试的权限失败

Seb*_* LG 3 permissions android automated-tests

这是问题的根源:

  1. 在调试清单中添加模拟位置权限 <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
  2. 安装在手机应用程序的调试版本(在摇篮:debug { debuggable true }
  3. 尝试使用adb授予权限: adb shell pm grant com.myapp.name android.permission.ACCESS_MOCK_LOCATION

命令的结果为:

不允许的操作:java.lang.SecurityException:权限android.permission.ACCESS_MOCK_LOCATION不是可更改的权限类型”

如果我转到手机上的开发人员选项并进行设置Setting >> Developer Option >> Select Mock location app

我需要进行自动测试,因此显然进入电话设置的选项无效,因为在每次安装该应用程序时都会重置该选项,因此我需要adb选项才能工作。

Seb*_* LG 6

我在Calabash修复程序中找到了针对同一问题的解决方案:https : //github.com/calabash/calabash-android/commit/b31be97953325383b9295ff52234a0121cc27e27

adb shell appops set com.myapp.name 58 allow
Run Code Online (Sandbox Code Playgroud)

要从gradle中自动执行此操作,可以将命令添加到安装任务中:

def adb = android.getAdbExe().toString()
tasks.whenTaskAdded { task ->
    if (task.name.startsWith('install')) {
        task.doLast {
            android.applicationVariants.all { variant ->
                "${adb} devices".execute().text.eachLine {
                    if (it.endsWith("device")) {
                        def device = it.split()[0]
                        println "Granting test permissions on device ${device}\n"
                        "${adb} shell appops set ${variant.applicationId} 58 allow".execute()
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是您必须在connectedTest任务之前明确调用安装任务,例如:

gradlew installMyAppDebug connectedMyAppDebugAndroidTest
Run Code Online (Sandbox Code Playgroud)