在 Firebase 测试实验室将文件写入 Android 设备?

Writing files to Android device on Firebase Test Lab?

我正在使用 Flank/Firebase 测试实验室在 Android Pixel API28 上编写 运行 的 JUnit4 测试,并尝试将一些元数据写入测试设备到任何 public /sdcard/* 文件夹并下载元数据以供进一步处理。

此时我已经尝试了很多下面代码的变体,但 none 似乎奏效了:

        // val folder = "/storage/emulated/0/Download"
        // val folder = "/sdcard/Android/Download"
        val folder = getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS).absolutePath
        val fileName = "$folder/Result-$testCaseId.json"

        try {
            val myObj = File(fileName)
            if (myObj.createNewFile()) {
                Log.i("MetadataListener", "File created: " + myObj.getName())
            } else {
                Log.i("MetadataListener", "File already exists.")
            }
        } catch (e: IOException) {
            // println("An error occurred.")
            Log.e("MetadataListener", "Error message" + e.message)
            e.printStackTrace()
        }

我也曾尝试在我的 AndroidManifest.xml 中启用写权限,但这没有做任何事情。我认为我也不需要这些权限,因为我正在尝试写入 public 下载文件夹:

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
      tools:ignore="ScopedStorage" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

有人知道这里出了什么问题吗? 当我针对我的本地设备进行调试并单步执行代码时,此代码 运行 没有错误。 :(

如有任何建议,将不胜感激,谢谢!

我在解决这个问题时学到的东西:

  1. 默认情况下,Flank 提供所有权限,因此对于 Flank/Firebase 测试实验室配置而言,无需显式启用写入权限。这不是我的问题。

  2. 根本原因是这段代码实际上不是运行。事实证明,在我的 Gradle 插件代码中向测试运行程序注册侦听器时,Firebase 测试实验室不接受我的配置参数:

project.configure<LibraryExtension> {
  defaultConfig.testInstrumentationRunner = "com.mypackage.TestRunner"
  defaultConfig.testInstrumentationRunnerArgument("listener", "com.mypackage.MetadataListener)
}

解决我的问题的解决方法和可接受的答案是在运行时而不是在构建时向我的测试运行器显式添加一个侦听器:

class TestRunner : AndroidJUnitRunner() {
    override fun onCreate(arguments: Bundle) {
        arguments.putString("listener", MetadataListener::class.java.name)
        super.onCreate(arguments)
    }
}