第三方sdk聚合实现过程(广告)

前言

        起初,在接到广告方面的需求时,只是实现一个广告平台的广告接入并没有多少复杂的逻辑,所以按照官方的文档按部就班的接入就可以了。但随着时间推移业务增长单一广告已不能满足现有的需求。对于广告业务提出了更复杂的要求。不仅要实现多种形式的广告接入,还要实现不同广告平台的对接,以及后期需要对广告平台进行灵活的添加与删除,最后需要单独成一个广告模块。首先我想到的是我要开发一个类似于友盟分享一样的聚合功能模块,基于这样的前提我开始了对于广告模块的设计开发。整个过程大概分为三个阶段:代码封装;提取为功能模块;组件化并生成远程依赖。

代码结构重新设计——代码封装

        首先,我对比需对比所有广告平台的广告接入流程发现大都分为几步,初始化广告sdk——传入对应广告位id拉取广告——返回结果,总结了一下初始化方式以及所有平台的广告类型大体相似,返回结果分为数据与View两种形式。根据现有需求与广告sdk的加载过程大体总结出了广告聚合功能需要的几个重要步骤,初始化——拉取广告展示配置——根据配置拉取对应广告数据——根据广告数据生成广告View——返回View展示广告。根据上面流程可总结出主要需要下面几个类:类关系图1-1

图1-1

AdManagerHolder:对外暴露的广告接口,主要功能接收外部参数,协调各广告平台管理类中的具体功能调用,包括初始化,各广告位展示接口,拉取广告配置信息,超时控制,生命周期同步。

IAdvertManager:此接口实现类为各广告平台的管理类,主要功能包括对应广告平台的初始化——广告拉取——广告缓存——广告结果返回。包括了不同生命周期时的广告处理。

IAdvertView & IAdvertSplashView:这两个接口的实现类主要是实现数据的处理组装成View

 基于以上代码结构把广告功能相关代码封装并使代码耦合度降低,方便以后的模块化组件化。

创建module——提取为独立模块

提到功能模块化我首先想到是创建新的module,使功能可以不依赖主项目中的相关资源而可以实现自给自足,并且可以方便插拔。那么要实现这样一个结果,那么必然所有广告相关的代码,依赖,资源文件,menifest中的配置信息都尽量从主项目中拆分出来。具体的代码逻辑不再赘述,下面给出大概拆出来的对应代码及资源文件。如图2-1

图2-1

注:拆分成独立module后广告功能中会需要一些请求地址或者其它一些主项目相关的参数,可以通过初始化接口统一传入。这样做的原因是为了可以在其它项目中更方便依赖使用广告模块。

aar的打包上传与引用——组件化的最终实现

要实现组件化首先了解一下组件化的基本概念,很多人对于模块化与组件化概念模糊,网上找了一些概括的比较好的定义:组件化是建立在模块化思想上的一次演进,一个变种。组件化本来就是模块化的概念。但是组件化的核心是角色的转换。 在打包时, 是library; 在调试时, 是application。根据这个概念再去看一些组件化的相关资料,然后结合公司项目中的实际情况瞬间了然。那么接下来的组件化的过程也有了一个大概的思路。我所要实现的组件化要符合几点要求:可打aar包、可上传aar到私服、支持依赖module与aar远程依赖切换。为达到以上要求我需要对项目做以下改造。

1.新建一个项目引入广告module依赖。(为了方便我直接复制了一份主项目进行修改)

2.支持打包lib文件夹中的第三方aar到新的aar中。

实现这个功能需要接入第三方的插件fat-aar-android。

https://github.com/kezong/fat-aar-android

基本原理是把第三方的aar文件解压并把其中的代码、资源与menifest文件等合并然后打包生成一个新的aar文件。

具体原理请参考:https://www.jianshu.com/p/8f7e32015836

3.支持上传aar到私服

上传aar到私服需要配置gradle相关代码。如图3-1

图3-1

4.配置私服依赖并加入module模式与远程依赖模式切换

远程依赖地址配置如图在根目录中的build.gradle中配置如图3-2、3-3

图3-2
图3-3

module模式转换配置方式为gradle.properties文件中加入isModule=true

主项目中配置

if(isModule.toBoolean()){

implementation project(':kkadvertise')

}else {

implementation'com.weshine.kkadvertise:kkadvertise:0.1.0@aar'

}

注:当项目打包aar时lib文件中有第三方aar文件上传私服远程依赖后会出现无法拉取到第三方aar问题,并报异常无法找到groupId。解决方法:找到对应第三方aar的包名并在build.gradle依赖中填写好group。图3-4

图3-4

遇到的其它问题:

1.因为广告功能现在是以aar的远程依赖形式提供给其它项目使用所以为了方便依赖之后锁定问题,需要在项目中加入debug模式来控制是否打印日志。

2.组件化不可避免会涉及到混淆的问题,现在比较成熟的方案是把所有混淆都写在主项目中。我们自己打包的aar在主项目中也需要加入对应的混淆配置。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271