Android 如何在运行浓缩咖啡测试时禁用代码中的动画
有人在运行浓缩咖啡测试时通过代码禁用动画吗?我一直在尝试按照此网页(链接至)中的说明操作:Android 如何在运行浓缩咖啡测试时禁用代码中的动画,android,android-animation,android-permissions,android-espresso,android-instrumentation,Android,Android Animation,Android Permissions,Android Espresso,Android Instrumentation,有人在运行浓缩咖啡测试时通过代码禁用动画吗?我一直在尝试按照此网页(链接至)中的说明操作: 不幸的是,它似乎不起作用,因为我一直看到这个错误: 04-27 15:48:28.694 303-342/system_process W/PackageManager﹕ Not granting permission android.permission.SET_ANIMATION_SCALE to package com.cookbrite.dev (protectionLevel=50
不幸的是,它似乎不起作用,因为我一直看到这个错误:
04-27 15:48:28.694 303-342/system_process W/PackageManager﹕ Not granting permission android.permission.SET_ANIMATION_SCALE to package com.cookbrite.dev (protectionLevel=50 flags=0x18be46)
我真的希望避免重新配置我的设备/模拟器。我们经常在本地运行单独的测试,如果我不得不不断切换设置,这会让我很恼火
我注意到其他一些开发人员抱怨这不起作用,所以我可能并不孤单:我终于成功了。以下是列出所需步骤的要点:
我错过的关键步骤是运行
adb
授予权限:
adb shell pm grant com.mypackage android.permission.SET_ANIMATION_SCALE
单独向清单添加权限和运行反射步骤似乎不够。我正在为每种动画类型执行这三个命令,它们对我有效:
adb外壳设置将全局窗口\u动画\u比例设置为0.0
adb外壳设置将全局过渡\u动画\u比例设置为0.0
adb外壳设置将全局动画师\u持续时间\u比例设置为0.0
这里有更多信息-如果您从命令行运行测试,更好的方法是更新
app/build.gradle
,
android {
...
...
testOptions {
animationsDisabled = true
}
}
在重建之前,您可能需要执行/gradlew clean
。如果您使用android studio,它可能不会更新设备上的apk,前提是apk中没有任何更改。当心这些,以确保更改在您的设备上实际生效
同时阅读文档
在从cammand行运行的插入指令的测试期间禁用动画
如果将此属性设置为true,则从命令行使用Gradle运行插入指令的测试将使用--no window animation标志执行am instrument。默认情况下,此属性设置为false
此属性不影响使用Android Studio运行的测试
使用这种方式:
1。您在Gradle中使用此选项
android {
//...
testOptions {
animationsDisabled = true
}
// ...
}
adb shell settings put global window_animation_scale 0 &
adb shell settings put global transition_animation_scale 0 &
adb shell settings put global animator_duration_scale 0 &
class DisableAnimationsRule : TestRule {
override fun apply(base: Statement, description: Description): Statement {
return object : Statement() {
@Throws(Throwable::class)
override fun evaluate() {
// disable animations for test run
changeAnimationStatus(enable = false)
try {
base.evaluate()
} finally {
// enable after test run
changeAnimationStatus(enable = true)
}
}
}
}
@Throws(IOException::class)
private fun changeAnimationStatus(enable:Boolean = true) {
with(UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())){
executeShellCommand("settings put global transition_animation_scale ${if(enable) 1 else 0}")
executeShellCommand("settings put global window_animation_scale ${if(enable) 1 else 0}")
executeShellCommand("settings put global animator_duration_scale ${if(enable) 1 else 0}")
}
}
}
2。在ADB中用于设备
android {
//...
testOptions {
animationsDisabled = true
}
// ...
}
adb shell settings put global window_animation_scale 0 &
adb shell settings put global transition_animation_scale 0 &
adb shell settings put global animator_duration_scale 0 &
class DisableAnimationsRule : TestRule {
override fun apply(base: Statement, description: Description): Statement {
return object : Statement() {
@Throws(Throwable::class)
override fun evaluate() {
// disable animations for test run
changeAnimationStatus(enable = false)
try {
base.evaluate()
} finally {
// enable after test run
changeAnimationStatus(enable = true)
}
}
}
}
@Throws(IOException::class)
private fun changeAnimationStatus(enable:Boolean = true) {
with(UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())){
executeShellCommand("settings put global transition_animation_scale ${if(enable) 1 else 0}")
executeShellCommand("settings put global window_animation_scale ${if(enable) 1 else 0}")
executeShellCommand("settings put global animator_duration_scale ${if(enable) 1 else 0}")
}
}
}
3。使用规则
android {
//...
testOptions {
animationsDisabled = true
}
// ...
}
adb shell settings put global window_animation_scale 0 &
adb shell settings put global transition_animation_scale 0 &
adb shell settings put global animator_duration_scale 0 &
class DisableAnimationsRule : TestRule {
override fun apply(base: Statement, description: Description): Statement {
return object : Statement() {
@Throws(Throwable::class)
override fun evaluate() {
// disable animations for test run
changeAnimationStatus(enable = false)
try {
base.evaluate()
} finally {
// enable after test run
changeAnimationStatus(enable = true)
}
}
}
}
@Throws(IOException::class)
private fun changeAnimationStatus(enable:Boolean = true) {
with(UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())){
executeShellCommand("settings put global transition_animation_scale ${if(enable) 1 else 0}")
executeShellCommand("settings put global window_animation_scale ${if(enable) 1 else 0}")
executeShellCommand("settings put global animator_duration_scale ${if(enable) 1 else 0}")
}
}
}
尝试该命令时,我收到以下错误
操作不允许:java.lang.SecurityException:Permission android.Permission.SET\u ANIMATION\u SCALE不是可更改的权限类型
。你知道我为什么不能批准吗?@MattKranzler你在用真的设备吗?它在非根设备上不起作用。@Yenchi我用模拟器试过了,但仍然有exception@Yenchi仅适用于棉花糖仿真器。@MattKranzler确保目标应用程序的AndroidManifest.xml
中有
(您只能为调试/etc添加它)在第一个adb
命令的末尾有一个额外的字符“`”。我试图删除该链接,但edit
至少需要6个字符。我删除了不可打印的字符,因此复制粘贴现在应该可以正常工作。链接不再有效。不要复制粘贴不起作用的答案。这不会禁用动画。我在发现这对我有效后添加了答案。你认为谷歌为什么会提供这种选择?在重建之前,您可能需要执行/gradlew clean
。如果您使用android studio,它可能不会更新设备上的apk,前提是apk中没有任何更改。当心这些,以确保更改在您的设备上实际生效。使用这些说明更新了答案。此选项仅禁用活动转换动画,而不禁用代码中的其他动画。这很有趣。我正在运行/gradlew应用程序:connectedAndroidTest
,它符合我的目的。请查看文档中的信息(更新了答案)。它说“此属性不影响使用Android Studio运行的测试”。这可能会引起混乱。