在另一个第三方sdk中使用第三方sdk classe

时间:2016-09-20 13:29:34

标签: android android-studio reflection aar

我正在开发android sdk(可以是aar文件或jar文件)

在我的sdk中,我想使用应用程序本身引用的第三方sdks

例如,如果app的build.gradle本身有这一行:

com.google.android.gms:play-services-ads:9.4.0

我想在我自己的应用中使用play-services-ads类和方法,而无需在我自己的aar中引用它

我想到了一种方法 - 使用反射?

你能提出其他方法吗?

2 个答案:

答案 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 librarybuild.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;
}