【问题标题】:Kotlin Multiplatform - Get file list from directoryKotlin Multiplatform - 从目录中获取文件列表
【发布时间】:2021-09-27 22:50:58
【问题描述】:

我们在 KMM shared/commonMain 项目中包含一个 assets 文件夹。 这个asset文件夹基本上包含了很多JSON文件,结构在不同的子文件夹中。

在 build.gradle 中,assets 文件夹被添加为 android 资源,因此它包含在构建 AAR 的根目录中。

android {
    compileSdkVersion(29)
    sourceSets["main"].resources.srcDirs("src/commonMain/assets")
    ...

在共享模块中,文件是在commonAndroid中按需读取的

val file = this::class.java.classLoader!!.getResource(folder1/file1.json)

这很好用。

现在问题来了,读取一个文件夹:

val folder= this::class.java.classLoader!!.getResource(folder1)

这在通过单元测试执行代码时有效,然后返回文件夹。 一旦构建 AAR 并将其包含在 Android 应用程序中,此行始终返回 null。

请记住,文件已正确添加到 AAR,并且可以在指定文件路径时读取它们。它只是不能仅使用文件夹路径。

有没有办法从 KMM 项目中的 AAR 模块的目录中获取所有文件?

iOS 解决方案正在运行,所以它真的只是关于 android。

编辑 1: 澄清一下,目标不是向外部用户提供对文件夹/文件的访问权限,而是使用 KMM 通用模块本身中的文件。

我正在寻找任何方式来处理文件和文件夹,一旦项目作为 AAR 分发并用作第三方库,它们也可以工作。

编辑 2: 目前似乎没有解决方案来访问 AAR 中的 JARS 中的文件夹。

所以我们切换到一种解决方法,在构建时生成文件夹中所有文件的索引文件,并在运行时使用此信息从特定文件夹中获取所有文件,使用 this::class.java.classLoader!!.getResource(path)(因为 getResource 适用于文件, 只是不适用于文件夹)

【问题讨论】:

  • 一旦你有了一个“文件夹”,你将如何继续列出文件和子文件夹?
  • 使用val absoluteFolderPath = folder.path 获取绝对路径并继续使用File(folderPathAbsolute).listFiles 等。我认为肯定会有共享资源的KMM 功能,但找不到任何东西。
  • 您不能将 File 类用于资产。那永远行不通。但是你说它以这种方式与单元测试一起工作?不可能。
  • 好的,我认为文件夹名称“资产”具有误导性。它只是库中的一个随机文件夹,其中包含应在库中读取的文件。它与库外的 android 资产无关。
  • 我意识到这条消息来得太晚了,而且并不过分相关,但是你有这个问题的完整解决方案吗?我在 Android 上进行文件检查/加载工作,但在 iOS 端却苦苦挣扎......

标签: android kotlin-multiplatform


【解决方案1】:

我认为这是proguard的问题。

将您的 json 文件夹从 assets 文件夹移动到 raw 文件夹并更改 keep.xml 文件。

keep.xml:

 <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@drawable/*,@raw/*"/>

参考:https://developer.android.com/studio/build/shrink-code#keep-resources

【讨论】:

  • 该库是内部库,所以不使用proguard。检查生成的 AAR 时,所有文件夹和文件都按预期包含在内。
猜你喜欢
  • 1970-01-01
  • 2013-06-15
  • 2022-11-19
  • 1970-01-01
  • 2013-03-06
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多