使用库中的示例数据目录

Use Sample data directory from a library

我使用 this 文章中描述的过程为我的 Android 应用程序创建了示例数据目录。我想在我的项目之间共享这组样本数据,所以我创建了一个库,里面只有样本数据。但据我所知,sampledata 文件夹没有被编译到库中。有没有办法在多个 Android 项目之间共享示例数据?

简短的回答是否定的,您不能对 sampledata 文件夹执行此操作。基本上,Android 库的格式是 AAR。如果你 reference 官方文档,它说:

The file itself is a zip file containing the following mandatory entries:

/AndroidManifest.xml

/classes.jar

/res/

/R.txt

/public.txt

Additionally, an AAR file may include one or more of the following optional entries:

/assets/

/libs/name.jar

/jni/abi_name/name.so (where abi_name is one of the Android supported ABIs)

/proguard.txt

/lint.jar

因此,sampledata 不能成为 AAR 库的一部分。

更新

您可以使用 predefined 样本资源来代替您自己的数据样本。
例如 @tools:sample/first_names 将从一些常见的名字中随机 select,例如 Sophia、Jacob、Ivan。

用法示例:

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:text="@tools:sample/first_names" />

如前所述,您不能对库执行此操作,因为 sampledata 根本无法成为 Android 库的一部分。

你可以做的一件事是,将你的 names 文件托管在某个地方,然后使用 gradle 任务获取它,你可以只添加到应用程序的 build.gradle

clean.doFirst {
    println "cleanSamples"
    def samplesDir = new File(projectDir.absolutePath, "sampledata")
    if (samplesDir.exists()) {
        samplesDir.deleteDir()
    }
}

task fetchSamples {
    println "fetchSamples"
    def samplesDir = new File(projectDir.absolutePath, "sampledata")
    if (samplesDir.exists()) {
        println "samples dir already exists"
        return
    }    
    samplesDir.mkdir()

    def names = new File(samplesDir, "names")

    new URL('http://path/to/names').withInputStream { i ->
        names.withOutputStream {
            it << i
        }
    }
}

你可以在那里看到 2 个功能,第一个是 运行 在 clean 任务之前,它只会删除你的 sampledata 文件夹。第二个是每次构建时的任务 运行,它不会每次都下载文件,但只有在目录不存在的情况下才会下载。

我知道你也可以复制粘贴 names 文件,但是,使用这种方法你只需要复制粘贴任务一次,你就可以在任何项目中更改 names通过上传新文件并进行干净构建。