使用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如何生成hash值示例详解
Dec 20 Python
python opencv之SIFT算法示例
Feb 24 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
pandas 小数位数 精度的处理方法
Jun 09 Python
caffe binaryproto 与 npy相互转换的实例讲解
Jul 09 Python
python调用staf自动化框架的方法
Dec 26 Python
Django对models里的objects的使用详解
Aug 17 Python
python之array赋值技巧分享
Nov 28 Python
Python实现分数序列求和
Feb 25 Python
python——全排列数的生成方式
Feb 26 Python
Pycharm如何导入python文件及解决报错问题
May 10 Python
Python字典的基础操作
Nov 01 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
SONY ICF-SW7600的电路分析
2021/03/02 无线电
PHP.MVC的模板标签系统(二)
2006/09/05 PHP
用PHP为SHOPEX增加日志功能代码
2010/07/02 PHP
PHP安全性漫谈
2012/06/28 PHP
基于PHP文件操作的详细诠释
2013/06/21 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
jQuery 表单验证扩展(三)
2010/10/20 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
JavaScript初学者应注意的七个细节详细介绍
2012/12/27 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
基于javascript的异步编程实例详解
2017/04/10 Javascript
Vue组件化开发思考
2018/02/02 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
2020/05/13 Javascript
JQuery获得内容和属性方法解析
2020/05/30 jQuery
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
2020/08/06 Javascript
python的三目运算符和not in运算符使用示例
2014/03/03 Python
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
python学习数据结构实例代码
2015/05/11 Python
Python KMeans聚类问题分析
2018/02/23 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
设计模式的基本要素是什么
2014/04/21 面试题
公积金转移接收函
2014/01/11 职场文书
函授大学生自我鉴定
2014/02/05 职场文书
个人廉洁自律承诺书
2014/03/27 职场文书