问题源于我对connectedAndroidTest gradle task 工作原理的误解。它创建并部署了 2 个 android 应用程序 - 一个可测试(您的项目)和一个测试器(一个模拟与可测试应用程序交互的用户的应用程序)。我的意图是向可测试的应用程序添加权限。但是,将清单添加到 src/androidTest 会导致将权限添加到测试应用程序。我是这样想的:
如果我执行
adb shell pm list packages -f -3
(-3 表示只列出第三方包)我可以看到这样的东西
包:/data/app/SmokeTestApp.apk=com.android.smoketest
包:/data/app/GestureBuilder.apk=com.android.gesture.builder
包:/data/app/com.mycompany.myapp-2.apk=com.mycompany.myapp
包:/data/app/SoftKeyboard.apk=com.example.android.softkeyboard
包:/data/app/org.libsdl.app-2.apk=org.libsdl.app
包:/data/app/SmokeTest.apk=com.android.smoketest.tests
包:/data/app/com.mycompany.myapp.test-1.apk=com.mycompany.myapp.test
test-1后缀的app是tester app,另外一个是我的testable app。检查他们的许可给出:
root@generic_x86:/ # aapt d permissions /data/app/com.mycompany.myapp-2.apk
package: com.spredfast.android
uses-permission: android.permission.INTERNET
uses-permission: android.permission.WRITE_EXTERNAL_STORAGE
root@generic_x86:/ # aapt d permissions /data/app/com.mycompany.myapp.test-1.apk
package: com.spredfast.android
uses-permission: android.permission.SET_ANIMATION_SCALE
因此,我打算放入可测试应用程序的权限 SET_ANIMATION_SCALE 已放入测试程序应用程序。难怪将清单从 src/androidTest 移动到 src/debug 会将权限放入可测试的应用程序中(正确,但过于宽泛)。
这是我解决原始问题的方法 - 仅在应用程序在 connectedAndroidTest 任务中运行的情况下将权限放入应用程序。
-
我创建了一个用于集成测试的空构建风格:
productFlavors {
/**
* This flavor is to be run only using connectedAndroidTestAnimcontrol
*/
animcontrol {}
regular {}
}
将具有单一权限的src/androidTest/AndroidManifest.xml移至src/animcontrol/AndroidManifest.xml
-
执行连接测试
./gradlew connectedAnimcontrolDebugAndroidTest
成功了,现在我有了AndroidManifest.xml,只有在以 connectedAndroidTest 运行时才会与主应用的清单合并。
希望这对某人有所帮助。