使用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发送邮件实例
Jan 10 Python
简单掌握Python中glob模块查找文件路径的用法
Jul 05 Python
python:pandas合并csv文件的方法(图书数据集成)
Apr 12 Python
Python面向对象总结及类与正则表达式详解
Apr 18 Python
python多线程下信号处理程序示例
May 31 Python
python实现最小二乘法线性拟合
Jul 19 Python
Python利用scapy实现ARP欺骗的方法
Jul 23 Python
python字符串判断密码强弱
Mar 18 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
Python实现快速大文件比较代码解析
Sep 04 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 Python
python cv2图像质量压缩的算法示例
Jun 04 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 判断常量,变量和函数是否存在
2009/04/26 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
2019/09/30 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
2015/04/12 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
Python类属性与实例属性用法分析
2015/05/09 Python
Python实现的彩票机选器实例
2015/06/17 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
python中int与str互转方法
2018/07/02 Python
python顺序执行多个py文件的方法
2019/06/29 Python
keras中的卷积层&amp;池化层的用法
2020/05/22 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
HTML5 weui使用笔记
2019/11/21 HTML / CSS
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
美国在线家具网站:GDFStudio
2021/03/13 全球购物
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
优秀志愿者事迹材料
2014/02/03 职场文书
销售竞赛活动方案
2014/08/23 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
2014年仓管员工作总结
2014/11/18 职场文书
《1942》观后感
2015/06/08 职场文书
欠条样本
2015/07/03 职场文书