今天遇到一个很棘手的问题,一时有点慌!先来描述一下问题。
在用打包工具集成打包时,提示有大量资源重复问题导致打包失败,看打包日志发现,母包apk跟渠道的sdk都集成google跟脸书的sdk且包含了大量资源,所以打包工具在合并资源打包时发现大量重复资源而打包失败,可惜的是工具是傻瓜式的打包还没有开发出重复资源替换的功能,这时就一脸懵逼了,难道要一个去找出来删除么,,,,上几百条的重复资源怎么办???在多方沟通无果下,还是搞个脚本去踢出吧,于是有了下面的神器,哈哈哈!
废话不多说直接上脚本,用的python2.7
其中 TEMP_RES_PATH = u'C:\\Users\\pt\\Desktop\\pool_sdk_tool_20181107-海外版\\sdk\\aiwanhaiwai\\v2.0\\poolsdkfile\\ForRes' 表示要修改的资源路径
EXPORT_JSON_PATH = './export.json' 表示要写入的冲突资源名称,不用修改
运行的时候先选择1,然后输入错误日志的地址,然后选择2即可
附上代码:
import shutil
import os
import plistlib
import subprocess
import sys
import re
import random
import json
import commands
from collections import OrderedDict
from xml.etree import ElementTree as ET
TEMP_RES_PATH = u'C:\\Users\\pt\\Desktop\\pool_sdk_tool_20181107-海外版\\sdk\\aiwanhaiwai\\v2.0\\poolsdkfile\\ForRes'
EXPORT_JSON_PATH = './export.json'
# run cmd
def run_cmd(cmd):
ret = subprocess.call(cmd, shell=True)
if ret != 0:
msg = "Error running cmd, return code: %s" % str(ret)
print(msg)
# 判断是否数字
def is_number(s):
try:
float(s)
return True
except ValueError:
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False
# 检查路径 没有就创建
def check_dir(dirPath):
if not os.path.isdir(dirPath):
os.makedirs(dirPath)
return dirPath
# 复制文件
def copy_file_in_dir(src, des):
if os.path.isfile(src):
shutil.copy(src,des)
elif os.path.isdir(src):
for item in os.listdir(src):
path = os.path.join(src, item)
if os.path.isfile(path):
shutil.copy(path,des)
if os.path.isdir(path):
new_des = os.path.join(des, item)
if not os.path.isdir(new_des):
os.makedirs(new_des)
copy_file_in_dir(path, new_des)
def delete_file_folder(src):
'''delete files and folders'''
if os.path.isfile(src):
try:
os.remove(src)
except:
print u"不存在文件:%s" % src
elif os.path.isdir(src):
for item in os.listdir(src):
itemsrc=os.path.join(src,item)
delete_file_folder(itemsrc)
try:
os.rmdir(src)
except:
pass
# 删除文件夹下全部东西
def delete_all_file_in_folder(src):
if not os.path.isdir(src):
print u"不存在路径:%s" % src
return
for item in os.listdir(src):
path = os.path.join(src, item)
delete_file_folder(path)
# 获取绝对路径
def get_current_path():
if getattr(sys, 'frozen', None):
ret = os.path.realpath(os.path.dirname(sys.executable))
else:
ret = os.path.realpath(os.path.dirname(__file__))
return ret
# 将list写入json
def dumpJsonFromList(path, config_List):
if not config_List:
return
with open(path,"w") as _config:
json.dump(config_List, _config, ensure_ascii=False, indent=2, sort_keys=False)
print u"写入json:%s" % path
# 读取json到list
def loadJsonToList(path, ignoreLog=False, isOrdered=True):
if not os.path.isfile(path):
if not ignoreLog:
print u"不存在文件:%s" % path
return False
_config = open(path,'r')
try:
fileContent = _config.read()
finally:
_config.close()
config_List = None
if isOrdered:
config_List = json.loads(fileContent, object_pairs_hook=OrderedDict)
else:
config_List = json.loads(fileContent)
return config_List
# 根据报错找出冲突属性
def oper_1():
print u"输入冲突报错txt路径"
fPath = raw_input().decode(sys.stdin.encoding)
if fPath == "" or not os.path.isfile(fPath):
print u'路径不存在'
return
if os.path.isfile(EXPORT_JSON_PATH):
delete_file_folder(EXPORT_JSON_PATH)
# path = "./errorList.txt"
m_file = open(fPath,"r")
content = ""
try:
# content = m_file.read().decode('utf-8')
content = m_file.read()
finally:
m_file.close()
temp_dict = OrderedDict()
# 重复Attribute
p = r'\\temp(\\\w+\\\w+\\)([\w\+\\-]+\.xml):\d+: error: Attribute "(\w+)" already defined with incompatible format\.'
pattern = re.compile(p)
match = True
while match:
if type(match) == bool:
match = pattern.search(content)
else:
match = pattern.search(content, match.end())
if match:
attr_key = match.group(3)
# print attr_key
p2 = r'\\temp(\\\w+\\\w+\\)([\w\+\\-]+\.xml):\d+: Original attribute defined here\.'
pattern2 = re.compile(p2)
match2 = pattern2.search(content, match.end())
if match2:
# path_key = match2.group(2)
path_key = match.group(2).encode('utf-8')
# print path_key
if not temp_dict.has_key(path_key):
temp_dict[path_key] = []
temp_dict[path_key].append(attr_key)
# 重复Resource
p = r'\\temp(\\\w+\\\w+\\)([\w\+\\-]+\.xml):\d+: error: Resource entry (\w+) is already defined\.'
pattern = re.compile(p)
match = True
while match:
if type(match) == bool:
match = pattern.search(content)
else:
match = pattern.search(content, match.end())
if match:
attr_key = match.group(3)
# print attr_key
p2 = r'\\temp(\\\w+\\\w+\\)([\w\+\\-]+\.xml):\d+: Originally defined here\.'
pattern2 = re.compile(p2)
match2 = pattern2.search(content, match.end())
if match2:
# path_key = match2.group(2)
path_key = match.group(2).encode('utf-8')
# print path_key
if not temp_dict.has_key(path_key):
temp_dict[path_key] = []
temp_dict[path_key].append(attr_key)
# bag item
p = r'\\temp(\\\w+\\\w+\\)([\w\+\\-]+\.xml):\d+: error: Resource entry ([\w\.]+) already has bag item ([\w:]+)\.'
pattern = re.compile(p)
match = True
while match:
if type(match) == bool:
match = pattern.search(content)
else:
match = pattern.search(content, match.end())
if match:
attr_key = match.group(3)
# print attr_key
p2 = r'\\temp(\\\w+\\\w+\\)([\w\+\\-]+\.xml):\d+: Originally defined here\.'
pattern2 = re.compile(p2)
match2 = pattern2.search(content, match.end())
if match2:
# path_key = match2.group(2)
path_key = match.group(2).encode('utf-8')
# print path_key
if not temp_dict.has_key(path_key):
temp_dict[path_key] = []
temp_dict[path_key].append(attr_key)
dumpJsonFromList(EXPORT_JSON_PATH, temp_dict)
# 删除xml里的冲突属性
def oper_2():
j_list = loadJsonToList(EXPORT_JSON_PATH)
if not j_list:
return
for path in j_list:
xml_path = os.path.join(os.path.normpath(TEMP_RES_PATH), os.path.normpath(path))
print xml_path
if os.path.isfile(xml_path):
tree = ET.parse(xml_path)
root = tree.getroot()
childs = root.getchildren()
for child in childs:
# if path == u'values\\attrs_aiwanhaiwai2.xml':
# print child.attrib
if child.attrib['name'] in j_list[path]:
# print child.attrib['name']
print child.attrib['name']
childs.remove(child)
# out_path = "./test.xml"
print '-------------------'
tree.write(xml_path, encoding="utf-8",xml_declaration=True)
# # xml_path = './bools.xml'
# xml_path = './attrs.xml'
# tree = ET.parse(xml_path)
# root = tree.getroot()
# childs = root.getchildren()
# for child in childs:
# if child.attrib['name'] in t_attr:
# # print child.attrib['name']
# childs.remove(child)
# out_path = "./test.xml"
# tree.write(out_path, encoding="utf-8",xml_declaration=True)
def main():
print u'''
---------------------------
1 : 导出json
2 : 处理xml'''
try:
params = raw_input()
params = params.split(" ")
f = globals().get("oper_" + params[0], None)
if f != None:
f()
else:
return
# pass
except Exception, e:
print(e)
raw_input("err! press any key to exit")
sys.exit()
if __name__ == "__main__":
while True:
main()