6

我正在开发的一个未发布的 android 库中有一个第三方网络库——在这种情况下是 OkHttp。

使用此库作为依赖项的项目现在也可以使用该网络库创建对象。

我可以限制或禁用对包含在我的库中的网络库的访问吗?

4

3 回答 3

1

通常默认情况下,您没有这样的依赖项:

compile rootProject.ext.okhttp

在你的 jar 中编译只有你的来源。所以 OkHttp 类不会在你的库中。

我有完全相同的情况。我使用 gradle 构建并上传到 maven。你可以在这里查看

因此,如果您的意图是在包中包含确切的部门版本并隐藏,您只需将其作为模块包含在您的项目中,并更改一些内容,例如 OkHttp 的包以避免冲突以及访问当前公共okhttp 会员。OkHttp 正在使用 Okio,因此您可能也希望将其私有化。

请注意,这种阴影类的阴影 + 隐藏功能对于框架依赖项可能很有用(确保运行时中的所有部门都可用),但它会增加您的库的大小,并且不会成为使用您的库的应用程序的最佳选择,因为它们无论如何,请确保在 apk 中打包所需的部门。

于 2016-04-04T18:59:54.087 回答
1

您可以建立依赖关系,transitive但是如果您的代码在他们的应用程序中遇到丢失的代码,它将失败 ClassNotFound 或 MethodNotFound

dependencies {
    compile('com.squareup.okhttp3:okhttp:3.2.0') {
        transitive = false
    }
}

除此之外,一旦代码与您的库一起打包,任何想要从您的库中使用它的人都可以使用它。

这仍然无法解决您希望的问题,但您可以使用 proguard 重命名 okhttp 类。您的 lib 的用户仍然可以调用 okhttp 类,但它们会被 proguard 重命名为 a,b,c,...

于 2016-03-29T18:11:13.933 回答
1

你想要做的是遮蔽依赖。这是一篇博客文章中关于 Gradle 中的着色依赖项的描述:

对库进行遮蔽就是获取所述库的内容文件,将它们放入您自己的 jar 中,然后更改它们的包。这与打包不同,后者只是将库文件运送到您自己的 jar 中而不将它们重新定位到不同的包. 术语 fatjar 通常用于指代将应用程序及其依赖项打包或隐藏到其中的 jars。

对于较小的库来说很容易做到。我可以想象像 OkHttp 这样的大型库可能很难。您可以通过简单地将文件复制到项目中并更改包来手动完成。还有一些脚本会自动执行此操作。他们通常使用Jar Jar Links

于 2016-04-03T07:55:48.120 回答