使用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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
Mar 30 Python
Python实现HTTP协议下的文件下载方法总结
Apr 20 Python
利用numpy+matplotlib绘图的基本操作教程
May 03 Python
详解Python pygame安装过程笔记
Jun 05 Python
Python实现网站注册验证码生成类
Jun 08 Python
Apache,wsgi,django 程序部署配置方法详解
Jul 01 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
Aug 30 Python
使用Fabric自动化部署Django项目的实现
Sep 27 Python
Python 词典(Dict) 加载与保存示例
Dec 06 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 Python
分享Python异步爬取知乎热榜
Apr 12 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 has encountered an Access Violation
2007/01/15 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
destoon二次开发入门示例
2014/06/20 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
TFDN图片播放器 不错自动播放
2006/10/03 Javascript
js程序中美元符号$是什么
2008/06/05 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
jQuery简单实现网页选项卡特效
2014/11/24 Javascript
浅谈Javascript变量作用域问题
2014/12/16 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
javascript中attachEvent用法实例分析
2015/05/14 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
node中间层实现文件上传功能
2018/06/11 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
webpack4简单入门实例
2018/09/06 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
vue 中固定导航栏的实例代码
2019/11/01 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
python实现简单中文词频统计示例
2017/11/08 Python
Python交互环境下实现输入代码
2018/06/22 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
HTML5中使用postMessage实现Ajax跨域请求的方法
2016/04/19 HTML / CSS
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-> (一千零一拾一元整)输出
2015/05/29 面试题
小加工厂管理制度
2014/01/21 职场文书
党支部三会一课计划
2014/09/24 职场文书
护士先进个人总结
2015/02/13 职场文书
争做文明公民倡议书
2019/06/24 职场文书
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电