这段时间接到了一个开发集成广告SDK的任务,意思是写一个中间件去集成现在市面上多家广告商的广告(例如广点通和穿山甲等),封装好接口打包出sdk发给游戏端的同学去接入。经过和服务端的同学讨论分析整体流程之后,整个项目的需求也挺好理解的,目的是游戏端的同学在调用的时候无需关心要展示的广告是哪个广告商的,每一个接入的游戏都在我们的管理后台都可以配置该游戏接通的广告平台(一对多)。游戏初始化成功之后服务端下发广告商类型和广告id,游戏端根据广告类型和广告id调用中间件接口即可展示广告,如banner广告或者是插屏广告。这里运用了一种抽象的设计模式,对于游戏端的同学来说非常友好,调用者只需调用无需关心具体的实现方式,具体的业务逻辑交由中间件来处理。好了,了解需求之后一顿操作猛如虎,本地测试都没有问题的时候,以为临门一脚打个sdk出来就ok了,突然发现在打正式包的时候出现问题了。

 

时间紧,任务重,需求分析完成之后就要准备好没日没夜的撸代码和测试了。具体的开发过程就不多少了,不是本篇的重点,感兴趣的同学可以评论区交流。接触过SDK开发的同学都知道,中间件的逻辑完成之后要打出最终的jar或者aar出来给别人去用,如果只是纯代码的话就打jar,如果有代码和资源的话就要打aar了。而且,你并不想别人用你的东西的时候可以看到里面的具体实现,怕别人搞你事情,你就需要对打出来的jar或者aar进行混淆啦,不然就像扒光了衣服给别人看一样了。

想打出来的aar引用你的混淆文件,必须在对应的库的gradle文件中把 minifyEnabled 设置成ture


 


接着在as的右上角找到gradle栏目,展开相应的库模块找到assembleRelease,双击就可以,例如如下我们需要把mladsdk模块打成aar

Android集成广告联盟SDK android 广告sdk开发_jar

好了,一顿操作猛如虎之后,本地测试也没有问题,准备来临门一脚打个sdk出来就ok了,突然发现在打正式包的时候报错了(哦豁)。果然,想要一次写好没有Bug的代码是不可能的,面露笑容的我把目光投向了日志。

问题:编译aar的时候一直报找不到引用的三方库相关的类。

分析:接触android开发的都知道,我们在引用三方库的时候难免的引用别一下jar或者aar,本项目当中主要引用的是广点通和穿山甲广告相关的包。既然本地测试debug包都是正常能够运行的,那么报错报找不到的类肯定是存在,那么问题肯定是出在打正式包的配置相关,而打正式包当中就是对代码进行了混淆的操作,那么肯定是有某些类被混淆掉了导致找不到,只要保证这些类不被混淆问题应该就能解决了。

 

处理:

1.找到项目中自己写的代码,把项目中那些model类和接口类等都配置到混淆文件中

Android集成广告联盟SDK android 广告sdk开发_android_02

 

2.还有一部分就是我们接的第三方库的混淆配置了,我们只要去第三方的官网都可以查到他们的混淆配置,一般都会找到,后面我把混淆文件展示出来。这里主要是广点通和穿山甲以及微信登录相关的混淆。

Android集成广告联盟SDK android 广告sdk开发_jar_03

 

结果:检查对比完了整个混淆文件之后以为没问题了,再次编译的时候,问题依旧。(果然做开发的很需要佛性)

再次分析:屡了屡思路,突然想起之前在给游戏出渠道包的时候加了很多第三方的jar,为什么他们没有像我们这样包这些第三方的jar都打到aar里面呢。既然他们游戏能打出来,我们能不能反思维来想想呢,我们也不把这些第三方的jar打到aar里面,这样行不行呢。(思绪来了之后马上验证)

(方法一)操作:我们新建了一个单独的公共lib用来放第三方的包,这个lib里面不做任何的操作,只是用来存放三分的sdk包,然后在我们的sdk模块里面引用这个lib,就相当于把三方的包单独管理起来,我们只是引用,不把他们打入aar,但是混淆文件里面还是要包含三方包的混淆配置。

Android集成广告联盟SDK android 广告sdk开发_jar_04

  

Android集成广告联盟SDK android 广告sdk开发_jar_05

结果:再次编译之后,正解通过。

延伸:方法一当中的思想是把依赖的第三方的库单独开一个module packageLib来导入一拉,然后目标项目依赖这个packageLib,这样打出来的aar就不包含packageLib里面的类文件和资源文件。但是如果我们只想引用一个目标aar,把所有第三方的库和自己引用的一些库模块都打到一个aar中的话,也是有办法解决的,下面看方法二。

 

(方法二)操作:这里我们先看一下 fat-aar-android 这个开源库,github 的链接如下:https://github.com/kezong/fat-aar-android/blob/master/README_CN.md

这个fat-aar-android 插件提供了将library以及它依赖的module一起打包成一个完整aar的解决方案

第一步:现在项目的build.gradle文件中引入这个插件

Android集成广告联盟SDK android 广告sdk开发_sdk_06

第二步:在引用的model的gradle文件中添加 apply plugin: 'com.kezong.fat-aar'

Android集成广告联盟SDK android 广告sdk开发_三方库_07

第三步:将 implementation 或api 改成 embed。

注意1:这里需要说一下,当你打包的时候才需要改成embed,如果是本地直接引用运行的话还是需要用implementation 和api。

注意2:这有时候我们应用的三方库里面它自己又引用了一些其他的库,如果你想把三方库自己引用的类和资源也一并打到目标aar里面,需要配置:configurations.embed.transitive = true

Android集成广告联盟SDK android 广告sdk开发_三方库_08

第四步:轻轻的按照文章前面的步骤打包就可以了,可以看到我们的aar已经打出来了。

Android集成广告联盟SDK android 广告sdk开发_sdk_09

第五步:因为第三步设置当中我们把okgo 和 bugly 以及 immersionbar 打到aar里面,现在我们来把ThirdLibrary.aar拆包来看看okgo和bugly等相关的类有没有打到aar里面。

1.把ThirdLibrary.aar 的后缀改成zip格式,然后解压得到里面的classes.jar文件

Android集成广告联盟SDK android 广告sdk开发_三方库_10

2.我们用 jd-gui 软件把 classes.jar 打开,可以看到okgo和bugly等相关的类已经打到目标aar里面了,大功告成。

Android集成广告联盟SDK android 广告sdk开发_sdk_11

 

 

引用:当我们打出自己的广告aar之后,再发给游戏端的同学接入时,必须要把公共lib里面用到的aar和jar都要发给他们一起引用。

总结:aar打包过程中可能还会出现一些其他的疑难杂症,这里只是介绍了我遇到的以及我的一些见解和解决方法,很多同学出现的问题可能跟我不同,但是应对方法是相通的。出现Bug不慌,认真审查问题,往往问题并不是什么大问题。先自己分析,不懂不还有度娘不是吗,集思广益,问题便会迎刃而解。有什么问题和疑虑欢迎大家留言探讨。