U8SDK——BUG(meta-data节点重复的BUG)
之前@涛涛同学发现了一个打包工具的BUG,这里备注修复一下在apk_utils.py中的writeManifestMetaInfo方法中,我们会排查重复的项,避免meta-data的重复。但是之前查重代码是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
appNode = root.find('application') if appNode is None: return metaDataList = appNode.findall('meta-data') if metaDataList != None: for metaDataNode in metaDataList: keyName = metaDataNode.attrib[key] for child in channel['params']: if keyName == child['name'] and child['bWriteInManifest'] == '1': file_utils.printF("The meta-data node repeated. "+keyName) metaDataList.remove(metaDataNode) |
这个代码乍看没啥问题,加打印信息也是正常执行的。
但是最终打出来的包里,如果渠道SDK参数里面有某个属性需要写入到AndroidManifest.xml,恰巧游戏原来的AndroidManifest.xml里面正好有一个一模一样的meta-data.那么会导致最终的AndroidManifest.xml里面有两个重名的meta-data.
这个BUG是因为我们在remove的时候,用过了对象。我们的本意是查出有重复的,则把原来的给删除掉。
然后xml中的节点,我们需要用父节点删除子节点。而上面的代码,我们使用的是metaDataList.remove(),这样删除的仅仅是队列里面的项,而AndroidManifest.xml中的节点依然还在。
所以这里,我们需要将metaDataList.remove(metaDataNode)给改为appNode.remove(metaDataNode).最终代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
appNode = root.find('application') if appNode is None: return metaDataList = appNode.findall('meta-data') if metaDataList != None: for metaDataNode in metaDataList: keyName = metaDataNode.attrib[key] for child in channel['params']: if keyName == child['name'] and child['bWriteInManifest'] == '1': file_utils.printF("The meta-data node repeated. "+keyName) appNode.remove(metaDataNode) |
请在使用u8sdk的童鞋记得对应的修复一下!!!这里感谢@涛涛同学。欢迎童鞋们在使用过程中遇到BUG,及时回馈给我。我会及时修复。
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=1625