python 遍歷toast msg文本

背景

最近有個簡單的迭代需求,需要統計下整個項目內的Toast的msg, 這個有人說直接快捷鍵查找下,但這里比較坑爹的是項目中查出對應的有1000多處。媽呀,自己查找,還要根據查找id找到對應string,比較坑。于是就順帶練手寫了個python腳本來處理這個問題。當然編碼相對不太規范,異常處理也沒做。由于lz好久沒寫過python腳本了,相當生疏。幾乎是邊查文檔編寫,記錄寫編寫過程:

  1. 查找目錄下所有java文件
  2. 查找Java文件中含有Toast相關的行
  3. 在對應行中找出對應的id
  4. 使用id在String中查找對應的toast提示信息。

簡易語法介紹

  1. 函數定義 def 函數名,可以返回元組。
  2. 分號可以省略,通過換行來區分
  3. 變量不需要提前聲明
  4. if和for語句是這個樣子滴:
 for node in root:

 if node.attrib.has_key("name") > 0  :

  1. 導庫:import os

  2. 執行開始的地方還是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()

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,596評論 25 708
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,779評論 18 399
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,839評論 0 11
  • 很好看!又是東野大神一部構思奇妙的經典之作,最后結局高潮迭起,驚喜不斷! 故事的開始很本格,湖畔邊的度假別墅,四對...
    烏麗曼閱讀 525評論 0 1