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

Posted

技术标签:

【中文标题】在 MainActivity.java 中检测在 Detox 上下文下运行的 Android React Native 应用程序【英文标题】:Detect Android React Native app running under Detox context in MainActivity.java 【发布时间】:2020-05-10 22:00:53 【问题描述】:

我希望在测试失败时从 Detox e2e 运行中截取我的 React Native 应用程序的屏幕截图。这在 ios 上运行良好,但在 android 上,由于在我的MainActivity.java 中使用了FLAG_SECURE,屏幕截图生成但字节为零。在其他情况下,我从ScreencapPlugin 得到Command failed 并且没有生成任何文件。本质上,我需要一种方法来检测应用程序是否正在从 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);
    


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

build 配置提供额外的PD 参数并在MainActivity.java 中使用System.getProperty()。 在build 配置中传递环境变量并在MainActivity.java 中使用System.getenv()。 在没有设置FLAG_SECURE 的情况下生成一个新的DetoxActivity.java 并相应地连接DetoxTest.java。 在app.gradle 中读取System.getProperty() 并分配给defaultConfig 中的变量。

任何人都可以提出最好的方法来完成这项工作吗?我想我在这里挣扎,因为我还没有完全掌握 Detox/Gradle/Java 的组合!

【问题讨论】:

【参考方案1】:

在您的 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,但允许您在前台时禁用,因此允许您截屏。

【讨论】:

此更改确实允许从 Detox 截取屏幕截图,也可以从在真实 Android 设备上运行的实际应用截取屏幕截图。还有其他我可能错过的配置吗? 您需要检查您正在使用哪种风格的应用程序(开发与产品)并相应地启用这些方法。 由于这是一个简单的 Expo 应用程序,我不确定我是否能够使用多种风格(参见发布渠道?)或构建类型。

以上是关于在 MainActivity.java 中检测在 Detox 上下文下运行的 Android React Native 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MainActivity.java 中发出简单的 HTTP 请求? (安卓工作室)

错误形式(在 com.going.books.MainActivity.onCreate(MainActivity.java:19))

如何将片段活动添加到 MainActivity.java 或 MainActivity.kt

反应本机 - MainActivity.java

在 Android Studio 中找不到 MainActivity.java [关闭]

在mainactivity中声明接收器