4

我有一个非常复杂的问题。我的公司开发了一个 SDK,结果是一个 AAR 文件,该文件已发布在远程 Maven 存储库(可以匿名访问)上。但是,此 AAR 有几个依赖项,例如:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile files('libs/BluetoothLeLibrary-0.0.2.jar')
    compile 'com.google.code.gson:gson:2.3'

    compile 'com.company.sdk.client:sdk-client-lib:1.2.1.1@jar'
    compile 'com.company.internal.commons:enums:1.0@jar'

    compile 'com.google.android.gms:play-services-location:6.5.87'
    compile 'com.android.support:support-v4:21.0.3'
    compile 'com.google.guava:guava:18.0'
    compile 'com.google.api-client:google-api-client-android:1.17.0-rc'
    compile('com.google.api-client:google-api-client:1.17.0-rc') {
        exclude(group: 'xpp3', module: 'xpp3')
        exclude(group: 'org.apache.httpcomponents', module: 'httpclient')
        exclude(group: 'junit', module: 'junit')
        exclude(group: 'com.google.android', module: 'android')
    }
    compile('com.google.http-client:google-http-client-android:1.17.0-rc') {
        exclude(group: 'com.google.android', module: 'android')
    }
}

以 com.company 开头的是我们公司使用的私有库。它们位于另一个 Maven 存储库中,只有使用用户名和密码的员工和协作者才能访问该存储库。

现在,任何开发人员都可以使用此 AAR 文件来访问其功能。但是,如果像代码示例 A 中所示添加依赖项,则构建过程会中断,因为它需要访问 Android 清单中使用的 Google Play 服务变量 @integer/google_play_services_version。我找到了两个解决方法,显示在代码示例 B 和 C 上。但是,通过使用代码示例 B,使用 SDK 的应用程序会尝试下载和访问公司的私有库;但由于它们只能通过用户和密码访问,所以 gradle 根本找不到它们。另一方面,代码示例 C 使应用程序无法在这些库上找到类和方法;奇怪的是,代码编译并运行,但应用程序崩溃并出现 java.lang.VerifyError 并拒绝 SDK 的类。

如何将这些私有库添加到 AAR,以避免应用程序尝试下载它们?或者我该如何解决这个问题?

代码示例 A:

compile 'com.company.sdk:library:1.3.0.0@aar'

代码示例 B:

compile ('com.company.sdk:library:1.3.0.0@aar'){
    transitive=true
}

代码示例 C:

compile 'com.google.android.gms:play-services-location:6.5.87'
compile ('com.company.cc.sdk:library:1.3.0.2@aar'){
    exclude(group: 'com.google.android.gms', module:'play-services-location')
}
4

0 回答 0