一、背景描述:
公司再不断推进组件化,多个Module开发。随着Module越来越多,当然也存在许多需要注意的问题。是无法保证多个Module中的资源命名完全不同,就可能会出现资源引用问题,造成资源冲突。
二、思路分析
用Gradle
配置,在android
中设置 resourcePrefix
属性,前缀字符串根据实际情况自定义。
但是因为Module
太多,每添加一个模块就需要在Module
的build.gradle
里进行配置, 这样太繁琐,不够智能,那么怎么解决呢,思路如下:
1、写一个
Task
,生成一个json
文件,里面以key
->value
的形式存储模块名和其对应的前缀。
2、将
json
文件中前缀value
进行修改,每次task
执行更新不会覆盖之前修改过的value
,默认前缀名是模块名。
3、在所有模块
Gradle
都配置完之后,给每个模块设置一下修改后的前缀属性
效果展示:
编译器会这样提示,但是编译的时候不会报错
三、问题解决与实现
步骤1:写一个更新/生成命名json文件的task
这个task
我们暂时写到 app
的build.gradle
文件中,写在别的.gradle
文件中也可以
task moduleNameToJson() {
doLast {
def jsonFile = file('./ResourceNameRule.json')
def mapResult = new HashMap<String, String>()
// 每次新建的module不会覆盖之前修改过的value
if (jsonFile.exists()){
def parsedJson = new JsonSlurper().parseText(jsonFile.text)
parsedJson.each {
mapResult.put(it.key.toString(), it.value.toString())
}
mapResult = loopGetName(mapResult, rootProject)
}else{