U8SDK——添加文件到apk根目录中(移动MM SDK)
有童鞋在接入移动MM SDK时,遇到了一个恶心的问题。就是移动MM SDK的jar包中包含了三个文件:CopyrightDeclaration.xml,mmiap.xml,VERSION。
恶心就恶心在,在接入SDK时,我们需要将这三个文件放到工程的根目录下,这样,打出来的apk包,这三个文件才能在apk的根目录下。
一般在Android开发中,我们通常把这些文件放在assets目录下。
不知道移动MM SDK的开发者是怎么想的。对于这种“恶心他人,方便自己”的做法,我们一贯的原则,是无声地谴责。我们要倡导的是:“恶心自己,方便他人”
那么,现在问题来了,现在大部分游戏都是采用都是cocos2dx,unity3d来开发的,他们都是通过jni来和Android进行交互。这样,你弄不好就会出现
说找不到这三个文件。
特别是在unity3d中,你就算将这三个文件拷贝到unity工程中的Plugins\Android目录下,打出来的apk包根目录下也不会包含这三个文件。那么,在我们这里,
如何来将SDK需要放在apk根目录下的文件,打到apk中呢。
基于我们的”恶心自己,方便他人“的思想。防止以后其他渠道也有类似的问题,我们需要一个统一的解决方案。使所有使用U8SDK的小伙伴,不再被他恶心到。
我们的解决方案是,在对应的渠道SDK目录下建立一个root文件夹,root里面所有的文件和子目录都将原封不动的打入apk根目录。
但是apktool也有一个蛋疼的BUG,就是直接过滤反编译后根目录下的他不认识的文件或者文件夹。所以,直接将SDK中root目录下的文件拷贝到反编译后的根目录下,是没有用的。重新打包的时候,他自动过滤了。
所以,我们只能在打包完成后,通过aapt命令,对apk包进行操作。将需要加入到根目录下的文件插入到apk包的根目录中。
以UC渠道为例:
首先,我们在U8SDKPacker\sdks\sdk\uc目录下建立一个文件夹root。然后在uc的sdk_config.xml的ops节点中增加一条:
1 2 |
<op step="5" type="copy" from="root" to="" /> |
注意,to=””,当to=””(注意这里是空字符串,没有空格)时,root目录下的所有文件将会被拷贝到反编译后的根目录下。
然后在file_utils.py中增加一个函数,这个函数就是列出指定目录下的文件,可以过滤掉指定的文件或目录:
1 2 3 4 5 6 7 8 9 10 11 12 |
def list_files(src, resFiles, igoreFiles): if os.path.exists(src): if os.path.isfile(src) and src not in igoreFiles: resFiles.append(src) elif os.path.isdir(src): for f in os.listdir(src): if src not in igoreFiles: list_files(os.path.join(src, f), resFiles, igoreFiles) return resFiles |
然后在apk_utils.py中,增加一个拷贝根目录资源的方法,就是调用aapt命令,将除了系统文件或者文件夹的其他文件都拷贝到apk的根目录下。
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 |
def copyRootFiles(apkfile, decompileDir): apkfile = file_utils.getFullPath(apkfile) aapt = file_utils.getFullToolPath("aapt") decompileDir = file_utils.getFullPath(decompileDir) igoreFiles = ['AndroidManifest.xml','apktool.yml', 'smali', 'res','lib','build','assets'] igoreFileFullPaths = [] for ifile in igoreFiles: fullpath = os.path.join(decompileDir, ifile) igoreFileFullPaths.append(fullpath) addFiles = [] addFiles = file_utils.list_files(decompileDir, addFiles, igoreFileFullPaths) if len(addFiles) <= 0: return addCmd = '"%s" add "%s"' for f in addFiles: fname = f[(len(decompileDir)+1):] addCmd = addCmd + ' ' + fname addCmd = addCmd % (aapt, apkfile) currPath = os.getcwd() os.chdir(decompileDir) file_utils.execFormatCmd(addCmd) os.chdir(currPath) |
最后,在main.py的doPack方法中,在signApk调用的前面(在签名之前调用该方法),加上该方法的调用:apk_utils.copyRootFiles(targetApk, decDir)
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=1457