目录
- 浅谈Android SDK开发
- SDK开发的原则
- SDK设计
- 功能与职责边界设计
- 接口设计
- 兼容性设计
- 发布输出设计
- SDK文档设计
- SDK项目架构
- 组件化、模块化
- 统一资源管理
- 第三方依赖管理
- 代码混淆
- 多模块打包为一个aar
- 参考列表
浅谈Android SDK开发
最近接到一个需求:把我们已经上线的app,封装一下,对外提供一个SDK,让第三方应用拥有我们app的能力,同时尽量不改变目前的构建发布流程。领导发话,那就开干吧,就按要求,在现有代码基础上做最小的改动封装一个SDK。我们的源码分为几个module,包括五个公共的module,一个业务的app module,还有一个壳module。app依赖于五个公共module,五个module之间也有一些依赖关系。封装SDK我经过了以下几个步骤:
- 解耦自定义的BaseApplication,封装组件初始化流程,提供SDK初始化入口;
- 封装功能入口,并设计对外提供的接口;
- 把多个module的代码打包进一个aar;
- 混淆配置;
- 编写demo;
- 编写sdk接入文档
前后用了大概5个工作日,初步实现了sdk,成功输出aar包,demo源码,接入文档。后面等客户和领导沟通再做进一步的开发和优化工作。趁这段时间,总结一下SDK开发的流程和经验。第一次做SDK的需求,总结的不好,望多指教。接下来我将从以下三个大方面简单聊一聊SDK开发:
- SDK开发的原则;
- SDK设计
- SDK项目架构
SDK开发的原则
SDK面向的是开发者,开发的SDK可能会被很多第三方app调用,所以SDK的关注点在于:可靠性,稳定性,易用性,兼容性,安全性。所以开发SDK要时刻谨记以下原则:
- 避免SDK导致的crash;
- 集成SDK尽可能简单,能一行代码接入就不要两行;
- 封闭实现,暴露接口尽可能少;
- 新旧版本接口兼容,记录每一个版本的修改记录;
- 包体积尽可能少,不做多余的事,不依赖多余的包,不打包多余的资源;
- 尽可能多兼容Android版本,如最低支持到5.0,甚至4.4;
SDK设计
在了解来SDK开发的一些原则之后,接下来聊聊SDK的设计。
功能与职责边界设计
首先,要明确需求,开发这个SDK对外提供什么能力?在需求列表范围外的事,尽可能不要去关注。举个栗子,现在要设计一个拍照的SDK,那么我只管拍照就好,不要把相册也写了。功能与职责边界设计就是要我们明确SDK的初衷,专注于SDK的用户体验,实现一个稳定、健壮的SDK,不做多余的事情。
接口设计
开发者调用SDK的能力,是通过我们开放的接口来实现调用。所以,接口就是SDK开发的中心,所有工作都是围绕接口开展。设计接口时,我们要谨记SDK的初衷,明确SDK的功能和边界,并且要适当考虑后序可能的扩展。所以接口设计应该:
- 使用门面模式减少接口的数量
- 暴露方法越少越好
- 充分考虑每个接口参数的必要性及其返回值,明确每个参数和返回值的意义,并通过设计合适参数实现未来的扩展
- 新老版本设计,新版本应该兼容旧版本,而不是直接删除覆盖。
兼容性设计
因为SDK是提供给别人开发app用的,所以,只能让SDK去兼容别人的app,所以我们要尽可能低的兼容Android版本,如最低适配到5.0,甚至4.4,同时要在新系统更新后尽快的升级支持。如果使用来jni,还要考虑不同的cpu架构,提供armeabi-v7a,armeabi-v8a等的支持。兼容性设计考虑的内容如下:
- compileSdkVersion
- buildToolsVersion
- minSdkVersion
- targetSdkVersion
- sourceCompatibility
- ndk
发布输出设计
设计,编码,完成SDK开发后,接下来就是发布SDK,SDK发布有多种方式:
- 源文件发布
- aar文件发布
- maven仓库发布
直接发布源码,一般只有公司内部才可能使用,如果是对外发布的,最起码需要打包为aar放到官网上让别人下载。如果可以发布到开放的maven仓库,那是最好的,免除来别人下载aar,同时可以通过脚本自动发布。
SDK文档设计
因为SDK是给别人调用的,别人可能不知道怎么集成SDK,如何调用SDK的接口。所以,SDK必须提供详细的文档。文档的内容应该包括:
- SDK基本信息:最低兼容版本,java版本,so适配的cup架构等;
- 如何集成SDK,按照步骤,能成功集成SDK;
- 第三方依赖信息:okhttp,retrofit等;
- 混淆配置;
- 每个接口方法的文档介绍;
- demo代码和apk。
SDK项目架构
我们项目是先开发完成了,然后才提需求打包成SDK给别人用的。那么我们是不是可以反过来想,在项目开始的时候,我们就核心功能封装为SDK,然后围绕SDK开发我们的app呢?根据个人经验,完全可以这么做!特别是定制化需求较多的项目,如果项目开始之初就考虑到要先设计SDK,做好解耦的工作,那么后面定制化的需求将会很舒服。SDK项目架构,首先要考虑组件化模块化,从底层的能力基础组件,到上层的业务模块,可以提供不同维度的接口,封装不同层次的SDK。然后是一些细节的考虑,如统一资源管理,统一各个module的string,color,drawable,layout,xml,style等资源的命名规则,如加上module名称前缀。最后就是第三方依赖管理,和代码混淆的配置,以及打包多个module。
组件化、模块化
组件化、模块化的目的是解耦,从基础组件到业务组件,把各个功能独立封装起来,可以按需提供不同维度的接口。
统一资源管理
为什么要统一资源管理?防止打包时报资源冲突!
第三方依赖管理
- 尽量不依赖第三方;
- support支持包版本管理(建议使用compileOnly)
- 依赖的第三方不要打包进sdk(compileOnly),而是在文档中说明,让用户去添加依赖,避免冲突;
代码混淆
- activity、fragment、service等组件不能混淆;
- 用于序列化的bean不能混淆;
- 第三方依赖不能混淆(在接入时,先配置好混淆规则);
- SDK提供的接口不能混淆;
- 其它能混淆就混淆;
多模块打包为一个aar
当我们的住模块如:mainLib依赖lib1,lib2,lib3…或者其它aar时,打包mainLib不会把lib1,lib2,lib3…的代码打包进去!而google也没有一个方案可以打包多个module!不过有人已经实现来一套方案,可以把多个module和第三方aar包打包成一个aar,亲测有效,最后附上该项目的地址:
fat-aar-android
参考列表
Android SDK开发技术分享
【Android SDK 开发】sdk开发项目心得
Android SDK 开发纪要
Android SDK开发艺术探索系列(一)开篇与概设brucevanfdm