我正在开发android sdk(可以是aar文件或jar文件)
在我的sdk中,我想使用应用程序本身引用的第三方sdks
例如,如果app的build.gradle本身有这一行:
com.google.android.gms:play-services-ads:9.4.0
我想在我自己的应用中使用play-services-ads类和方法,而无需在我自己的aar中引用它
我想到了一种方法 - 使用反射?
你能提出其他方法吗?
答案 0 :(得分:0)
我知道两种选择:安全方式和简单方法。
安全的方法是拥有两个库模块。一个包含大部分库代码。另一个依赖于第一个库和第三方库,这里是使用该第三方库的代码所在的位置。如果开发人员想要使用您使用第三方库的代码,他们将依赖于您的第二个库;否则,他们只使用第一个库。
简单的方法是使用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'
}
这是来自a library的build.gradle
,可以将智能添加到HttpUrlConnection
,也可以添加到OkHttp。如果开发人员想要我的OkHttp逻辑,他们需要拥有自己的compile
指令,用于兼容的OkHttp版本。只是依靠我的图书馆不会拉入OkHttp。然而,在编译时,我仍然可以引用OkHttp类和东西。
provided
存在一些风险:
如果开发人员跳过compile
依赖关系的provided
指令,那么尝试使用需要依赖关系的逻辑,在运行时崩溃,因为你需要做的类或方法不存在。您可以尝试使用反射来尝试检测已编译到应用程序中的库(例如,Class.forName()
以查看是否存在来自OkHttp的内容。)
您可能无法控制应用开发者使用的依赖项版本。使用第一种方法,您声明您支持的版本,如果应用程序开发人员尝试使用他们自己的compile
语句覆盖它,他们将获得Gradle警告和错误。如果应用程序开发人员的compile
语句版本与您的provided
语句版本冲突,我不确定应用程序开发人员是否会获得相同级别的通知。
此库是我第一次尝试provided
。到目前为止,我没有太多抱怨,但这个库是相当新的。
答案 1 :(得分:0)
也许我不太清楚你的目标。
但是如果你没有引用要使用的类,你怎么能编译你的项目?
您应该在使用sdk aar的最终应用项目中声明play-services-ads依赖项。
另一个技巧是你可以在sdk的build.gradle文件中使用依赖“transitive”属性,如下所示:
compile('com.google.android.gms:play-services-ads:9.4.0@aar') {
transitive = true;
}