最近在自学python,慢慢的写点小东西记录一下。
这个小程序是帮助我们查找一下我们定义在strings.xml中在java代码中和layout文件中未使用到的资源。我们就可以进行清理掉没用的资源文件。
我是这样一个思路:
0. 首先通过xml解析取出strings.xml中的name部分和值(value)部分,存放到list中
1.遍历找到app\src\main\java和res\layout路径下的所有文件,把文件路径存放到一个数组中
2.通过遍历每一个文件路径 打开文件,查找文件中是否存在strings.xml中有对应的引用R.string.xxx的部分,或者layout文件中有@string/xxx的部分,如果有就把之前存放的集合里面的数据删除掉。剩余的就是没有被踢出去的就是未被使用的。
具体代码如下:
import os
from os import path
from xml.etree.ElementTree import ElementTree
dir_root=path.abspath(os.getcwd());
print(dir_root)
tree = ElementTree()
s=dir_root+"\\app\\src\\main\\res\\values\\strings.xml"
file=open(s,"r",encoding="utf-8")
element=tree.parse(s)
valueList=[]
keyList=[]
strings_data=[];
#遍历strings.xml中所有文本
for e in element:
valueList.append(e.text)
keyList.append(str(e.attrib.get("name")))
strings_data=list(zip(keyList,valueList))
#print(strings_data)
#遍历指定目录下的所有文件
def dirlist(path, allfile):
filelist = os.listdir(path)
for filename in filelist:
filepath = os.path.join(path, filename)
if os.path.isdir(filepath):
dirlist(filepath, allfile)
else:
allfile.append(filepath)
return allfile
file=[]
dirlist(dir_root+"\\app\src\main\java", file)
dirlist(str(dir_root+"\\app\src\main\\res\layout"), file)
#查找java文件中的字符串
def findJavaFileToString(fileList,list):
for fileitme in fileList:
a=open(fileitme,"r",encoding="utf-8")
sourceText=a.read()
a.close()
for item in list:
if sourceText.find(str("R.string."+item[0])) !=-1:
strings_data.remove(item)
print("文件路径:",fileitme,",找到的字符串为:",item[0])
elif sourceText.find(str("@string/"+item[0])) !=-1:
strings_data.remove(item)
print("文件路径:",fileitme,",找到的字符串为:",item[0])
else:
pass
#print("文件路径:",fileitme,",未找到的字符串为:",item[0])
findJavaFileToString(file,strings_data)
print("剩余未找到的为引用为:",strings_data)
只需要将该文件放置到项目根目录中,然后运行该文件即可。运行后的截图为:
通过该方法同样可以找到找到剔除drawable中未被使用的图片资源文件,这个下次在写。