Android聚合SDK母包反编译出包教程

【前言】

  现在不管是游戏发行,亦或者是游戏买量,都会涉及到1个游戏项目出N个游戏包的情况,在游戏发行场景,1个游戏需要上架多个安卓应用市场,比如:上架oppo、vivo、小米、华为、应用宝、九游之类,那么1个游戏包就需要出包含不同渠道SDK的分包;在游戏买量场景,1个游戏也是需要上架多个推广媒体渠道,比如:上架头条、快手、广点通、百度之类,同时在推广时候往往还需要出各种马甲包,那么1个游戏就需要出好几百个分包,要是每一个游戏包都让研发去对接出包,研发肯定直接给撂摊子不干了。

  1个解决方案是游戏发行或者买量方(后面简称:SP)出一个聚合SDK给研发接,研发接入完成之后,连同游戏代码打包成aar给回SPSP再在IDE中打出不同渠道的分包,这样研发只需要出1个包,可以大大减少了研发的工作量,但是SP自己的工作量并没有减少,依然还是得手动去打N多个包,要是出上百个包的话,估计不吃不喝,一天下来都干不完;当然这个过程也可以通过脚本去实现,不过得熟悉打包涉及的每一个步骤,这样也是可以节省很多时间;

  另1种解决方案也是出一个聚合SDK给研发对接,研发接入完成之后,打一个可以正常运行的apk给回SPSP再反编译把其他渠道的SDK放进来,然后回编译成新的apk,这种方案要是手动实现,难度系数比第1种方案更大,不仅需要熟悉打包涉及的每一个步骤,还需要熟悉apk反编译相关的知识点,同时也得用脚本实现才能达到节省时间的目的;

 鉴于第1种方案比较简单就不在这里展开阐述,下面主要针对第2种解决方案进行讲解

一、SDK预处理

 一般来说,我们SDK某个功能的实现都会引用到第三方SDK代码,比如:获取OAID SDK、媒体渠道SDK、手机号一键登录SDK、推送SDK等,那么第一步就需要把所有用到的SDK进行合并:

1、SDK资源合并

1.1、合并res目录下的资源

  • res目录一般包含以下几个常见的目录:
    layout:存放布局文件
    anim:存放动画定义文件
    drawable/mipmap: 存放图片文件
    color:存放自定义颜色文件
    menu: 存放菜单定义文件
    xml:存放一些配置文件,比如:网络配置、provider配置
    raw:存放不进行压缩的文件
    values:存放字符串、主题样式、颜色、属性、尺寸等的配置文件
  • 合并res目录文件时候,可能会出现文件名冲突的问题,所以这就要求我们在开发自己的SDK时候,需要尽量避免跟第三方SDK的文件名出现冲突,可以在对我们文件命名时候,统一加个前缀,比如:Facebook的资源文件名都会加上com_facebook前缀
  • 同时,需要注意的是,对于values目录下xml文件,比如:
    SDK1 的sdk1_strings.xml中包含<string name="app_name"> xx1</string>
    SDK2 的sdk2_strings.xml中包含<string name="app_name"> xx2</string>
     那么,就算两个SDK的资源文件名是不一样的,但是由于xml中包含相同的节点,到回编译时候还是会报错,所以,需要在资源合并时候把相同的节点处理掉,一种解决方案是可以将sdk1、sdk2 values目录下的所有xml文件都写入到一个新的xml文件中,这里暂且命名为values.xml,每写入一个节点可以判断values.xml中是否存在,若是存在则不再写入,这样就能确保不会存在多个相同节点。

1.2、合并libs目录

目前libs目录主要是包含以下几个常见目录:

  • x86: 可运行于Intel 32/64位处理器的机器,目前比较少见,一般是比较老旧的机子,性能低
    x86_64:可运行于Intel 64位处理器的机器,目前基本模拟器用得比较多
    armeabiIntel 32/64处理器与ARM 32/64处理的机器都能运行,但是性能低,相当于在绝大多数手机上都是需要辅助ABI或动态转码来兼容
    armeabi-v7a:可运行于ARM 32/64位处理器的机器,性能比armeabi高一点,比arm64-v8a低,适用于早期的手机
    arm64-v8a:可运行于ARM 64位处理器的机器,目前市面上的安卓手机基本都是ARM 64位处理器了

     合并libs目录需要注意的是,需要确保libs目录下对应架构目录的so文件是一致的,比如:SDK1 适配 armeabi-v7aarm64-v8a,但是SDK2 只适配armeabi-v7a, 那么合并之后,就只能保留armeabi-v7a这一个目录,要不在ARM64的手机运行时候,因为会优先加载arm64-v8a目录下的so文件,但是在arm64-v8a目录又没有SDK2的so文件,这会就会闪退!

1.3、合并assets目录

 合并assets目录,只要文件名没有出现冲突就OK了

1.4、合并AndroidManifest.xml

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

1.5、合并jar

 把所有SDK的jar都复制到到同一个文件夹jars中,若是aar中的jar,由于默认的文件名都是classes.jar,故需要根据aar的文件名,重新命名一下,再复制到jars

2、jar转smali

2.1、jar 混淆合并

 混淆主要是用到Android SDK的proguard,一般在SDK的tools/proguard/目录下可以找到
1)一般手动调用proguard去混淆的话,需要在proguard-rules.pro文件增加java与android类库的依赖:

# 一般在sdk/platforms/android-31/目录下
-libraryjars <android.jar的绝对路径>
# 一般在jdk1.8.0_131/jre/lib目录下
-libraryjars <rt.jar的绝对路径>

2)在proguard-rules.pro文件声明需要进行混淆的jar(-injars)以及混淆之后输出的jar(-outjars)
 在这里基本就是把jars目录下所有的jar都写上去即可

-injars <jar1的绝对路径>
-injars <jar2的绝对路径>
-injars <jarN的绝对路径>
-outjars <混淆输出jar的绝对路径>

3)proguard执行混淆的命令

java -jar proguard.jar -ignorewarnings  @<proguard-rules.pro的绝对路径>

【备注】
 假如你不想混淆,但是你又想把jars目录下所有jar合并成一个jar的话,也可以借助proguard命令去实现,你只需在proguard-rule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值