背景
最近有個簡單的迭代需求,需要統計下整個項目內的Toast的msg, 這個有人說直接快捷鍵查找下,但這里比較坑爹的是項目中查出對應的有1000多處。媽呀,自己查找,還要根據查找id找到對應string,比較坑。于是就順帶練手寫了個python腳本來處理這個問題。當然編碼相對不太規范,異常處理也沒做。由于lz好久沒寫過python腳本了,相當生疏。幾乎是邊查文檔編寫,記錄寫編寫過程:
- 查找目錄下所有java文件
- 查找Java文件中含有Toast相關的行
- 在對應行中找出對應的id
- 使用id在String中查找對應的toast提示信息。
簡易語法介紹
- 函數定義 def 函數名,可以返回元組。
- 分號可以省略,通過換行來區分
- 變量不需要提前聲明
- if和for語句是這個樣子滴:
for node in root:
if node.attrib.has_key("name") > 0 :
導庫:import os
執行開始的地方還是main函數,后面會有。
1. 查找目錄下所有java文件
這個我是直接copy網上遞歸遍歷的,省略。
查找Java文件中的Toast
需要找出Toast的特征,項目中有兩個Toast類 BannerTips和ToastUtils 兩個類。
1.先代碼過濾對應的行。找到BannerTips、ToastUtils調用的地方
2.找出提示的地方
3.觀察其實項目中的id的前面均含有R.string. 可以以此作為區分。
在對應行中找出對應的id
使用id在String中查找對應的toast提示信息。
最后去重。
最后一個比較簡單,可以自己寫,也可以解析下xml寫。
import xml.etree.ElementTree as ET
tree = ET.ElementTree(file = '' + xmlFile)
root = tree.getroot()
for node in root:
if node.attrib.has_key("name") > 0 :
if(node.attrib['name'] == msg):
out.write(":%s\n" % node.text.encode('utf-8'))
貼下代碼
import os
import xml.etree.ElementTree as ET
def findStr(out, msg,fullname):
xmlFile = 'xx/src/main/res/values/radio_strings.xml'
strInfos = open(xmlFile,'r+')
tree = ET.ElementTree(file = '' + xmlFile)
root = tree.getroot()
for node in root:
if node.attrib.has_key("name") > 0 :
if(node.attrib['name'] == msg):
out.write("%s\n" % node.text.encode('utf-8'))
def findJava(fullname,out):
file= open(fullname, 'r+')
for line in file:
newline = line.strip()
if(newline.find("ToastUtils.") != -1):
lineTexts = newline.split(',')
if(len(lineTexts) <= 1):
continue
linetxt = lineTexts[1]
aa = linetxt.strip().replace(');', '')
aa = aa.replace(')', '')
if(aa.find('R.string.') != -1):
msgs = aa.split('R.string.')
if(len(msgs) <= 1):
continue
msg = msgs[1]
msg = msg.replace(' :', '');
if(msg.find('?') == -1):
if not msg:
continue
findStr(out, msg, fullname)
else:
if not msg:
continue
findStr(out, msg, fullname)
if(len(msgs) >=2):
findStr(out, msgs[1], fullname)
outDel = open('XX/android_dialogMsg.txt')
output = open('XX/android_dialog_msg.txt','r+')
s = set()
for i in outDel:
s.add(i)
for li in s:
output.write(li)
outDel.close()
output.close()
file.close()
def ListFilesToTxt(dir,file,wildcard,recursion):
exts = wildcard.split(" ")
files = os.listdir(dir)
for name in files:
fullname=os.path.join(dir,name)
if(os.path.isdir(fullname) & recursion):
ListFilesToTxt(fullname,file,wildcard,recursion)
else:
for ext in exts:
if(name.endswith(ext)):
findJava(fullname, file)
break
def Test():
dir = "xxx"
outfile='XX/android_dialogMsg.txt'
wildcard = ".java"
file = open(outfile,"w")
if not file:
print ("cannot open the file %s for writing" % outfile)
ListFilesToTxt(dir,file,wildcard, 1)
file.close()
if __name__ == '__main__':
Test()