Commit 8ed90bde authored by pengjunjing's avatar pengjunjing

feat:增加白名单功能,增加文档说明

parent f98a719d
...@@ -3,10 +3,11 @@ ...@@ -3,10 +3,11 @@
## 工具列表 ## 工具列表
1. 删除没有被引用到的图片/xml文件 1. 删除没有被引用到的图片/xml文件
2. 将图片/xml文件移动到使用的模块 2. 将图片/xml文件移动到使用的模块
3. 将string.xml的字符串进行删除或者移动到对应模块
--- ---
## 使用方式 ## 工具的使用方式
* 在项目中️以模块的形式导入: * 在项目中️以模块的形式导入:
* 项目中根目录找到setting.gradle,加入刚刚复制的文件夹: include ':RemoveUnusedImg' * 项目中根目录找到setting.gradle,加入刚刚复制的文件夹: include ':RemoveUnusedImg'
* 找到需要使用工具的入口,然后修改部分Java代码,以Java的形式运行即可 * 找到需要使用工具的入口,然后修改部分Java代码,以Java的形式运行即可
...@@ -48,9 +49,37 @@ UnuseRes.kt的main方法 ...@@ -48,9 +49,37 @@ UnuseRes.kt的main方法
SingleImplement.kt的main方法 SingleImplement.kt的main方法
### 原理: ### 原理:
跟第一个工具差不多,前三步跟第一个工具一样 跟第一个工具差不多,前三步跟第一个工具一样
4. 统计此文件被哪些代码文件依赖,存到列表中 4. 统计此文件被哪些代码文件依赖,存到列表中
5. 对每个资源文件的依赖列表进行判断,通过路径得到所属的模块,再通过set进行去重. 5. 对每个资源文件的依赖列表进行判断,通过路径得到所属的模块,再通过set进行去重.
6. 第五步得到的结果数量为1的说明就是被一个模块依赖了,再通过代码执行git命令,将文件移动过去 6. 第五步得到的结果数量为1的说明就是被一个模块依赖了,再通过代码执行git命令,将文件移动过去
### 使用方法 ### 使用方法
跟第一个工具的使用方法差不多,图片和xml都是分开来操作的. 所以需要循环操作几次,均为0的时候才算完全完成 跟第一个工具的使用方法差不多,图片和xml都是分开来操作的. 所以需要循环操作几次,均为0的时候才算完全完成
* ***请在有GIT跟踪的目录下进行*** * ***请在有GIT跟踪的目录下进行***
-------------------------
## 3. 将string.xml的字符串进行删除或者移动到对应模块
### 使用场景:
此代码跟第二个工具的作用差不多,只不过处理的对象是每个模块下的string.xml , 需要清除一些模块下string.xml文件没有用到的string内容 , 或者是将其内容移动到引用代码所对应的模块下 , 可以使用此工具来完成
### 入口
StringPull.kt的main方法
### 原理:
1. 给定一个路径,递归扫描该路径下的所有*.xml文件 , 并且判断是不是字符串的文件
2. 对扫描到的string.xml文件 , 获取所有定义的参数以及数值
3. 扫描所有代码
4. 对第一步的结果,进行判断,得到每个字符串引用的次数
5. 引用次数为0则解析xml , 并且删除该字符串内容
6. 引用次数为1的字符串 , 则视为只被一个模块调用 , 如果调用的模块不是本模块 , 则移动到对应的模块去
### 使用方法
* 找到主方法 , 检查realExecuteCmd是否为false , false为调试模式
* 主方法配置的核对路径是否为需要扫描的路径
* 调试模式下运行主方法 , 之后会打印日志
* 根据打印的日志 , 随机挑选几条数据进行人工校验 , 没问题之后直接调用主方法
### 注意事项
* 当某些模块的string.xml不存在时会自动创建 , 随后会用命令行添加到git中 , 由于使用的是"git add ." 可能会导致添加了一些不需要的文件 , 在提交的时候应该检查一下.如果有不需要add的可以使用 "git rm --cached xxx" 命令来移除添加的文件
* 由于有些字符串可能是在SDK调用的,这个工具时候并不一定能生效 , 可能会把有些有用的字符串给删除掉 , 这种情况可以添加到白名单解决 , 自定查找 isWhiteList 方法,进行手工添加
...@@ -12,6 +12,13 @@ import java.io.File ...@@ -12,6 +12,13 @@ import java.io.File
class StringPull { class StringPull {
} }
/**
* 是否真的会执行移动操作的变量,请对当前git的操作进行贮存,
* 确保项目没有其他操作后再执行,否则可能会操作记录混乱
*/
const val realExecuteCmd = false
fun main(args: Array<String>) { fun main(args: Array<String>) {
println("开始读取文件") println("开始读取文件")
...@@ -21,10 +28,10 @@ fun main(args: Array<String>) { ...@@ -21,10 +28,10 @@ fun main(args: Array<String>) {
//这里打印的应该会是as项目所处的路径 //这里打印的应该会是as项目所处的路径
println(projectPath) println(projectPath)
//要检查资源的目录,大小写敏感 //要检查资源的目录,大小写敏感
val baseFile = // val baseFile =
File("$projectPath${File.separator}LaiHuaBase${File.separator}src${File.separator}") // File("$projectPath${File.separator}LaiHuaBase${File.separator}src${File.separator}")
//从项目根目录开始查找 //从项目根目录开始查找
// val baseFile = File("${projectRoot.absolutePath}") val baseFile = File("${projectRoot.absolutePath}")
println(baseFile.absolutePath + "\n") println(baseFile.absolutePath + "\n")
//读取代码文件 //读取代码文件
val readCode = ProjectCode().readCode(StringRefCodeReader()) val readCode = ProjectCode().readCode(StringRefCodeReader())
...@@ -42,15 +49,17 @@ fun main(args: Array<String>) { ...@@ -42,15 +49,17 @@ fun main(args: Array<String>) {
//未使用的string定义 //未使用的string定义
for (stringXmlResCode in stringXmlResReferList) { for (stringXmlResCode in stringXmlResReferList) {
val filter = stringXmlResCode.stringElementList.filter { val filter = stringXmlResCode.stringElementList.filter {
it.refer.isEmpty() it.refer.isEmpty() && (!isWhiteList(it))
} }
println("未被使用的字符串一共有${filter.size}个") println("未被使用的字符串一共有${filter.size}个")
filter.forEach { filter.forEach {
println("未被使用的字符串 id:${it.attributeName} 内容是: ${it.value}") println("未被使用的字符串 id:${it.attributeName} 内容是: ${it.value}")
//删除未使用的string资源 //删除未使用的string资源
if (realExecuteCmd) {
StringXmlParse().deleteStringXmlElement(it) StringXmlParse().deleteStringXmlElement(it)
} }
} }
}
println("\n--------------------------------\n") println("\n--------------------------------\n")
...@@ -63,9 +72,11 @@ fun main(args: Array<String>) { ...@@ -63,9 +72,11 @@ fun main(args: Array<String>) {
filter.forEach { stringElement -> filter.forEach { stringElement ->
val module = stringElement.refer.toList()[0] val module = stringElement.refer.toList()[0]
println("模块 ${module.moduleName} 依赖了字符串:${stringElement.attributeName} , 内容是: ${stringElement.value}") println("模块 ${module.moduleName} 依赖了字符串:${stringElement.attributeName} , 内容是: ${stringElement.value}")
if (realExecuteCmd) {
StringXmlParse().moveStringXmlElement(stringElement, module) StringXmlParse().moveStringXmlElement(stringElement, module)
} }
} }
}
println("\n--------------------------------\n") println("\n--------------------------------\n")
...@@ -108,3 +119,15 @@ private fun parseStringResFile(file: File, readCode: MutableSet<Module>): String ...@@ -108,3 +119,15 @@ private fun parseStringResFile(file: File, readCode: MutableSet<Module>): String
return stringXmlResCode return stringXmlResCode
} }
/**
* 白名单字符串,不能删除的字段可在此添加为白名单
*/
private fun isWhiteList(it: StringElement): Boolean {
return it.attributeName == "oppo_push_app_id"
|| it.attributeName == "oppo_push_key"
|| it.attributeName == "xiaomi_push_app_id"
|| it.attributeName == "xiaomi_push_key"
|| it.attributeName == "flyme_push_app_id"
|| it.attributeName == "flyme_push_key"
|| it.attributeName == "PORT_NUMBER"
}
...@@ -134,7 +134,7 @@ class StringXmlParse { ...@@ -134,7 +134,7 @@ class StringXmlParse {
} }
} else { } else {
//节点已存在,不移动 //节点已存在,不移动
print("该值无法移动,目标位置已有同名字符串:${stringElement.attributeName} -> ${targetModule.moduleName}") println("该值无法移动,目标位置已有同名字符串:${stringElement.attributeName} -> ${targetModule.moduleName}")
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment