OkHttp支持的SDK版本少于21

drm*_*wer 7 android okhttp okhttp3

OkHttp 最近放弃了对Android 4的支持,除非通过一个单独的3.12.x分支支持该分支,直到2020年12月结束(并且可能只收到重要的更新或错误修正)。

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

没有将3.12.x所有sdk版本都卡在分支上,有没有办法使用3.12branch for sdk < 213.13branch for sdk >= 21,有点像当然可以使用HttpUrlConnectionfor sdk < 21和OkHttp 3.13for sdk >= 21吗?

小智 2

我实际上在为 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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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 分发到不同的设备。