android 文件目录story,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这个方法里,将下面这段代码:

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里面的属性是否也正确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值