Android 手游聚合SDK小知识(二) 聚合分包

Android 手游聚合SDK小知识(一)
Android 手游聚合SDK小知识(二) 聚合分包

更新:

在上一篇文章中,我们介绍了如何聚合SDK的基本原理,介绍了聚合SDK的接口设计,那么当CP接入了我们的聚合SDK,给了我们游戏apk包时,这时我们又当如何分发渠道包呢?

分发渠道包:

该操作方式都是在只有游戏apk包的情况下进行的

开始合包

1、apk反编译

apk反编译使用apktool这个工具,可以将apk文件反编译,apk命令如下

java -jar D:\apktool.jar d apk路径 -o 反编译输出目录的路径

将母包apk和SDK包反编译处理得到待合并资源。

2、SDK资源合并

2.1、合并assets目录

将SDK的assets目录下的资源复制到母包的assets目录下,注意文件名不要冲突,如果冲突请修改SDK的文件命名方式。

2.2、合并lib目录

将SDK的lib目录下的文件复制到母包的lib目录下,但是要注意,复制的时候要以母包的目录为准,举个例子,SDK的lib目录下有x86和x86_64两个目录,母包的lib目录只有x86_64一个目录,则合并的时候,以母包为准,只保留x86_64这一个目录。

2.3、合并res目录下的资源

res目录下一般包括以下几个目录:

  • layout:布局文件
  • anim:存放动画定义文件
  • color:存放自定义颜色文件
  • menu:存放菜单自定义文件
  • xml:存放配置文件
  • drawable/mipmap:存放图片文件
  • raw:存放不压缩文件
  • values:存放主题样式,字符串等文件
    注意:合并文件的时候,可能会出现文件名重复的问题,所以这就要求我们的SDK的文件名和母包的文件名不一致,建议SDK的文件命名的时候加个前缀.

以上目录除values外,其他目录的合并方式:
直接将SDK的文件复制到母包下就行,有同名的改一下SDK的命名方式。

values目录文件下除public.xml文件外的合并:
将SDK有,母包没有的目录直接复制过去,例如SDK有values-zh目录,母包没有这个目录,就将SDK整个目录复制到母包里。
如果SDK有,母包也有的目录,则合并目录中的文件内容,比如string.xml或color.xml等,将SDK对应文件的内容复制到母包中,如果内容命名方式相同,例如#3F51B5这样的name,母包和SDK都有,则想办法将SDK的name命名方式修改掉,如果是系统参数或修改不了,则保留母包的。

values目录文件下public.xml文件的合并:
一般来说,我们做SDK,不要使用R.id或R.layout等资源引用方式,而是使用getIdentifier()这种方式来动态获取资源ID。
如果母包和SDK都使用了getIdentifier()来获取资源ID,则把两个public.xml都删掉,或者保留母包与SDK任何一个的public.xml都行,因为这个时候没有使用到R资源,你都删掉或者保留任何一个都行。
但是有的时候会遇到没有使用”行规“, 动态获取资源id,而是使用R.id的方式,这种情况下有下面几种处理方式。
一、保留母包的public.xml,删掉SDK的public.xml。
二、保留SDK的public.xml,删掉母包的public.xml。
三、合并两个public.xml并重新赋值,并且遍历smali的R l a y o u t . s m a l i 或 R layout.smali或R layout.smaliRcolor.smali等R文件,修改对应的值。

这三种方法,如果是母包没有用getIdentifier()来获取资源ID,则可以用1,3方法,如果是SDK没有用getIdentifier()来获取资源ID,则可以用2、3方法,如果是双方都没用getIdentifier()来获取资源ID,则只能使用3方法。因为我公司的游戏是自研游戏,母包是按照getIdentifier()来获取资源ID的,所以我直接用了2方法,后续我应该会出一篇文章讲一下怎么合并public.xml和R文件,大家也可以自己百度搜索一下,我发现也有人讲这个。

2.4、合并smali文件

合并smali文件要注意以下几点:
一、删除游戏母包中负责聚合SDK的文件,因为SDK复制进来后,防止没法覆盖掉旧的,同时存在两个聚合SDK文件,导致引用错误。
二、把SDK中的smali文件复制到游戏母包,直接覆盖原文件,注意是直接覆盖,有重复的不管他,直接覆盖。

注意,第二步时,有的时候会出现65535的错误,因为smali文件覆盖后,可能单个smali目录里的文件的方法数会超过65535,这个时候有两种处理方案。
一、扫描里面的方法数,如果超过65535,这种情况需要新建一个smali_calss2文件,如果smali_calss2还不够,就新建smali_calss3,直到每个smali_calss目录里的方法数都不超过65535。
二、复制SDK的smali文件时,直接在母包的下面新建smali_calss,比如母包有smali_calss和smali_calss2两个目录,则复制SDK的时候,直接新建smali_calss3开始一个个复制过去,因为母包的两个smali_calss目录没超方法数,复制的SDK的新建的smali_calss目录也没超,所以不用检查里面的方法数就可以完成smali合并,方便很多,就是同一个APK反复分发的时候,smali数会越来越多。用这个方法的话,建议使用同一个母包分发。

2.5、合并AndroidManifest.xml

把多个SDK AndroidManifest.xml文件的配置整合到一个AndroidManifest.xml中,需要注意是去掉重复的声明,比如:重复的权限声明、重复的meta-data声明等,并注意要修改启动的Activity。

2.6、修改appName或icon

appName直接去修改AndroidManifest.xml中的application节点中的android:label属性的值,如果这个值是引用的string.xml中的appName,去修改string.xml也行。
icon修改直接将新的icon复制替换到res文件夹下,记得每个倍率的都要替换。

2.7、修改versionCode,versionName:等

直接找到母包的apktool.yml文件,修改这里面的这两个参数就行了。

3、回编译

借助Apktool进行回编译即可,回编译命令如下:

java -jar D:\apktool.jar b 母包反编译输出的目录 -f -o 回编译apk的绝对路径

4、签名