Android SDK 开发——发布使用踩坑之路

前言
在 Android 开发过程中,有些功能是通用的,或者是多个业务方都需要使用的。
为了统一功能逻辑及避免重复开发,因此将该功能开发成一个 SDK 是相当有必要的。
背景
刚好最近自己遇到了类似需求,在开发完 SDK 之后,集成到项目或者提供给别人的时候遇到了一些坑,这里分享一下,以避免其他需要开发 SDK 的开发者们重复踩坑。
文章要说明的内容如下:
- 集成方式对比
- AAR 集成方式的一些坑
- 使用 maven publish 和 maven 将 SDK 推送到 maven 仓库的区别
- Tips
- 总结
集成方式对比
SDK 开发完成之后,需要提供一种集成方式让其他人可以使用。
集成方式这边认为大概有 3 种。
1. 提供 Module
这种集成方式把整个 SDK 的源码都提供给其他人。
优点:没有什么坑,只要自己测试没问题,别人一般可以直接使用。
缺点:后续如果有更新,需要全量给别人进行替换。
而且项目里面如果同时引用多个Module,项目结构会增加很多代码文件。
还有可能一不小心就更改了 SDK。
因为源码可以直接修改,没有任何保护。
2. 提供 AAR 文件
这种集成方式是把 SDK 编译之后提供 AAR 文件给其他人。
优点:只有一个文件,不需要给到具体源码。
缺点:某种情况下有坑,下面会讲到。另外更新 SDK 不方便,每次更新需要用户进行 AAR 文件替换。
3. 推送到仓库(这里以 MAVEN 仓库为例)(推荐)
这种集成方式是把 SDK 编译之后的 AAR 文件推送到仓库,后续可以通过 implementation 或者 api(旧版本 Gradle 为 compile)引用。
优点:集成方便,跟第三方库集成类似,方便开发者。而且有版本管理。
缺点:maven publish 有个坑。见下文分析。
表格对比如下:
| 集成方式 | 优点 | 缺点 |
|---|---|---|
| 提供 Module | 没有坑 | 维护麻烦,没有代码保护 |
| 提供 AAR 文件 | 只有一个文件 | 有坑,更新麻烦 |
| 推送到仓库 | 集成方便,版本管理 | maven publish有个坑 |
AAR 集成方式的一些坑
一般 SDK 开发是封装一些功能方便调用,因此比较少在 Module 里面引入第三方库。这种情况下使用 AAR 集成是没有太大问题的。
然而,当你的 SDK 中引入第三方库,比如 Retorfit 之类的库时(不是直接引入 jar 包或者 aar 包),这个时候你使用 AAR 集成,运行到对应代码时会提示 java.lang.NoClassDefFoundError 错误。这个时候你

明明 Module 运行没问题,怎么 AAR 就报错了。
如果你尝试在项目里面将 SDK 用到的第三方库再引入一遍,就会发现程序没报错了。
因此我们可以得出结论:
AAR 不能传递第三方依赖

别慌,方法总比问题多。
我们可以通过将 SDK 推送到仓库的方式来解决这个问题。
推送仓库有很多,比如开源的 jcenter 之类的。
这边考虑有些 SDK 是给公司内部使用的,因此以 maven 为例进行讲解。
使用 maven publish 和 maven 将 SDK 推送到 maven 仓库的区别
maven publish 其实是 maven 的一个升级。
所以一般优先采用 maven publish。
这边项目已经使用了 maven publish 了,所以这边一开始也是使用 maven publish。
结果坑来了。
发现出现和 AAR 一样的错误,依赖不能传递。

这,赶紧看一眼 pom 文件(跟 AAR 同级目录),发现真的没有依赖。
查了一下网上资料。发现
https://discuss.gradle.org/t/using-the-maven-publish-plugin-no-dependencies-in-pom-xml/7599
有一个提问


当然应该有对应的处理方式,但是由于项目时间需求比较紧,不想花太多时间,因此暂时没有查找解决方式。
如果有朋友知道,可以留言,后续有空研究,有解决方法也会更新。
因此这里不展开讨论 maven publish 的集成方式。
最后查阅资料使用了 maven 的推送方式。
那么如何使用呢?
1.先使用本地仓库,确保没问题之后再使用远程的
在 Module 的 build.gradle 文件中添加如下代码:
apply plugin: 'maven' //指定使用 maven
uploadArchives {
repositories {
mavenDeployer {
pom.groupId = "com.maven.demo" //包名
pom.artifactId = "login" //SDK 功能,自定义一个即可
pom.version = "0.0.1" //版本号
repository(url: "file://localhost/Users/用户名/Library/Android/sdk/extras/android/m2repository/") //用户名替换为自己的机器名,本地地址
}
}
}
执行 uploadArchives 任务就可以上报了。
然后到上面 url 指定的目录或者通过浏览器打开可以看到上传的相关文件。
查看 pom 文件可以看到依赖都在上面。
2.使用远程仓库,对上面略做修改。
apply plugin: 'maven' //指定使用 maven
uploadArchives {
repositories {
mavenDeployer {
pom.groupId = "com.maven.demo" //包名
pom.artifactId = "login" //SDK 功能,自定义一个即可
pom.version = "0.0.1" //版本号
repository(url: "网址") {
authentication(userName: "用户名", password: "密码")
}
}
}
}
其中网址、用户名和密码记得分别替换。
别人需要使用时只需要在 Module 添加如下:
implementation 'com.maven.demo.login.0.01'
所以仓库的组成就是pom.groupId+pom.artifactId+pom.version
Tips:
1.SDK 开发可能遇到同一个版本比如 0.0.1 在发布之前经常需要修改的情况。
这个时候如果你把修改后的 SDK 推送到远程,可能本地项目用的还是旧的内容。
这种时候有两个处理方式。
第一个,更新版本号,修改依赖新版本。
第二个,执行下面命令,强制从远程拉取,不使用缓存。
./gradlew build --refresh-dependencies
2.使用远程仓库时,一般用户名和密码都不会直接推送到代码仓库,可能会放到构建机。
这个时候需要使用类似于 local.properties 的外部文件来存放。
这个时候有个坑需要提醒一下,就是在 local.properties 定义比如 maven_user_name=username,千万记得不要加双引号,否则会出现认证失败,出现下面提示:
Received status code 401 from server: Unauthorized
3.使用 maven 的形式如何指定是 debug 还是 release?
通过在 android 块里面添加
android {
defaultPublishConfig "release"
}
可以指定。
通过查看 Module 的 build/outputs/aar 可以看到 aar 包。
通过查看 Module 的 build/poms/pom-default.xml 可以看到本地 pom 文件。
4.有些开发者如果按照上面操作之后还是出现 java.lang.NoClassDefFoundError 错误,可以尝试下面操作:
修改
implementation 'com.maven.demo.login.0.01'
为
implementation 'com.maven.demo.login.0.01' {
transitive = true
}
总结
- SDK 开发完成之后发布给其他人使用最好放到远程仓库(比如 maven)
- 如果出现 SDK 引入的第三方库没有找到的错误,记得到仓库看下 pom 文件是否有对应依赖
关注公众号一起交流:

Android SDK 开发——发布使用踩坑之路的更多相关文章
- Android 上传开源项目到 jcenter 实战踩坑之路
本文微信公众号「AndroidTraveler」首发. 背景 其实 Android 上传开源项目到 jcenter 并不是一件新鲜事,网上也有很多文章. 包括我本人在将开源项目上传到 jcenter ...
- Android SDK开发与使用的那些事儿
前言 最近由于工作需要,将应用里的部分功能独立了出来,封装成 SDK 提供给合作伙伴使用.由于经验不足,网上也没多少写这方面内容的文章,遇到了不少的坑,决定记录下来. SDK 其实,刚说到要写SDK也 ...
- Android SDK 开发指南
Android SDK 开发指南 视频详解 以下视频是对融云 Android SDK 开发使用的详细讲解,您可以在阅读文档时配合学习. 更多视频教程如下: CSDN 融云 Android SDK ...
- MySQL Connector/NET 使用小结(踩坑之路)
背景描述 根据项目的需要,需连接MySQL获取数据. 首先,先了解一下项目的情况: 之前的代码是C#编写的的, 运行时:.NETFramework3.5. 由于项目已经部署上线,因此不能升级运行时,这 ...
- html2canvas的踩坑之路
html2canvas的踩坑之路 前言 早有耳闻这个html2canvas比较坑,但无奈于产品需求的压迫,必须实现html转图片的功能,自此走上了填坑之路,好在最后的效果还算令人满意,这才没有误了产品 ...
- React-Native android在windows下的踩坑记
坑很多,跳之前做好准备.没有VPN的同学请浏览完本文后慎行. 你需要先安装最新版本的node.js(我最后使用的是v4.1.2),前往官网下载>> 注:我win7已经安装过Visual ...
- 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~
这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用. 1.大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.suppo ...
- 配置Android SDK 开发环境(转)
1. 下载Eclipse 在前面我们配置好了JDK环境后,就可以开始配置Android的集成开发环境了,官方Google推荐的集成开发环境为Eclipse,所以我们就以Eclipse作为集成开发环境. ...
- 基于虹软人证核验 2.0 Android SDK开发集成入门
一.功能介绍虹软人证核验 2.0 SDK(以下简称SDK)包含人脸检测.人脸跟踪.人证核验等能力,主要实现人证的1:1比对.其中暴露对外的功能方法有:active 引擎激活init 引擎初始化inpu ...
随机推荐
- 开源方案搭建可离线的精美矢量切片地图服务-2.PostGIS+GeoServer矢量切片
项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...
- 判断decimal 是否为整数
用了半个小时搞懂了这个问题,基础愁死我了! private static boolean isIntegerValue(BigDecimal decimalVal) { return decimalV ...
- TensorFlow之DNN(二):全连接神经网络的加速技巧(Xavier初始化、Adam、Batch Norm、学习率衰减与梯度截断)
在上一篇博客<TensorFlow之DNN(一):构建“裸机版”全连接神经网络>中,我整理了一个用TensorFlow实现的简单全连接神经网络模型,没有运用加速技巧(小批量梯度下降不算哦) ...
- 阿里云大数据计算服务 - MaxCompute (原名 ODPS)
MaxCompute 是阿里EB级计算平台,经过十年磨砺,它成为阿里巴巴集团数据中台的计算核心和阿里云大数据的基础服务.去年MaxCompute 做了哪些工作,这些工作背后的原因是什么?大数据市场进入 ...
- Spark2.4.0伪分布式环境搭建
一.搭建环境的前提条件 环境:ubuntu-16.04 hadoop-2.6.0 jdk1.8.0_161. spark-2.4.0-bin-hadoop2.6.这里的环境不一定需要和我一样,基本版 ...
- python enumerate() 函数的使用方法
列表是最常用的Python数据类型,前段时间看书的时候,发现了enumerate() 函数非常实用,因为才知道下标可以这么容易的使用,总结一下. class enumerate(object): &q ...
- java代码之美(11)---java代码的优化
java代码的优化 随着自己做开发时间的增长,越来越理解雷布斯说的: 敲代码要像写诗一样美.也能理解有一次面试官问我你对代码有洁癖吗? 一段好的代码会让人看就像诗一样,也像一个干净房间会让人看去很舒服 ...
- SpringBoot从零单排 ------初级入门篇
有人说SSM已死,未来是SpringBoot和SpringCloud的天下,这个观点可能有点极端,但不可否认的是已经越来越多的公司开始使用SpringBoot.所以我将平时学习SpringBoot的内 ...
- 从零到一详聊如何创建Vue工程及遇到的常见问题
前言 本文也会在github上我的web-study仓库中同步更新,欢迎star. 戳这里,传送 准备工作 判断是否需要FQ或安装镜像,镜像一般可安装国内淘宝镜像,详情可看这里:cnpm npm in ...
- 【Java】广州三本秋招经历
前言 只有光头才能变强 离上次发文章已经快两个月时间了,最近一直忙着秋招的事.今天是2018年10月22日,对于互联网行业来说,秋招就基本结束了.我这边的流程也走完了(不再笔试/面试了),所以来写写我 ...