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运行的测试”。这可能会引起混乱。