最近有同学在使用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这个方法里,将下面这段代码:
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)
1
2
3
4
5
6
7
8
9
10
paramNodes=configNode.find("params")
ifparamNodes!=Noneandlen(paramNodes)>0:
channel['params']=[]
forparamNodeinparamNodes:
param={}
param['name']=paramNode.get('name')
param['value']=paramNode.get('value')
channel['params'].append(param)
修改为如下格式,增加bWriteInManifest和bWriteInClient参数的解析。
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)
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")
ifparamNodes!=Noneandlen(paramNodes)>0:
channel['params']=[]
forparamNodeinparamNodes:
param={}
param['name']=paramNode.get('name')
param['value']=paramNode.get('value')
writeInManifest=paramNode.get('bWriteInManifest')
writeInClient=paramNode.get('bWriteInClient')
ifwriteInClient==NoneandwriteInManifest==None:
writeInClient='1'
writeInManifest='0'
ifwriteInManifest==None:
writeInManifest='0'
ifwriteInClient==NoneandwriteInManifest!='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里的参数给过滤下.将原来的代码片段:
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
ifchannel['params']!=Noneandlen(channel['params'])>0:
forparaminchannel['params']:
proStr=proStr+param['name']+"="+param['value']+"\n"
file_utils.printF("The developInfo is "+proStr)
修改为:
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)
1
2
3
4
5
6
ifchannel['params']!=Noneandlen(channel['params'])>0:
forparaminchannel['params']:
ifparam['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增加一个方法,拷贝到文件最后面即可。
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")
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
defwriteManifestMetaInfo(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')
ifappNodeisNone:
return
metaDataList=appNode.findall('meta-data')
ifmetaDataList!=None:
formetaDataNodeinmetaDataList:
keyName=metaDataNode.attrib[key]
forchildinchannel['params']:
ifkeyName==child['name']andchild['bWriteInManifest']=='1':
file_utils.printF("The meta-data node repeated. "+keyName)
metaDataList.remove(metaDataNode)
forchildinchannel['params']:
ifchild['bWriteInManifest']!=Noneandchild['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的调用。
添加后,这块代码像这样:
apk_utils.writeDevelopInfo(channel, decDir)
apk_utils.writeSupportInfo(channel, decDir)
apk_utils.writeManifestMetaInfo(channel, decDir)
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里面的属性是否也正确。