U8SDK——区分参数存储的位置(assets目录中还是AndroidManifest.xml中)
最近有同学在使用U8SDK接入360SDK的时候,发现了一个问题。就是360渠道SDK需要的APPID等参数是需要放在AndroidManifest.xml中的。而
u8sdk里面,则是把这些参数放在各个渠道SDK配置目录下的config.xml中,然后打包工具在打包的时候,会将这些信息统一地写入到assets目录下的
develop_config.properties文件中。
现在这个问题,也很好解决。我们在config.xml中配置params的时候,我们在每个param里面增加两个属性。bWriteInManifest和bWriteInClient
如果bWriteInManifest=1,打包的时候,打包工具就将该参数添加到AndroidManifest.xml的meta-data里面。
如果bWriteInClient=1,或者你不配置,默认情况就将该参数添加到develop_config.properties文件中。
(注:新版U8SDK已经支持了)
那么对于已经在使用u8sdk的童鞋们,可以按照如下步骤来添加对应的支持。同时,顺便也熟悉了解下打包脚本的原理吧。
首先在config_utils.py里面loadChannelUserConfig这个方法里,将下面这段代码:
1 2 3 4 5 6 7 8 9 10 |
paramNodes = configNode.find("params") if paramNodes != None and len(paramNodes) > 0: channel['params'] = [] for paramNode in paramNodes: param = {} param['name'] = paramNode.get('name') param['value'] = paramNode.get('value') channel['params'].append(param) |
修改为如下格式,增加bWriteInManifest和bWriteInClient参数的解析。
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 |
paramNodes = configNode.find("params") if paramNodes != None and len(paramNodes) > 0: channel['params'] = [] for paramNode in paramNodes: param = {} param['name'] = paramNode.get('name') param['value'] = paramNode.get('value') writeInManifest = paramNode.get('bWriteInManifest') writeInClient = paramNode.get('bWriteInClient') if writeInClient == None and writeInManifest == None: writeInClient = '1' writeInManifest = '0' if writeInManifest == None: writeInManifest = '0' if writeInClient == None and writeInManifest != '1': writeInClient = '1' param['bWriteInManifest'] = writeInManifest param['bWriteInClient'] = writeInClient channel['params'].append(param) |
这样,就将config.xml里面param配置里面的bWriteInManifest和bWriteInClient属性解析出来了。解析完了,还不行。我们需要根据这两个属性将
该参数分别填写到develop_config.properties和AndroidManifest.xml里面
首先,我们需要在config_utils.py里的writeDeveloperProperties里面将写入develop_config里的参数给过滤下.将原来的代码片段:
1 2 3 4 5 |
if channel['params'] != None and len(channel['params']) > 0: for param in channel['params']: proStr = proStr + param['name'] + "=" + param['value'] + "\n" file_utils.printF("The developInfo is "+proStr) |
修改为:
1 2 3 4 5 6 |
if channel['params'] != None and len(channel['params']) > 0: for param in channel['params']: if param['bWriteInClient'] == '1': proStr = proStr + param['name'] + "=" + param['value'] + "\n" file_utils.printF("The developInfo is "+proStr) |
这样,只有config.xml里面bWriteInClient=1的那些参数才会被写入到develop_config.properties.里面
紧接着,我们还需要将那些bWriteInManifest=1的参数添加到AndroidMananifest.xml中。我们需要在apk_utils.py增加一个方法,拷贝到文件最后面即可。
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 32 33 34 35 |
def writeManifestMetaInfo(channel, decDir): manifestFile = decDir + "/AndroidManifest.xml" manifestFile = file_utils.getFullPath(manifestFile) ET.register_namespace('android', androidNS) tree = ET.parse(manifestFile) root = tree.getroot() key = '{'+androidNS+'}name' val = '{'+androidNS+'}value' 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) for child in channel['params']: if child['bWriteInManifest'] != None and child['bWriteInManifest'] == '1': metaNode = SubElement(appNode, 'meta-data') metaNode.set(key, child['name']) metaNode.set(val, child['value']) tree.write(manifestFile, 'UTF-8') file_utils.printF("The manifestFile meta-data write successfully") |
这个方法就是将所有bWriteInManifest=1的参数添加到AndroidManifest.xml中的meta-data中。
然后,在main.py里面的doPack方法中,在apk_utils.writeSupportInfo(channel, decDir)行的下面一行,添加writeManifestMetaInfo的调用。
添加后,这块代码像这样:
1 2 3 4 |
apk_utils.writeDevelopInfo(channel, decDir) apk_utils.writeSupportInfo(channel, decDir) apk_utils.writeManifestMetaInfo(channel, decDir) |
最后,为了验证是否有些参数可以被添加到AndroidManifest.xml中。你修改下main.py里面doPack方法,注释掉file_utils.del_file_folder(workDir)。
然后,执行pack_debug.bat打包工具,打包完成后,在u8work/渠道名称/decompile/目录下,打开AndroidManifest.xml文件,看看里面是否有你需要添加的参数。同时,看decompile目录下面assets目录下面develop_config.properties里面的属性是否也正确。
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=1465