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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容