三方sdk接入问题

在项目中接入的大大小小的sdk 有几个了,现在比较适合做一下总结。

来源

  1. jar包:一般是公司内部其它部门的sdk、大部分的三方sdk
  2. aar:一般是公司内部其它部门的sdk(一般是不同Android 小组的sdk)、三方sdk(现在接入的比较新的sdk 很多是aar)
  3. jar包+资源文件(aar+资源文件)
  4. 封装开源框架的sdk:图片加载框架、网络框架之类的封装。
  5. 包含gradle plugin 插件的sdk。

还有一些sdk 包含了so 文件。

注意的问题

1. 冲突

含有资源文件的sdk 需要特殊的注意,资源文件并不会报错。如果主module 含有某个module 含有的资源则最终会被替换成主module 中的资源。如果多个module 含有同一个资源文件,则会导致最终被替换成第一个compile 进去的资源。可能导致的问题是最终运行时找不到某个资源(比如某个layout.xml 被替换了,里面的布局不一样)。所以在导入包含资源文件的sdk 时,需要特别注意资源文件是否有重复。

比较好的做法是在做sdk 时给每一个资源文件加一个前缀。在build.gradle加入如下代码,资源命名的前缀不是prefix_就会报红提醒。

1
2
3
android {
resourcePrefix "prefix_"
}

2. 文档

在接入一些三方的sdk 时,最好是能记录sdk 版本,sdk 实现的功能,更加详细的包括调用的逻辑也可以记录下来,方便以后的维护和升级(受了没写文档后来更新的苦,特别是更新不频繁的sdk)。建议在新加的三方sdk 中加入详细文档。

3. so 文件

需要注意app 兼容的so 版本。为了减少包大小,很多app 只会导入armeabi的so(x86兼容armeabi)。最终打包时可以通过下面脚本过滤只包含armeabi

1
2
3
4
5
6
7
android {
defaultConfig {
ndk {
abiFilters 'armeabi'
}
}
}

4. 混淆

sdk 的接入文档里面会有混淆的说明,但是对于一个比较大的sdk 的混淆,推荐单独建一个文件来混淆

5. 是否新建moudle

不推荐每一个aar 创建一个module。对于包含了比较多资源文件的sdk,或者项目的工程比较大、更新比较频繁的,或者某个aar 需要被多个工程引用(aar 文件不能传递依赖)推荐创建一个新的module。

Android Studio 自带导入aar 的方式。
Android Studio 自带导入aar 的方式

但是不推荐使用这种方式,这样导入有一个缺点是无法在External Libraries 中查看导入的aar。

推荐单独创建一个module 的方式。

1.在sdk 目录下的build.gradle中(把aar 放在lib 目录下)

1
2
3
4
5
6
7
8
9
10
11
12
// module 名sdk
android {
repositories { // 1. 第一部分设置aar 的路径,即/sdk/lib/
flatDir {
dirs 'lib'
}
}
}
dependencies {
compile fileTree(dir: 'lib', include: ['*.jar'])
compile(name: 'xx-sdk', ext: 'aar') // 2. 第二部分设置具体的aar,这里举例xx-sdk
}

2.在使用的module(所有的module 都可以这样配置)中配置

1
2
3
4
5
6
7
8
9
repositories {
flatDir{
dirs project(':sdk').file('lib') // 1. 第一部分设置使用的aar 的路径
}
}
dependencies {
compile project(':sdk') // 导入sdk
}

这样可以在External Libraries中查看。

6. 其它

还有一些需要注意的问题可能比较杂,大概罗列一下:

  1. sdk 中使用的三方库(一般开源库)是否会跟app 存在兼容问题。
  2. sdk 编译的最低版本与我们app 是否兼容。
  3. sdk 是否需要在AndroidManifest 中配置(比较常见的是meta-data、permission、Service、Activity、ContentProvider),接入时需要仔细查看文档,不然会有奇怪错误。
  4. 尽量对sdk 代码调用进行封装。
  5. 一些细节问题(需要测试的时候用心)。比如sdk 是否有内存泄漏问题。

当然最后最最最重要的是导入三方sdk 的时候记得写文档,写文档,写文档。不然更新的时候就比较悲剧了。