U8SDK——如何满足某个游戏的特殊需求
今天 @盛同志提了一个问题,也是U8SDK之前没有考虑到的问题。问题描述如下:游戏母包中接入了一个推送插件,比如个推。但是个推的一个provider的 android:authorities属性需要替换为downloads.第三方包名 这样的格式。但是我们知道,通过U8SDK打包,各个渠道包的包名都是不一样的。虽然,我们在U8SDK中,各个渠道SDK可以有自己的特殊操作脚本,这里用渠道SDK特殊操作脚本(可以看这篇博客了解)来实现这个需求,就太不和谐了。而这个只能作为某款游戏自己的特殊业务需求。所以,我们需要像对各个渠道SDK一样,也为每个游戏定义一个特殊化操作脚本。这样,上面类似的需求,我们就可以放在游戏的特殊化脚本中完成。还算完美的解决方案了。首先,我们将每个游戏的特殊化操作脚本,命名为post_script.py(PS:含义为打包后期处理脚本),放在打包工具/config/games/游戏名称/scripts/post_script.py下。比如U8SDK自带的测试游戏的话,放在打包工具/config/games/game1/scripts/post_script.py。然后,我们定义一个操作接口:
1 2 3 4 5 |
def execute(game, channel, decompileDir, packageName): return 0 end |
然后,在打包工具/scripts/core.py中,apk_utils.doSDKScript操作之后,我们调用一次apk_utils.doGamePostScript方法。这个方法的实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
def doGamePostScript(game, channel, decompileDir, packageName): scriptDir = file_utils.getFullPath("config/games/"+game['appName']+"/scripts") if not os.path.exists(scriptDir): print("The sdk post script is not exists. return success") return 0 sdkScript = os.path.join(scriptDir, "post_script.py") if not os.path.exists(sdkScript): return 0 sys.path.append(scriptDir) import post_script ret = post_script.execute(game, channel, decompileDir, packageName) del sys.modules['post_script'] sys.path.remove(scriptDir) return ret |
这样,我们就为每个游戏定义了一个特殊话操作脚本。那么,上面的案例,我们就来简单实现一下。比如我们现在的游戏是game1,那么,我们在game1/scripts/目录下定义一个post_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 44 45 46 47 48 49 50 51 52 53 |
import file_utils import apk_utils import os import os.path import config_utils 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(game, channel, decompileDir, packageName): print("Now to execute post_script...") manifest = decompileDir + '/AndroidManifest.xml' ET.register_namespace('android', androidNS) key = '{' + androidNS + '}authorities' tree = ET.parse(manifest) root = tree.getroot() appNode = root.find('application') if appNode is None: return 1 providerNodes = appNode.findall('activity') if providerNodes is None: return 1 for providerNode in providerNodes: name = providerNode.attrib[key] if name == 'com.igexin.download.DownloadProvider': authorities = "downloads."+packageName providerNode.set(key, authorities) break tree.write(manifest, 'UTF-8') return 0 |
这样,用打包脚本执行一次打包,随便打一个渠道包。然后在打包工具/workspaces/游戏名称/decompile/AndroidManifest.xml打开看一看,找到com.igexin.download.DownloadProvider 看看他的android:authorities属性,是否已经变成了downloads.其中为当前渠道包的包名
以后有类似的需求,都可以放在这个脚本中完成。
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=1833