【问题标题】:What's the difference between principles of useLibrary and compile files('') in build.gradle?build.gradle中useLibrary和compile files('')的原理有什么区别?
【发布时间】:2016-01-05 23:42:48
【问题描述】:

Android 6.0 发布后,对 Apache HTTP 客户端 的支持被移除。如果我们的应用正在使用此客户端并针对 Android 2.3(API 级别 9)或更高版本,建议使用 HttpURLConnection 类。据说这个 API 更高效,因为它通过透明压缩和响应缓存减少了网络使用,并最大限度地降低了功耗。如果我们想继续使用 Apache HTTP API,您必须首先在我们的 build.gradle 文件中声明以下编译时依赖项:

android {
    useLibrary 'org.apache.http.legacy'
}

旧版 jar 位于 Android SDK 中,其路径为 sdk/platforms/android-23/optional/。所以,它几乎是独立的。同时,这个 apache legacy jar 被放入 Android SDK 中的optional/,那么optional/ 是什么?这是什么意思?

我们也知道,我们可以把这个 jar 放到 libs 中,然后在我们的 build.gradle 文件中声明它,如下所示:

dependencies {
    compile files('libs/org.apache.http.legacy.jar')
}

当我测试时,这两种方法都按预期工作。

但是为什么呢?

build.gradle 中的useLibrary 和compile files('') 有什么区别?只是因为遗留的jar文件在android SDK中,所以我可以在build.gradle中声明useLibrary来使用它?我可以以这种方式使用其他罐子吗?

有人可以提供一些关于这个的想法吗?

【问题讨论】:

    标签: android android-gradle-plugin android-build android-uselibrary android-apache-legacy


    【解决方案1】:

    useLibrary 在编译时将库添加到类路径,但不会将库与应用程序捆绑在一起。

    compile 依赖项在编译时位于类路径中,并且它们会随您的 APK 一起提供。

    对于 Apache HttpClient 支持,使用 SDK 23+ 编译时使用 useLibrary。该库已经存在于目标平台中。它只是在编译 SDK 中不存在。

    【讨论】:

    • The library is already there in the target platform 是什么意思?如果我的targetSDK 是 23+,是这样吗?
    • 它在您设备上预装的库中。 TargetSDK 控制启用哪些向后兼容模式,而不是安装哪些库。
    • 那么,设备中预装的库和我们开发的Android SDK不是一回事吗?你能详细描述一下吗?
    • 如果你看一下你编译时使用的 SDK android.jar,它只是抛出异常的存根。在运行时环境中就不一样了。
    猜你喜欢
    • 1970-01-01
    • 2011-01-14
    • 2015-07-21
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多