Unity Android SDK 管理方案

之前在框架中使用SDKManager来解决不同渠道使用不同SDK的问题,但是这个方案的问题是,在一个项目中切换渠道是方便了(也不是特别方便),在不同的项目中同一套SDK还是要接入多次,所以想要做一个能够支持在多个项目中同一个SDK也只需要接入一次的方案。

我的思路是,首先调整框架的SDKManager,使它暴露出登陆、支付、数据上报和广告四个接口,在unity工程中不再导入渠道的SDK,而是在导出的APK中,我们再将他重新解包并放入我们需要的SDK,并且调整一些其他资源。

为达到这一目标,我们需要一个APK重打包工具,这个工具可以根据我们的渠道和游戏,从SDK库中取出我们所需要的SDK文件和对应的配置文件,放入我们的APK中,再将APK使用我们指定的KeyStore重新打包。

除此之外,我们还需要维护SDK库文件和配置文件。

可以在github中找到我的APK重打包工具和我的SDK库文件

APK重打包工具

思想是使用apktool 执行 apktool.jar d -f <apk Path> -o <output Path> 来进行对Apk包的解包

在解包之后,我们可以通过我们预设的规则来对添加我们的SDK文件,调整AndroidManifest等

还有通过
dx.jar --dex --output=<aimPath> <jarPath> //jar文件转换成dex文件
baksmali.jar --o=<smaliPath> <dexPath> //dex文件转换成smali文件
这两个命令将我们的jar包转变成smail文件放入我们的APK目录内。

再使用 apktool.jar b <output Path> 命令重新打包

然后使用 jarsigner -verbose -keystore <keystore Path> <apk path> -storepass <keystore password> <alias> 对APK进行重签名 这里要注意在java1.6以后版本要加上-digestalg SHA1 -sigalg MD5withRSA参数,否则可能会出现安装失败

之后可以使用zipalign -f -v 4 <apkPath> <outPath>给APK进行字节对齐优化

SDK库文件

在根目录下的Interface文件夹下,放有我们的总接口文件SDKInterface.jar

每个SDK有一个单独的文件夹,在此文件夹下的根目录储存了每个SDK与我们的接入代码的jar包,还有一个config.json文件,存储了这个SDK所需的设置和参数
在此文件夹下还有lib、res和assets三个文件夹,重打包工具会把他们原样复制到APK的同名文件夹下。

架构思想

Unity 通过 C#端访问一个Java的固定接口SDKInterface
然后再通过这个接口,去读取存放在Assets下的配置文件SdkManifest.properties来获取到ILoginIPayIlogIADIOther接口的实现类

打包时,Unity只需要导出一个不含任何SDK只包括c#接口的母包,通过重打包工具把对应的接口实现类与SDK一同合并进去就可以了。

kisence

潮落江平未有风。