使用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 相关文章推荐
PyCharm使用教程之搭建Python开发环境
Jun 07 Python
Python实现的排列组合计算操作示例
Oct 13 Python
python连接数据库的方法
Oct 19 Python
Python设计模式之观察者模式简单示例
Jan 10 Python
Python实现的rsa加密算法详解
Jan 24 Python
使用python画个小猪佩奇的示例代码
Jun 06 Python
python在回调函数中获取返回值的方法
Feb 22 Python
原来我一直安装 Python 库的姿势都不对呀
Nov 11 Python
python实现宿舍管理系统
Nov 22 Python
pytorch 数据处理:定义自己的数据集合实例
Dec 31 Python
使用Python构造hive insert语句说明
Jun 06 Python
python3中celery异步框架简单使用+守护进程方式启动
Jan 20 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
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
PHP加密解密函数详解
2015/10/28 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
ajax 缓存 问题 requestheader
2010/08/01 Javascript
用js来解决ajax读取页面乱码
2010/11/28 Javascript
javascript:window.open弹出窗口的位置问题
2014/03/18 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
javascript实现全角与半角字符的转换
2015/01/07 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
Bootstrap实现下拉菜单多级联动
2017/11/23 Javascript
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
一篇不错的Python入门教程
2007/02/08 Python
python中日期和时间格式化输出的方法小结
2015/03/19 Python
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
Python输入二维数组方法
2018/04/13 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
python 线性回归分析模型检验标准--拟合优度详解
2020/02/24 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
2021/02/01 Python
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
交通事故赔偿协议书
2014/04/15 职场文书
调解协议书
2014/04/16 职场文书
科学发展观活动总结
2014/08/28 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
责任书范本大全
2015/05/11 职场文书
银行培训心得体会范文
2016/01/09 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang
Linux系统下安装PHP7.3版本
2021/06/26 PHP