极客星球 | Android SDK架构设计之路
极客星球
2021-07-23

编者按:7月15日晚,由MobTech袤博科技主办的一档线上技术直播分享栏目【Coder Park】第一季第二讲《移动端新风向》顺利在云端举行,客户端负责人文军分享了MobTech袤博科技Android SDK架构设计之路,从0到1开发及迭代过程中遇到的一系列难题,共同探讨其解决思路和SDK开发架构升级。

 

以下为分享内容:

 

MobTech袤博科技开发者服务历时9年,现已覆盖全球近155亿+移动端设备,业务覆盖营销、金融、商业地理等多个垂直行业,同时为政府业务提供支持。对于App开发者来说,会经常面临架构选型以及SDK接入的一些痛点和问题,今天从“SDK架构设计”这个主题出发,分享MobTech袤博科技如何系统化打造SDK服务。

 

▌浅谈SDK

 

SDK是软件开发工具包的缩写,它的主要作用主要包括以下方面。一是提供软件必备功能,二是降低软件开发和维护成本,三是极大缩短软件开发周期,四是当今移动互联网起飞的X因素,可以说没有SDK移动互联网不会发展这么迅速。

 

SDK服务包含以下方面:一是提供SDK基础业务功能,如授权分享、推送、一键登录等;二是提供完善SDK的集成工具和文档,方便开发快速接入;三是需要提供三方开放平台支持,除了对Android和iOS原生App开发支持外,还需要提供像Unity、Cocos、Uniapp、Flutter、APICloud等平台支持;四是需要提供7x24小时的在线服务,保证能及时响应开发者的各种问题。

 

▌Mob SDK架构

 

那么在解读MobSDK架构前,我们先来全面了解一下MobSDK。想必很多开发者了解我们,都是从ShareSDK开始,我们自2012年起,通过这款产品打开了移动开发者的市场,在ShareSDK引领市场的同时,我们陆续开发了MobPush、一键登录、短信验证码、MobLink等系列产品。MobPush这款产品自上线以来,通过了3年时间的不断优化和升级,目前在全方位推送功能和推送指标上都达到行业第一梯队水平,并且完全免费。秒验SDK则提供了当下比较流行的一键登录功能,上线3年多,物美价廉且得到多方好评。目前产品推出9周年感恩回馈活动,为新老用户带来了超多优惠福利,感兴趣可以点击“阅读原文”了解。

 

MobSDK的整体架构按功能支持分为三部分,第一部分是SDK基础功能,第二部分是集成工具支持,第三部分是三方开放平台支持,每一部分和模块都是支持横向扩展的。

 

第一部分SDK基础功能架构可分为三层,第一层是SDK业务层,第二层是通用功能层,第三层是基础工具集合层。SDK业务层将各业务之间互相独立开,这样每个功能SDK之间是相互独立的,方便迭代和维护。通用功能层会将一些通用的功能从各SDK中抽离出来,单独为一个模块。基础工具集合层提供了基础工具框架,是经过长期积累的,稳定性较强,也独立出了新的模块。

 

第二部分是集成工具,这一块也是尤为重要。首先要让开发者接入进来,那么就需要提供更加快捷接入方式,除了传统集成文档之外,我们提供了0代码集成工具,像gradle插件、cocoapods、maven仓库、三方开放平台组件(如Flutter组件、APICloud组件、UnityPackage等)。

 

第三部分是三方开发平台支持,针对Unity、Cocos、Uniapp、Flutter、APICloud等平台,我们提供了开源的桥接代码和组件支持,方便所有移动开发者都能接入SDK。

图片

▌从0到1开发

 

一般从0设计一款SDK,总体上可以分为5个步骤:基础架构的设计、开放API接口设计、业务功能框架设计与开发、基础核心库设计与开发、打包与发布。

 

第一步是基础架构设计,一个好的架构可主要从可读性、可扩展性、可维护性三个方面进行考虑,即功能模块间相互独立,降低耦合度,保证结构清晰易于维护。通常我们可以把SDK架构简单分为两个层次:业务层和通用功能层。业务层可以独立成业务模块,包括开放API接口和业务功能实现,能用功能层可以分为两个模块,包手通用功能模块和基础工具模块。

图片

第二步是开放API接口设计,是直接开放给开发者调用的,所以经常要转化角色。针对如何调用这个接口,如何用起来更方便快捷,并且不用去考虑任何场景和问题,总结了以下几个要点。

 

1.API接口命名需要规范,且通俗易懂;

2.接口输入参数尽量少,如有必要参数,需要做好参数校验;

3.接口尽量保证是非阻塞的,这样不影响开发者正常业务逻辑处理;

4.接口调用日志需要清晰明了,便于调试;

5.接口结果最好是直接返回,尽量少的使用回调,如有必要,可以在回调方法命名上明确回调所在线程,如在主线程回调,可以使用onResultInMainThread这种方式来命名回调方法。另外使用回调时需要考虑内存泄漏问题,由于开发者有可能是使用匿名内部类的方式进行回调传参,这时如果调用程序的生命周期结束时回调还没有回来,就需要主动移除回调,防止内存泄漏,所以使用回调时还需要提供移除回调的方法。

 

图片

第三步是业务功能框架设计,不要过度设计,根据具体的业务需求来设计即可,不要为了一些未来很小概率发生的需求变化提前设计。

 

第四步是基础核心库设计与开发,在核心库提炼过程中需要保证功能间互相独立,降低耦合度。

 

最后是打包与发布,可以通过jenkins自动获取代码和执行编译打包,最终发布到maven上,可以大大降低人为本地打包出错的风险。 

 

▌SDK主要问题及解决途径

 

SDK开发主要面临以下问题:SDK包体大小、兼容适配、四方依赖问题、隐私合规问题。

 

对于SDK包体大小,首先是代码一定要精简,不过度设计,代码撰写需尽量最优雅最简洁的,其次混淆,理论上除了四大组件以及开放API接口外,其它的都需要进行混淆。兼容适配主要有4个层面的兼容问题:系统版本兼容、厂商兼容、屏幕兼容、以及新老版本兼容。系统版本兼容我们需要适配android 4.0以上的所有版本,一般官方每年Q3会发布一个新的版本,在新系统正式发布前我们需要做好适配,一般我们会在Q1-Q2研究并完成新系统的适配,做法先是先整体研究新系统的变更,并圈出与SDK相关的重点变更,最后根据官方指南,进行相关适配修改与测试;厂商兼容,这块主要通过机型兼容覆盖测试来进行功能适配,一般会覆盖5大厂商的主流机型;屏幕兼容,主要中涉及界面相关的适配和测试;新老版本兼容,需要确保所有SDK版本都是向下兼容的,保证SDK发新版本后,开发者可以不用修改一行代码就能直接更新到新版本SDK。

 

四方依赖指的是依赖的开源框架(如supportv4包、OkHttp等)、开放平台(如QQ分享、微信分享)、开发平台(如Flutter、Unity、Cocos等)。首先需要去开源依赖,不依赖任何三方工具包,完全基于原生的android.jar进行开发。对于依赖的四方开放平台和支持的开发平台,我们需要进行更新监控,以及定期更新,保证提供的基础功能能正常运行。隐私合规主要关注官方隐私调整、应用市场隐私政策、以及国家网络信息安全政策。通常我们可以走第三方安全检测机构进行权威检测,以及相关适配修改。

 

针对隐私合规这块,MobSDK主要有三方面:一是隐私政策声明,MobTech袤博科技针对SDK业务功能,出具了相应的隐私政策,确保SDK功能在合法合规的场景下使用。(对隐私适配这块也设计了隐私控制API,在用户未提交隐私授权前,是不会做任何网络请求和API调用的,同意授权后,才会初始化相关SDK功能);二是定期向第三方检查机构送检,三方检查机构会按照国家最新相关规定和政策进行权威的安全检查,并输出检测报告,当前我们通过了梆梆安全和爱加密等安全机构的检测;三是我们出具了完整的合规与安全指南,根据指南可以解决隐私合规相关的问题。