【问题标题】:Represent file structure to JSON将文件结构表示为 JSON
【发布时间】:2020-06-11 20:07:35
【问题描述】:

我想用 JSON 或 XML 代码表示当前文件结构,但有一些条件。

  • 我希望我的代表不要提及中间的空目录。
  • 我只想列出以Activity.* 结尾的文件

例如: 对于这个结构

my_project
├── feature1
│   └── src
│       └── java
│           └── com
│               └── directory
│                   ├── MainActivity.kt
│                   └── MainFragment.kt
└── feature2
    └── src
        └── java
            └── com
                └── directory
                    ├── Feature2Activity.kt
                    └── Feature2Fragment.kt

应该生成

{
  "my_project": {
    "feature1": {
      "directory": ["MainActivity"]
    },
    "feature2": {
      "directory": ["Feature2Activity"]
    }
  }
}

如果我不能在运行时执行此操作也没关系,将其视为我将在目录上使用的脚本。不在应用运行时。

【问题讨论】:

  • Sources(src 文件夹)在应用程序运行时不可用,您的意思是列出压缩在 dex 文件(在 apk 内)中的 .class 文件(JVM 字节码)吗?
  • 我没有意识到这一点。谢谢!那么还有其他选择吗?
  • 您无法验证它是 Java 文件还是 Kotlin 文件,但您可以计算出最后有 Activity 的文件。
  • 你能帮我做这件事吗?我不在乎它是 Java 还是 Kotlin。所以你提供的对我来说已经足够了
  • @william 等待我可能正在写一个答案

标签: android kotlin


【解决方案1】:

源文件编译成JVM字节码,然后编译成可以在Android平台上运行的Dex(Dalvik Executable)。

您可以使用上下文可以访问的应用程序的 Dex 文件。

val activityFiles = mutableListOf<String>()

DexFile(context.getPackageCodePath()).entries().apply {
    while(hasMoreElement()) {
        val fileName = nextElement.substringAfterLast('.').substringBefore('$')
        if(fileName.contains("Activity")) activityFiles.add(fileName)
    }
}

// Logic to generate Json. You may use any json library.
val innerJson = mutableMapOf(
    getAppName() to mapOf(
        "directory" to activityFiles
    )
)

// Hard-code the parent project name (holding both sub application)
val jsonRepresentation: MutableMap<String, Any> = mutableMapOf("my_project" to innerJson)

val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()

val json = moshi.adapter(Map::class.java).toJson(jsonRepresentation)


fun getAppName(ctx: Context) {
    val appInfo = context.getApplicationInfo()
    val id = appInfo.labelRes
    return if (id == 0) applicationInfo.nonLocalizedLabel.toString()
    else context.getString(id)
}

我想知道是否有可能同时拥有 feature1 信息和 feature2,因为您将拥有该指定应用程序的上下文。如果您在feature1 中编写代码,则将无法看到另一个feature2 的类/应用名称。

参考文献

【讨论】:

  • 谢谢!但是现在我只有文件列表..如何生成具有父目录的 Json 结构?
  • @wiliam 等一下
  • 感谢您的回答!我一直在寻找仅使用 kotlin.io 并且不依赖任何 Android 体面的东西。您认为我们可以通过FileTreeWalk 实现我们的目标吗?
  • @wiliam 我会说然后创建一个 gradle 任务,使用 gradle kotlin dsl 并运行它,当您拥有源代码时(即编译时),这将是一种更简洁的方法跨度>
  • 我一直在使用 gradle 任务,像这样:imgur.com/a/yBQI7nj
猜你喜欢
  • 2019-06-11
  • 1970-01-01
  • 2019-07-22
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
相关资源
最近更新 更多