【问题标题】:OkHttp support for SDK versions less than 21OkHttp 支持低于 21 的 SDK 版本
【发布时间】:2020-03-29 19:31:49
【问题描述】:

OkHttp 具有 recently dropped support for Android 4,但通过 separate 3.12.x branch 除外,它将在 2021 年 12 月结束之前得到支持(并且可能只会收到重要的更新或错误修复)。

假设您希望像我一样继续支持 Android 4,因为 10% 的 Android 用户群仍然是一个很大的比例,并且不想陷入死胡同。 .

不是卡在所有 sdk 版本的 3.12.x 分支上,有没有什么方法可以使用 sdk < 21 的 3.12 分支和 sdk >= 21 的 3.13 分支,有点像当然可以将HttpUrlConnection 用于sdk < 21 和OkHttp 3.13 用于sdk >= 21?

【问题讨论】:

  • 是的,这是可能的。制作两个build flavors,一个带有minSdkVersion 21 和OkHttp 3.13+,另一个带有默认minSdkVersion 和OkHttp LeakCanary Readme 请记住,您不能在src/main 中的公共代码中使用新的 API。仅在src/<newOkHttpFlavor>.
  • 有趣。但我的项目中也有不同的风格:free、pro、devfree 和 devpro,每个都有略微不同的设置。那么,由于我们需要拆分每一个...free-okhttp-old、free-okhttp-new 等,因此采用您的方法是否不可能(或非常困难)?如果新的3.13 分支是一个完全独立的库(可能是okhttp4),这样我们可以独立使用它,并在基于android.os.Build.VERSION.SDK_INT 的代码中选择它们,那会不会容易很多?
  • 搜索“风味尺寸”。看起来你应该有 3 个维度,“环境”与“生产”和“开发”,“货币化”与“免费”和“付费”,以及“sdk”与“遗留”和“棒棒糖”。不要将其限制为 okhttp。各种事情都需要 API 21。不要在运行时决定这个。未使用的代码根本不应该在 apk 中。
  • 谢谢,这很有帮助。听起来我需要稍微调整一下我的项目。非常感谢您的帮助。
  • @EugenPechanec 如果您将您的第一条评论作为答案,我可以接受!

标签: android okhttp


【解决方案1】:

我实际上在我为 NativeScript 创建的项目中创建了一个示例:nativescript-http

我希望 minSdk >= 21 使用 OkHttp4 和 minSdk > 17 && minSdk < 21 使用 LTS 版本:OkHttp 3.12。我正在使用 minSdk 17,因为它与 NativeScript 一样低。但是当然你可以降到 OkHttp3 支持的最低。

这并不像仅仅为不同的 minSdk 版本创建风味那么简单,这可能是由于 NativeScript 通过插件处理依赖关系的方式。我花了半天时间才弄明白,所以我把它贴在这里,它可能对某人有帮助:

android {
  // ... other config.
  flavorDimensions "api"

  productFlavors {
    minApi21 {
      dimension "api"
      minSdkVersion 21
      versionNameSuffix "-minApi21"
    }

    minApi17 {
      dimension "api"
      minSdkVersion 17
      versionNameSuffix "-minApi17"
    }
  }
}

android.applicationVariants.all { variant ->
  if (variant.name.contains("minApi17")) {
    variant.getCompileConfiguration().resolutionStrategy.force "com.squareup.okhttp3:okhttp:3.12.+"
    variant.getRuntimeConfiguration().resolutionStrategy.force "com.squareup.okhttp3:okhttp:3.12.+"
  }

  variant.outputs.each { output ->
    if (variant.name.contains("minApi17")) {
      output.versionCodeOverride = 10000000 + variant.versionCode
    } else {
      output.versionCodeOverride = 20000000 + variant.versionCode
    }
  }
}

android 中的部分是创建 2 种产品风味,一种用于 minSdk 17,一种用于 minSdk 21。

android.applicationVariants 中的部分由两部分组成:

  1. 确保 minApi17 对 minSdk 17 使用版本 3.12.+
  2. 确保每种风格都有自己的构建版本代码。它从清单中获取版本,对 minApi17 执行 (10000000 + manifestVersionCode),对 minApi21 执行 (20000000 + manifestVersionCode)。 这将在您构建版本时创建 2 个 APK,一个用于 Android 4 (app-minApi17-release.apk),一个用于 Android 5 (app-minApi21-release.apk)。您还可以将其与 ABI 拆分结合使用。

当您将两个 APK 上传到 Playstore 时,Google 会确保将正确的 APK 分配到不同的设备。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多