使用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实现服务器中只重载被修改的进程的方法
Apr 30 Python
python统计cpu利用率的方法
Jun 02 Python
Python实现压缩与解压gzip大文件的方法
Sep 18 Python
Python+树莓派+YOLO打造一款人工智能照相机
Jan 02 Python
python 接口测试response返回数据对比的方法
Feb 11 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
tensorboard显示空白的解决
Feb 15 Python
Python如何批量获取文件夹的大小并保存
Mar 31 Python
Python如何实现后端自定义认证并实现多条件登陆
Jun 22 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 Python
Python Pandas常用函数方法总结
Jun 15 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 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
javascript 面向对象编程 function也是类
2009/09/17 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
javascript跨域总结之window.name实现的跨域数据传输
2015/11/01 Javascript
js获取图片宽高的方法
2015/11/25 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
Jquery AJAX POST与GET之间的区别详细介绍
2016/10/17 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
JS使用栈判断给定字符串是否是回文算法示例
2019/03/04 Javascript
express框架下使用session的方法
2019/07/31 Javascript
JS实现联想、自动补齐国家或地区名称的功能
2020/07/07 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
python3序列化与反序列化用法实例
2015/05/26 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
python进程和线程用法知识点总结
2019/05/28 Python
Python Django 简单分页的实现代码解析
2019/08/21 Python
python如何写try语句
2020/07/14 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
精彩的大学生自我评价
2013/11/17 职场文书
日本语毕业生自荐信
2014/02/01 职场文书
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
产假请假条
2014/04/10 职场文书
奥巴马开学演讲稿
2014/05/15 职场文书
团拜会策划方案
2014/06/07 职场文书
幼儿园见习报告范文
2014/10/30 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
检讨书范文大全
2015/05/07 职场文书
素质教育培训心得体会
2016/01/19 职场文书
go语言中json数据的读取和写出操作
2021/04/28 Golang