在MainActivity.java中检测在Detox上下文下运行的Android React Native应用

2020年2月15日 16点热度 0条评论

我希望在测试失败时从Detox e2e运行中获取我的React Native应用程序的屏幕截图。这在iOS上工作正常,但是在Android上,由于在我的FLAG_SECURE中使用了MainActivity.java,因此生成的屏幕截图为零字节。在其他情况下,我从Command failed中获取ScreencapPlugin,并且未生成任何文件。本质上,我需要一种方法来从Detox测试运行的上下文中检测到该应用程序正在执行,如果是这样,请不要设置FLAG_SECURE

我的基本排毒配置是:

"android.emu.debug": {
    "binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk",
    "build": "cd android && ./gradlew app:assembleDebug app:assembleAndroidTest -DtestBuildType=debug && cd ..",
    "type": "android.emulator",
    "device": {
        "avdName": "Pixel_3a_API_27"
    }
}

这是使用以下命令执行的:

detox build --configuration android.emu.debug && detox test --configuration android.emu.debug --take-screenshots failing

MainActivity.java的受影响部分如下所示:

public class MainActivity extends ReactActivity {
    // ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getWindow().setFlags(
            WindowManager.LayoutParams.FLAG_SECURE,
            WindowManager.LayoutParams.FLAG_SECURE);

        // ...
        super.onCreate(savedInstanceState);
    }
}

到目前为止,我已经尝试了,但无济于事:

  • P配置提供附加的Dbuild参数,并在System.getProperty()中使用MainActivity.java进行消耗。
  • build配置中传递环境变量,并在System.getenv()中使用MainActivity.java进行使用。
  • 在未设置DetoxActivity.java的情况下生成新的FLAG_SECURE,并相应地连接DetoxTest.java
  • 读取System.getProperty()中的app.gradle并分配给defaultConfig中的变量。
  • 有人可以建议使此工作最佳的方法吗?我想我在这里苦苦挣扎,因为我还没有完全掌握Detox / Gradle / Java的组合!

    解决方案如下:

    在您的MainActivity.java中

    加:

    
        protected void onPause() {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
            super.onPause();
        }
    
        protected void onResume() {
            super.onResume();
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
        }
    

    这仅在应用程序在后台时启用FLAG_SECURE,但在前台时将被禁用,因此允许您截取屏幕截图。