U8SDK——资源合并导致属性丢失的BUG
有童鞋在使用u8sdk的时候,打包工具执行到重新生成R文件时,抛错说,找不到***属性(通常是strings.xml,dimens.xml,colors.xml中的属性)。
查了下合并前的sdk目录资源中,的确含有这些属性。但是,合并之后的文件里,确实有些属性丢失了。。。
想了想,问题肯定是出在资源合并的时候。之前,在apk_utils.py的mergeResXml方法是这样写的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
def mergeResXml(copyFrom, copyTo): if not os.path.exists(copyTo): return False aryXml = ['strings.xml','styles.xml','colors.xml','dimens.xml','ids.xml','attrs.xml','integers.xml','arrays.xml','bools.xml','drawables.xml'] basename = os.path.basename(copyFrom) f = open(copyTo) targetContent = f.read() f.close() if basename in aryXml: fromTree = ET.parse(copyFrom) fromRoot = fromTree.getroot() toTree = ET.parse(copyTo) toRoot = toTree.getroot() for node in list(fromRoot): val = node.get('name') if val != None and len(val) > 0: attrIndex = targetContent.find(val) if -1 == attrIndex: toRoot.append(node) else: file_utils.printF("The attrib is exists already. the "+val + " in " + copyTo) toTree.write(copyTo, 'UTF-8') return True return False |
这里在合并strings.xml等文件时,为了保证不造成重复条目,这里合并的时候,加了重复判定。但是,就是这个重复判定,导致了部分属性的丢失。
举个例子,按照上面这个代码,如果SDK的strings.xml中含有以下属性:
1 2 |
<string name="login">登录</string> |
而游戏母包中的strings.xml含有如下属性:
1 2 3 |
<string name="login_11">登录1</string> <string name="login_12">登录2</string> |
那么按照上面的代码,SDK的strings.xml中的login属性就会丢失。因为上面匹配是直接匹配login,这样login_11,login_12都是匹配的。打包脚本以为该条属性重复了,所以就过滤了login.
所以,这里我们加一个补丁:我们不直接匹配name的值,而是和两边的双引号一起进行匹配。这样,丢失属性的概率就很小了。修改后的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
def mergeResXml(copyFrom, copyTo): if not os.path.exists(copyTo): return False aryXml = ['strings.xml','styles.xml','colors.xml','dimens.xml','ids.xml','attrs.xml','integers.xml','arrays.xml','bools.xml','drawables.xml'] basename = os.path.basename(copyFrom) f = open(copyTo) targetContent = f.read() f.close() if basename in aryXml: fromTree = ET.parse(copyFrom) fromRoot = fromTree.getroot() toTree = ET.parse(copyTo) toRoot = toTree.getroot() for node in list(fromRoot): val = node.get('name') if val != None and len(val) > 0: valMatch = '"' + val + '"' attrIndex = targetContent.find(valMatch) if -1 == attrIndex: toRoot.append(node) else: file_utils.printF("The attrib is exists already. the "+val + " in " + copyTo) toTree.write(copyTo, 'UTF-8') return True return False |
另外一处BUG:就是在合并sdk_manifest.xml的时候,如果applicationConfigs节点里面没东西,就不会解析applicationConfigs节点的proxyApplication。
这个需要将apk_utils.py中mergeManifest方法里面的这一行判断条件
“#ff0000;”>** if appConfigNode != None and len(appConfigNode) > 0:**
** 给修改成**
“#ff0000;”>** if appConfigNode != None:**
** 即可**
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=1504