美文网首页
集成打包大量资源冲突如何轻松搞定

集成打包大量资源冲突如何轻松搞定

作者: 文人陌客 | 来源:发表于2018-11-09 17:58 被阅读0次

今天遇到一个很棘手的问题,一时有点慌!先来描述一下问题。

在用打包工具集成打包时,提示有大量资源重复问题导致打包失败,看打包日志发现,母包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()

相关文章

网友评论

      本文标题:集成打包大量资源冲突如何轻松搞定

      本文链接:https://www.haomeiwen.com/subject/beboxqtx.html