我正在开发android sdk(可以是aar文件或jar文件)
在我的sdk中,我想使用由应用程序本身引用的第三方sdk
例如,如果构建。Gradle的应用程序本身有这样一行:
com.google.android.gms:play-services-ads:9.4.0
我想在我自己的应用中使用play-services-ads类和方法,而不需要在我自己的aar中引用它们
我想到了一种方法——使用反射?
你能建议其他方法吗?
我知道有两种选择:安全的方法和简单的方法。
安全的方法是使用两个库模块。一个包含大多数库代码。另一个依赖于第一个库和第三方库,这里是使用第三方库的代码所在的地方。如果开发人员想要使用使用第三方库的代码,他们依赖于你的第二个库;否则,它们只使用第一个库。
简单的方法是使用provided
作用域:
apply plugin: 'com.android.library'
dependencies {
androidTestCompile 'com.android.support.test:rules:0.5'
compile 'com.android.support:support-annotations:24.2.0'
provided 'com.squareup.okhttp3:okhttp:3.4.1'
androidTestCompile 'com.squareup.okhttp3:okhttp:3.4.1'
}
这是一个库中的build.gradle
,可以为HttpUrlConnection
添加智能,也可以选择为OkHttp添加智能。如果开发人员想要我的OkHttp逻辑,他们需要为OkHttp的兼容版本拥有自己的compile
指令。仅仅依赖于我的库不会拉OkHttp。然而,在编译时,我仍然可以引用OkHttp类和东西。
provided
有几个风险:
如果开发者为你的
provided
依赖项跳过compile
指令,然后尝试使用需要依赖项的逻辑,你会在运行时崩溃,因为你需要的类或方法不存在。你可以尝试使用反射来检测被编译到应用程序中的库(例如,Class.forName()
来查看是否存在OkHttp中的内容)。你可能无法控制应用开发者使用的依赖版本。使用第一种方法,你声明你支持的版本,如果应用程序开发人员试图用他们自己的
compile
语句覆盖它,他们将得到Gradle警告和错误。我不确定应用程序开发人员是否得到相同级别的通知,如果他们的compile
语句的版本与您的provided
语句的版本冲突。
这个库是我第一次尝试provided
。到目前为止,我还没有收到很多抱怨,但是这个库相当新。
也许我没有很好地理解你的目标。
但是如果你不引用要使用的类,你怎么能编译你的项目呢?
简单地说,你应该在使用sdk aar的最终应用项目中声明play-services-ads依赖项。
另一个技巧是你可以在sdk的构建中使用依赖项"transitive"属性。Gradle文件,如下所示:
compile('com.google.android.gms:play-services-ads:9.4.0@aar') {
transitive = true;
}