前言
最近公司项目需要开发一个音乐类的sdk,让第三方开发者来进行执行操作!作为第一次开发sdk,其实很多东西都不是很明白,只能遇到问题就Google吧,弄到现在总算一切都成功了,现在记录一下其中开发的步骤与问题!
方案选择
前期开发sdk一定要想好自己是出什么包,这里提供两种参考:
- jar包
- arr包
他们两者是有区别的,区别在于:
- 打包出来的位置不同
AS低版本
jar: /build/intermediates/bundles/debug(release)/classes.jar
AS高版本
jar: /build/intermediates/packaged-classes/release/classes.jar
aar: /build/outputs/aar/libraryname.aar
- jar 中只包含了class文件与清单文件,
aar中除了包含jar中的class文件还包含工程中使用的所有资源,class及res资源文件全部包含 - 使用方式不同
jar使用:
1.将打包出来的jar文件加入到libs中
2.在module的build.gradle中加入代码,例如:
implementation files('src/lib/demo.jar')
arr使用 (这里只讲解单层arr依赖):
1.将打包出来的arr文件加入到libs中
2.在module的build.gradle中与android{}平级下加入
repositories {
flatDir {
dirs 'libs'
}
}
3.在module的build.gradle中的dependencies里加入
implementation(name: 'demo', ext: 'aar')//注意这里加入的名字没有后缀名
4.同步后可以在External Libraries中查看新加入的包
开发SDK中三方库咋处理?
首先建议开发sdk尽量少使用第三方库,使用时问题很多!但是特定情况下需要必须使用咋办?例如用到网络请求等等第三方库,例如现在的okhttp已经非常成熟,我们一般选择他来作为网络请求!首先我们抛出问题
- 假如我们在sdk中的build.gradle中加入依赖,开发完毕后直接打包,这里会出现一个问题就是打出来的包里面并不包含第三方库,会出现类找不到的情况,这个时候需要第三方开发者自己来导入我们sdk中所需要的依赖,假如我们不提供文档,开发者们都不知道要导入哪些?
- 我们使用arr打包方式,将我们用到的第三方库下载下来放进libs里面然后打包,这样可以打出来的包可以把第三方库打包进去使用!但是这样又会出现一个问题就是第三方开发者经常会遇到包冲突现象!
针对上面的问题提供以下几种思路:
- 提供开发文档在文档注明需要哪些第三方,把android常用的第三方库让开发者自己导入,例如okhttp,因为这些常用,所以开发者觉得这些都不是事,不用这个sdk我都会导入这些三方库
- 把不常用的库自己封装到sdk中,因为不常用很少有开发者会用产生版本冲突现象,例如dagger2等等!
- 使用maven仓库,用bintray进行版本管理
怎样将注解类的三方库封装进SDK?
这里其实我想到的是一个很笨的方法,但是确实是能解决问题的方法,如果读者有更好的方法,欢迎交流!
以dagger2为例,怎样将他封装进sdk?
步骤1
大家都知道使用dagger会用到如下东西:
apply plugin: 'kotlin-kapt'
dependencies{
implementation 'com.google.dagger:dagger:version'
kapt 'com.google.dagger:dagger-compiler:versio'
}
我们按照上面的方式配置好以后,配合我们的业务代码,我们运行会通过kapt插件来生成中间的业务代码,生成的地方就是在:
/build/generated/source/kapt/debug
步骤2
我们将这些生成的中间类全部拷贝出来,放在我们sdk新建的一个目录下例如我这里新建的文件夹dagger
image步骤3
我们业务代码需要导入生成中间类,例如下面的DaggerServiceComponent:
DaggerServiceComponent.builder().serviceModule(ServiceModule()).build().inject(this)
DaggerServiceComponent类我们这里不使用中间类,我们直接使用我们拷贝出来的类就行了!这样基本上dagger就通了!
步骤4
这个时候我们再将我们build.gradle中的dagger配置全部删掉,例如删掉前面的:
apply plugin: 'kotlin-kapt'
dependencies{
implementation 'com.google.dagger:dagger:version'
kapt 'com.google.dagger:dagger-compiler:versio'
}
步骤5
我们将dagger的库下载下来放libs:
image步骤6
因为我们要把第三方库下载下来自己打包进sdk,所以这里我们采用的是arr打包的方式!直接打包出来!这样我们丢给第三方开发者他对我们sdk中的dagger就并不需要做各种麻烦的配置了!
打包的方式
arr的打包很简单的
- 我们新建好了library的module
- 找到IDE右边的gradle,找到本library下build文件夹下的assemble运行就是了
jar打包稍微麻烦一点
- 在library下的build.gradle中假如如下代码:
def SDK_BASENAME = "$SdkName" /* 生成jar包的名字*/
def SDK_VERSION = "_V$VersionName"
def sdkDestinationPath = "build" /*设置生成的jar包输出的路径*/
def zipFile = file('build/intermediates/packaged-classes/release/classes.jar')
//生成一个新的包时候调用这个方法删除原来的包
task deleteBuild(type: Delete) {
delete sdkDestinationPath + SDK_BASENAME + SDK_VERSION + ".jar"
}
//打包脚本
task makeJar(type: Jar) {
from zipTree(zipFile)
from fileTree(dir: 'src/main', includes: ['res/**'])
baseName = SDK_BASENAME + SDK_VERSION
destinationDir = file(sdkDestinationPath)
}
makeJar.dependsOn(deleteBuild, build)
2.找到IDE右边的gradle,找到本library下other文件夹下的makeJar命令运行就是了,也可以使用命令gradlew makeJar操作
混淆打包可以参考这里
第一次完sdk开发,估计有很多地方有待优化!如果你有更好的方式方法我们可以交流
网友评论