使用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中文编码问题小结
Sep 28 Python
python在windows下实现ping操作并接收返回信息的方法
Mar 20 Python
python的exec、eval使用分析
Dec 11 Python
python读取文件名称生成list的方法
Apr 27 Python
Python第三方Window模块文件的几种安装方法
Nov 22 Python
python实现维吉尼亚加密法
Mar 20 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
Python3实现打印任意宽度的菱形代码
Apr 12 Python
Python smtp邮件发送模块用法教程
Jun 15 Python
python中的yield from语法快速学习
Nov 06 Python
python实现数学模型(插值、拟合和微分方程)
Nov 13 Python
2021年值得向Python开发者推荐的VS Code扩展插件
Jan 25 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函数
2006/10/09 PHP
php设计模式 Prototype (原型模式)代码
2011/06/26 PHP
PHP 转义使用详解
2013/07/15 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
教大家制作简单的php日历
2015/11/17 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
2014/12/19 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
2016/07/26 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
用python删除java文件头上版权信息的方法
2014/07/31 Python
使用Python写CUDA程序的方法
2017/03/27 Python
深入浅出学习python装饰器
2017/09/29 Python
python实现类之间的方法互相调用
2018/04/29 Python
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
JupyterNotebook 输出窗口的显示效果调整方法
2020/04/13 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
python里的单引号和双引号的有什么作用
2020/06/17 Python
Python手动或自动协程操作方法解析
2020/06/22 Python
Oakley西班牙官方商店:太阳眼镜和男女运动服
2019/04/26 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
销售员求职个人的自我评价
2014/02/19 职场文书
公司经理聘任书
2014/03/29 职场文书
求职自我推荐信
2014/06/25 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
大学生入党自荐书
2015/03/05 职场文书