U8SDK——如何满足渠道SDK的特殊需求
部分渠道SDK会有一些特殊的操作,比如UC,需要将最后的AndroidManifest.xml中所有的activity的android:launchMode设置为“standard”.因为8sdk设计的目的是统一的SDK接入框架,不能因为某些渠道SDK有特殊,我们就败坏了上层抽象层或者在游戏里面去满足这些特殊操作。
但是,这些特殊操作,又不能不实现。所以,我们就在u8sdk的打包工具中,来用脚本完成这些特殊操作。具体的设计思路是:
1、定义一个脚本执行的接口,打包各个渠道SDK的时候,在最后重新打包之前,如果该SDK有特殊需要执行的脚本,那么就执行该脚本
2、如果SDK需要特殊操作,那么可以在具体的SDK配置目录下,建立一个u8_script.py,脚本里面有一个需要实现的入口,def doU8Script(channel, decDir, newPackageName, sdkDir):
3、这样,如果该渠道SDK有特殊操作,就可以在该接口中完成具体的操作了。
下面,我们来具体看下实现。我们在apk_utils.py文件中增加一个方法,来调用这个特殊脚本的接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
def doU8Script(channel, decDir, newPackageName, sdkDir): sdkScript = os.path.join(sdkDir, "u8_script.py") if not os.path.exists(sdkScript): return 0 sys.path.append(sdkDir) import u8_script ret = u8_script.execute(channel, decDir, newPackageName) del sys.modules['u8_script'] sys.path.remove(sdkDir) return ret |
然后,我们在main.py中,在
1 2 3 4 |
ret = apk_utils.insertSplashScreen(channel, decDir) if ret: return 1 |
之后调用:
1 2 3 4 |
ret = apk_utils.doU8Script(channel, decDir, newPackageName, sdkDestDir) if ret: return 1 |
这样,我们只需要在具体的sdk配置目录下,新建一个u8_script.py文件,然后里面定义一个def execute(channel, decompileDir, packageName):方法,就可以在这里完成特殊操作了。
我们以uc渠道为例,为其加上“AndroidManifest.xml中所有的activity的launchMode必须为standard”这个特殊需求。
我们在打包工具sdks/sdk/uc目录下新建一个u8_script.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 36 37 38 39 40 41 42 43 |
import file_utils import os import os.path from xml.etree import ElementTree as ET from xml.etree.ElementTree import SubElement from xml.etree.ElementTree import Element from xml.etree.ElementTree import ElementTree import os import os.path import zipfile import re import subprocess import platform from xml.dom import minidom import codecs import sys androidNS = 'http://schemas.android.com/apk/res/android' def execute(channel, decDir, newPackageName): manifestFile = decDir + "/AndroidManifest.xml" manifestFile = file_utils.getFullPath(manifestFile) ET.register_namespace('android', androidNS) key = '{' + androidNS + '}launchMode' tree = ET.parse(manifestFile) root = tree.getroot() applicationNode = root.find('application') if applicationNode is None: return 1 activityNodeLst = applicationNode.findall('activity') if activityNodeLst is None: return 1 for activityNode in activityNodeLst: activityNode.set(key, "standard") tree.write(manifestFile, 'UTF-8') return 0 |
这样,后面其他渠道SDK也有特殊需求的时候,我们就也可以在该sdk的配置目录下新建一个u8_script.py文件,实现这个特殊操作的接口就OK了
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=1517