使用python 和 lint 删除项目无用资源的方法
有部分老项目是在Eclipse环境开发的,最近公司要求应用瘦身,老项目也在其中。如果在AS下开发就不会有这样的问题,但是在Eclipse中就不太方便了,于是就写了这个脚本。第一次用Python写东西,代码里可能会有许多Java、C这样的痕迹,见谅。
使用方法
将python目录下的delUnused.py放到项目目录下,然后直接运行即可。
代码说明
利用lint进行代码审查
lint--checkUnusedResources--xml[resultPath][projectPath]
命令含义是检查项目中未使用的资源文件,并且用xml格式输出结果,需要提供检查结果输出的路径和项目路径。在脚本中已经自动提供了。
defexec_lint_command(): cmd='lint--checkUnusedResources--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() whilec: print(c) c=p.stdout.readline().decode()
这里给一个检查结果实例吧
我们能用到的信息有idmessagelocation等。
解析检查结果
我是利用minidom解析的,具体的解析方法不多说,参考。
获取根节点
def_parse_lint_report(): file=minidom.parse(_get_lint_result_path()) root=file.documentElement beans=_parse_xml(root) returnbeans
解析第一层子节点
def_parse_xml(element,beans=None): ifbeansisNone: beans=[] fornodeinelement.childNodes: ifnode.nodeName==ISSUE_KEYandnode.nodeTypeisnode.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) returnbeans
解析location子节点
def_parse_location(node,bean): ifnotnode.hasChildNodes(): return forchildinnode.childNodes: ifchild.nodeName==LOCATION_KEYandnode.nodeTypeisnode.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() defprint(self): print('finda%s,cause:%s.filePath:%s.line:%s'%( self.id,self.message,self.location.file,self.location.line))
处理无用资源
解析完数据,可以得到三种资源:
- Drawable,就一个文件,可以直接删
- xml中的一个节点,但是这个xml中就这一个节点,直接删文件
- xml中的一个节点,这个xml中有多个节点,删除节点
对这三种资源进行区分和删除
forlintinlint_result: total_unused_resource+=1 iflint.id!='UnusedResources': continue iflint.location.line!='': is_single=_is_single_node(lint.location.file) ifis_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)
删除文件
defdel_file(file_path): try: os.remove(file_path) print('remove%ssuccess.'%file_path) exceptFileNotFoundError: print('remove%serror.'%file_path)
删除节点:
defdel_node(file_path,node_name): file=minidom.parse(file_path) root=file.documentElement nodes=root.childNodes fornodeinnodes: ifnode.nodeTypein(node.TEXT_NODE,node.COMMENT_NODE): continue ifnode_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删除项目无用资源的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!