如何在多个Android项目间共享Sample data?库未编译sampledata文件夹
多Android项目间共享示例数据(Sample Data)的可行方案
针对你遇到的「包含sampledata的库未将该目录编译进AAR,导致无法跨项目共享」的问题,我整理了两种场景下的解决方案:
方案1:单仓库(Monorepo)多模块共享
如果你的库和应用模块都在同一个项目仓库中,这是最简便的实现方式:
- 确保库模块的示例数据放在
src/main/sampledata目录下(若自定义位置,可通过sourceSets配置指定)。 - 在应用模块的
build.gradle(或build.gradle.kts)中,将库的sampledata目录添加到自身的sampledata源集合:
Groovy版本
android { sourceSets { main { sampledata.srcDirs += project(':你的库模块名称').sourceSets.main.sampledata.srcDirs } } }
Kotlin DSL版本
android { sourceSets { named("main") { sampledata.srcDirs(project(":你的库模块名称").sourceSets.named("main").get().sampledata.srcDirs) } } }
配置完成后,应用模块的布局预览就能直接调用库中的示例数据,无需额外打包操作。
方案2:跨仓库(库发布到Maven)共享
如果你的库是独立发布到Maven仓库的,需要先将sampledata打包进AAR,再让依赖项目提取使用:
步骤1:配置库模块的Gradle,将sampledata打包进AAR
在库的build.gradle中添加以下配置,确保sampledata被打包为附加Artifact:
Groovy版本
android { sourceSets { main { sampledata.srcDirs = ['src/main/sampledata'] } } } // 打包sampledata为单独的Jar包 task packageSampleData(type: Jar) { from sourceSets.main.sampledata.srcDirs archiveName = "sampledata.jar" destinationDir = file("$buildDir/intermediates/sampledata") } // 将sampledata.jar作为附加产物发布 artifacts { archives packageSampleData } // 确保构建AAR前完成sampledata打包 assemble.finalizedBy(packageSampleData)
Kotlin DSL版本
android { sourceSets { named("main") { sampledata.srcDirs("src/main/sampledata") } } } val packageSampleData by tasks.registering(Jar::class) { from(sourceSets.named("main").get().sampledata.srcDirs) archiveName = "sampledata.jar" destinationDir = file("$buildDir/intermediates/sampledata") } artifacts { archives(packageSampleData) } tasks.named("assemble") { finalizedBy(packageSampleData) }
步骤2:在依赖项目中提取库的sampledata
在应用模块的build.gradle中,添加库依赖并配置sourceSets提取AAR中的sampledata:
Groovy版本
dependencies { implementation 'com.example:你的库包名:版本号' } android { sourceSets { main { // 从依赖的库AAR中提取sampledata目录 sampledata.srcDirs += zipTree(configurations.implementation.find { it.name.contains('你的库包名') }.absolutePath).matching { include 'sampledata/**' }.files } } }
Kotlin DSL版本
dependencies { implementation("com.example:你的库包名:版本号") } android { sourceSets { named("main") { sampledata.srcDirs( configurations.implementation.get().filter { it.name.contains("你的库包名") } .map { zipTree(it).matching { include("sampledata/**") }.files } ) } } }
配置完成后,应用项目会自动从依赖的库AAR中提取sampledata,布局预览可直接使用这些示例数据。
备选方案:用资源目录替代sampledata
如果上述方案遇到兼容性问题,也可以将示例数据放在库的assets或res/raw目录下,在布局预览中通过tools:sample直接引用资源文件。这种方式需要手动处理数据读取,但兼容性更强。
内容的提问来源于stack exchange,提问作者Vladimir Jovanović
相关产品推荐
相关产品推荐

