手游发行四大兵器之二---打包后台的前前后后

为何需要打包后台?
其实该实质解决的需求就是,多渠道打包。
打包后台就是类似于AnySdk的客户端一样,但我们把这些实现搬到了服务器上面。

原理:替换

由上两遍文章可以知道,打包系统最核心的工具就是替换。那么,究竟替换了什么?由一章法则四:框架
中可以知道,真正去与CP(游戏或应用)提供交互的代码其实写在了统一SDK的框架层中,而这部分代码统一了所有第三方SDK的接口,但实现第三方平台的代码其实是写在了统一SDK实现层中,所以但改变了第三方平台的实现代码,理论上是不会改变Cp调用框架层的接口,使得真正的调用与真正的实现得以分离,这种耦合关系促使我们只要把第三方SDK与统一SDK实现层替换掉就可以实现更换新的渠道。以下图为例:
这里写图片描述

由于Cp已经把A平台的资源或代码都已打包成为一个可以供Android设备安装的apk包,所以替换的工作其实是在反编译之后的进行的。因此整个替换的工作包括

1.反编译apk
2.替换代码
3.替换资源
4.修改属性
5.打包签名

反编译

常规的反编译,网上提供了足够多的教程。主要使用到apktool.jar的工具包,该工具分为很多个版本,最好使用最新版本的apktool或者次新版本,不然可能会引发反编译失败或到后面apk打包的时候,编译失败。导致这种失败主要原因为游戏打包成的Apk与我们反编译所使用的apktool.jar的版本不一致。再者apktool.jar是GOOGLE提供的APK编译工具,不同版本之间的命令有些许不一样,所以需要注意当前使用版本,而作者我目前使用的应该是比较久的版本了: apktool_2.0.0rc3

Smali文件夹
经过上述反编译之后,得到以下这些文件夹与文件:
这里写图片描述
首先来看smali,其他随后再说明。
其中相对于android在Eclipse中的工程目录中少了src文件夹而多了smali文件夹。其实Smali文件夹里面的.smali文件就是工程的源码,google把java代码转换成了这种适合运行在android设备的编译代码。因此所有的源码其实就放在smali文件夹中。而java的class文件是根据包名为路径保存的,而smali也保留这一特点,因此可以由smali文件夹名称找到java源码对应的位置。
这里写图片描述

关于文件夹的说明就不多说了,我们直接根据之前定义好的框架包名找到我们统一SDK的框架层的代码。可以看出框架层代码为frame文件夹中,baidu文件夹装载了统一SDK的实现层,而第三方sdk的源代码其实在更外面的文件夹中,这里就不铺出来了。

这里写图片描述

由于我们替换的都是经过编译后的smali的android设备代码,因此需要被替换的B平台的代码也需要经过编译与反编译,因此就会多了个B平台的反编译后的文件夹。

因为Cp游戏方只是调用TongyiSDKManager的这个类,所以这个不需要动的,而frame是框架代码,也不需要动,所以真正要替换的是baidu这个文件夹。所以在上面准备好的B平台的实现层smali文件夹中同样找到我们的框架层与实现层,例如:uc,则来uc替换掉这个baidu文件夹,就实现了统一SDK的实现层的替换了。

只替换了统一SDK的实现层是不够,还需要把uc的的源码搬过来,那么就直接把UCdemo的整个smali文件夹覆盖复制到这边smali文件夹中。由于不同平台包之前的命名大多是不一样的,所以完全可以是覆盖粘贴到smali文件夹中。
不过我确实遇到过有冲突,因此最好的方法就是,起初让cp接入一个比较纯净没有其他第三方代码的渠道包,自己模拟定义一个渠道,然后替换的时候就可以随便复制粘贴了。

替换资源

替换资源就相对简单多了,只需要把第三方平台的编译过后的资源复制过去相应的文件夹就可以了。

修改属性
主要修改的属性包括横竖屏设置,包名,targetsdkVersion,权限,主要针对的时androidmanifest.xml文件,把它修改为B平台的所需的属性。

重点 :—-打包—-签名

经过上述一轮的替换,修改,可以得到一个新的文件夹,并且针对这个文件夹,进行打包了。
由于资源更改了,那么就是R文件应该有所更新,其二进制的数值应该已经不能使用,需要更新为新的,包名更改了,所以R文件的所在的位置也需要变更,因为R文件是在包名的路径下面生成,例如包名为:com.tongyisdk.sdk的包名工程,它的R文件应该在反编译后的com/tongyisdk/sdk/R.java中。所以第一步需要生成新的R文件。

生成R文件需要用到aapt命令,aapt命令只是生成了R.java文件,还需要把它转换成android设备语言.smali文件。因此就会经历以下的步骤:

1.删除原来res/values/public.xml文件
该文件是一个声明文件,声明资源中各种组件,所以需要删掉,不然aapt的时候会告诉你,该文件已经存在,不再生成,但声明的内容错误。

2.新建文件夹gen
在整个反编译文件夹中生成新的gen文件夹。用来放置aapt之后的编译文件。如没有,则无法成功生成R.java

3.生成R.java文件
根据aapt命令

aapt package -f -m -J %ROOT%\gen -S %ROOT%\res -M %ROOT%\AndroidManifest.xml -I %ANDROID_JAR_PATH%  

%RooT% 为反编译后文件夹路径
%ANDROID_JAR_PATH%为android编译的jar,
在androidsdk/sources/17/android.jar 可以选择不同版本进行编译。

4.生成R.class
生成R.java文件会存在gen文件夹下面,所以利用javac命令生成R.class文件。

%JAVA_SDK_PATH%\javac  %R_JAVA% 

%JAVA_SDK_PATH%为jdk的路径

5.生成R.jar文件
因为R.class无法直接生成R.smali的android机器语言,要经过baksmali命令才能生成,而baksmali是针对一个dex进行编译,具体的用法可以参考:baksmali使用
而生成dex的dx命令是针对一个jar包或者zip包进行的,所以
利用java命令,生成jar.

jar cvf %COM_PATH%.jar %COM_PATH%

%COM_PATH% 为R.class的所在的文件夹下在gen里的最上层路径,例如gen/com/tongyisdk/sdk/R.class ,则
%COM_PATH%为com

6.生成R.dex文件

得到一个R.jar文件之后,需要将其编译成dex文件,而使用的工具是androidSDK提供的dx工具。dx命令与aapt命令一样,同样放在androidsdk/build-tool/文件夹下面对应的版本里面。

利用dx命令生成R.dex文件

dx --dex --output=%ROOT%\gen\R.dex %ROOT%\gen\%COM_PATH%.jar 

7.生成R.smali文件
利用baksmali.jar的工具,编译R.dex转变为R.smali

java -jar %BAKSMALI_PATH% -o %ROOT%\gen %ROOT%\gen\R.dex

8.打包签名
利用apktool工具进行打包签名。

以上的命令都是在cmd命令行中使用的。可以直接写成批处理进行多次调用。

总结
至此,一个渠道打包过程结束,将其一系列实现放进去一个linux服务器上进行,就成了一个打包后台,配合上网页提供运营人员修改一些相关属性,那么一个完成的打包后台完成。

PS: 以上的这个步骤仅能针对部分渠道实现,还有些渠道由于SDK的实现不同,导致以上打包成功后,运行apk时候出现资源找不到的错误,针对这个问题,可以使用另一种流程进行,这里就不阐述了,以上步骤已经可以应对百分95的平台需求。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值