如何在Android模块中访问coreModule内的共享资源文件?
问题解决:Android模块加载核心模块共享资源及多资源目录配置
一、修复当前多资源目录配置的问题
你之前的配置错误在于混淆了Android Gradle中的resources和assets源集:
sourceSets["main"].resources对应的是Android项目res目录下的编译型资源(如布局、字符串、Drawable等),这类资源会被系统编译索引,无法通过assets.open()加载。assets.open()读取的是assets目录下的原始文件,需要配置sourceSets["main"].assets指向目标目录。
同时要注意路径是相对于androidModule目录的,正确配置如下:
android { sourceSets["main"].assets { // 指向coreModule下的目标资源目录,注意相对路径前缀../ srcDirs("../coreModule/example/targeted/folder") // 如有其他路径,继续添加即可 // srcDirs("../coreModule/another-resource-folder") } }
修改后重新同步Gradle,就能通过assets.open("file-from-the-custom-folder")加载目标文件了。
二、核心模块存放共享资源的最佳方案
直接配置sourceSets虽然能解决问题,但更优雅且可维护的方案是将coreModule改造为Android库模块,利用Android官方的依赖机制自动共享资源:
1. 将coreModule转为Android库
修改coreModule下的build.gradle.kts,替换为Android库的配置:
plugins { id("com.android.library") kotlin("android") // 若使用Kotlin,否则可移除 } android { namespace = "com.yourcompany.core" // 替换为你的包名 compileSdk = 34 // 匹配你的项目编译SDK版本 defaultConfig { minSdk = 21 // 根据需求设置最低兼容版本 } buildTypes { release { isMinifyEnabled = false } } } dependencies { // 添加你的依赖,例如Kotlin标准库 implementation(kotlin("stdlib")) }
然后在coreModule中创建src/main/assets目录,将共享的字体、二进制文件放入该目录。
2. 在androidModule中依赖coreModule
在androidModule的build.gradle.kts中添加对coreModule的依赖:
dependencies { implementation(project(":coreModule")) // 其他原有依赖保留 }
这样配置后,Android构建系统会自动合并coreModule和androidModule的assets目录,你无需手动配置路径,直接通过assets.open("filename")就能加载coreModule中的共享资源。同时desktopModule也可以通过自身的资源读取方式(如ClassLoader.getResourceAsStream())读取coreModule中的文件,完全符合你"核心模块集中存放共享资源"的需求。
内容的提问来源于stack exchange,提问作者Lucas Sousa
相关产品推荐
相关产品推荐

