使用python 和 lint 删除项目无用资源的方法


Posted in Python onDecember 20, 2017

有部分老项目是在Eclipse环境开发的,最近公司要求应用瘦身,老项目也在其中。如果在 AS 下开发就不会有这样的问题,但是在 Eclipse 中就不太方便了,于是就写了这个脚本。第一次用Python写东西,代码里可能会有许多 Java、C 这样的痕迹,见谅。

使用方法

将 python 目录下的 delUnused.py 放到项目目录下,然后直接运行即可。

代码说明

利用lint进行代码审查

lint --check UnusedResources --xml [resultPath] [projectPath]

命令含义是检查项目中未使用的资源文件,并且用xml格式输出结果,需要提供检查结果输出的路径和项目路径。在脚本中已经自动提供了。

def exec_lint_command():
 cmd = 'lint --check UnusedResources --xml %s %s' % (_get_lint_result_path(), _get_project_dir_path())
 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
 c = p.stdout.readline().decode()
 while c:
  print(c)
  c = p.stdout.readline().decode()

这里给一个检查结果实例吧

<issue
  id="UnusedResources"
  severity="Warning"
  message="The resource `R.layout.activity_all_player` appears to be unused"
  category="Performance"
  priority="3"
  summary="Unused resources"
  explanation="Unused resources make applications larger and slow down builds."
  errorLine1="<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
"
  errorLine2="^"
  quickfix="studio">
  <location
   file="res\layout\activity_all_player.xml"
   line="2"
   column="1"/>
 </issue>

我们能用到的信息有 id message location 等。

解析检查结果

我是利用 minidom 解析的,具体的解析方法不多说,参考。

获取根节点

def _parse_lint_report():
 file = minidom.parse(_get_lint_result_path())
 root = file.documentElement
 beans = _parse_xml(root)
 return beans

解析第一层子节点

def _parse_xml(element, beans=None):
 if beans is None:
  beans = []
 for node in element.childNodes:
  if node.nodeName == ISSUE_KEY and node.nodeType is node.ELEMENT_NODE:
   lint_bean = _LintBean()
   lint_bean.id = node.getAttribute(ID_KEY)
   lint_bean.severity = node.getAttribute(SEVERITY_KEY)
   lint_bean.message = node.getAttribute(MESSAGE_KEY)
   _parse_location(node, lint_bean)
   lint_bean.print()
   beans.append(lint_bean)
 return beans

解析location 子节点

def _parse_location(node, bean):
 if not node.hasChildNodes():
  return
 for child in node.childNodes:
  if child.nodeName == LOCATION_KEY and node.nodeType is node.ELEMENT_NODE:
   bean.location.file = child.getAttribute(LOCATION_FILE_KEY)
   bean.location.line = child.getAttribute(LOCATION_LINE_KEY)
   bean.location.column = child.getAttribute(LOCATION_COLUMN_KEY)

用Java习惯了,解析数据喜欢用Bean

class _Location(object):
 def __init__(self):
  self.file = ''
  self.line = 0
  self.column = 0

class _LintBean(object):
 def __init__(self):
  self.id = ''
  self.severity = ''
  self.message = ''
  self.location = _Location()

 def print(self):
  print('find a %s, cause: %s. filePath: %s. line: %s' % (
   self.id, self.message, self.location.file, self.location.line))

处理无用资源

解析完数据,可以得到三种资源:

  • Drawable,就一个文件,可以直接删
  • xml中的一个节点,但是这个xml中就这一个节点,直接删文件
  • xml中的一个节点,这个xml中有多个节点,删除节点

对这三种资源进行区分和删除

for lint in lint_result:
 total_unused_resource += 1
 if lint.id != 'UnusedResources':
  continue
 if lint.location.line != '':
  is_single = _is_single_node(lint.location.file)
  if is_single:
   total_del_file += 1
   del_file(lint.location.file)
  else:
   total_remove_attr += 1
   node_name = get_node_name(lint.message)
   del_node(lint.location.file, node_name)
 else:
  total_del_file += 1
  del_file(lint.location.file)

删除文件

def del_file(file_path):
 try:
  os.remove(file_path)
  print('remove %s success.' % file_path)
 except FileNotFoundError:
  print('remove %s error.' % file_path)

删除节点:

def del_node(file_path, node_name):
 file = minidom.parse(file_path)
 root = file.documentElement
 nodes = root.childNodes
 for node in nodes:
  if node.nodeType in (node.TEXT_NODE, node.COMMENT_NODE):
   continue
  if node_name == node.getAttribute('name'):
   root.removeChild(node)
   file.writexml(open(file_path, 'w', encoding='UTF-8'), encoding='UTF-8')
   print('remove %s, node_name:%s. success!' % (file_path, node_name))
   return

总结

以上所述是小编给大家介绍的使用python 和 lint 删除项目无用资源的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python实现将n个点均匀地分布在球面上的方法
Mar 12 Python
详解python中的线程
Feb 10 Python
使用python进行拆分大文件的方法
Dec 10 Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 Python
Python生成个性签名图片获取GUI过程解析
Dec 16 Python
Pytorch基本变量类型FloatTensor与Variable用法
Jan 08 Python
Python如何用filter函数筛选数据
Mar 05 Python
在python中list作函数形参,防止被实参修改的实现方法
Jun 05 Python
Python优秀开源项目Rich源码解析的流程分析
Jul 06 Python
Python 在局部变量域中执行代码
Aug 07 Python
python实现语音常用度量方法的代码详解
May 25 Python
分享python函数常见关键字
Apr 26 Python
python机器学习实战之K均值聚类
Dec 20 #Python
Python绘制3d螺旋曲线图实例代码
Dec 20 #Python
python机器学习实战之最近邻kNN分类器
Dec 20 #Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
Dec 20 #Python
浅谈Python实现Apriori算法介绍
Dec 20 #Python
利用Python如何生成hash值示例详解
Dec 20 #Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
Dec 20 #Python
You might like
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
PHP中的正则表达式函数介绍
2012/02/27 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
Jquery实现动态切换图片的方法
2015/05/18 Javascript
浅析2种JavaScript继承方式
2015/12/04 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
el-select数据过多懒加载的解决(loadmore)
2019/05/29 Javascript
小程序登录之支付宝授权的实现示例
2019/12/13 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
如何在node环境实现“get数据解析”代码实例
2020/07/03 Javascript
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
Python pandas实现excel工作表合并功能详解
2019/08/29 Python
基于jupyter代码无法在pycharm中运行的解决方法
2020/04/21 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
美国庭院家具购物网站:AlphaMarts
2019/04/10 全球购物
C#面试问题
2016/07/29 面试题
教师求职信范文分享
2013/12/27 职场文书
销售人员获奖感言
2014/02/05 职场文书
工程力学专业自荐信范文
2014/03/17 职场文书
百万英镑观后感
2015/06/09 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
Python中requests做接口测试的方法
2021/05/30 Python
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android