使用第三方SDK CLASSE

问题描述:

我正在开发的Android SDK(可AAR文件或jar文件)使用第三方SDK CLASSE

在我的SDK我希望使用由应用程序本身

引用第三方的SDK

例如,如果应用程序的的build.gradle本身有这样一行:

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

我想用在我自己的应用程序中的播放服务,广告类和方法,而无需引用它在我自己aar

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

你能提出其他方法吗?

+0

什么是背后“你的目标,而无需引用它在我自己的AAR “?你只是想避免强迫开发者拥有“play-services-ads”依赖性吗? – CommonsWare

+0

@CommonsWare试图尽可能减少aar/jar文件大小,并且不想在其中包含其他sdks依赖项 –

我知道两种选择:安全方式和简单方式。

安全的方法是有两个库模块。一个包含你的大部分库代码。另一个依赖于第一个库和第三方库,这里是使用第三方库的代码所在的地方。如果开发人员想要使用使用第三方库的代码,则他们依赖于第二个库;否则,他们只是使用第一个库。

最简单的方法是使用范围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逻辑,他们需要为兼容版本的OkHttp拥有自己的compile指令。取决于我的图书馆将不会拉OkHttp。然而,在编译时,我仍然可以引用OkHttp类和东西。

有几个风险与provided

  • 如果开发商跳过compile指令为您provided依赖,然后尝试用你的逻辑,需要的依赖,你崩溃在运行时,因为类或您需要的方法不存在。您可以尝试使用反射来尝试检测已编译到应用程序中的库(例如,Class.forName()以查看OkHttp中是否存在某些内容)。

  • 您可能对应用程序开发人员使用的依赖关系的版本有较少的控制权。使用第一种方法,您声明您支持的版本,如果应用程序开发人员尝试用他们自己的compile语句覆盖该版本,他们将获得Gradle警告和错误。如果他们的compile声明的版本与您的provided声明的版本冲突,我不确定应用程序开发人员是否获得相同级别的通知。

这个库是我第一次尝试provided。到目前为止,我还没有多少投诉,但这个图书馆是相当新的。

也许我不太了解你的目标。

但是,如果您没有引用要使用的类,那么您如何编译您的项目?

只需要在使用sdk aar的最终应用程序项目中声明play-services-ads依赖关系。

另一个技巧是,你可以使用依赖“传递”属性在你的SDK的的build.gradle文件,如下所示:

compile('com.google.android.gms:play-services-ads:[email protected]') { 
    transitive = true; 
}