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
来获取到ILogin
、IPay
、 Ilog
、IAD
、IOther
接口的实现类
打包时,Unity只需要导出一个不含任何SDK只包括c#接口的母包,通过重打包工具把对应的接口实现类与SDK一同合并进去就可以了。