OkHttp支持SDK版本低于21的问题

10
OkHttp最近已停止支持Android 4, 除非通过一个单独的3.12.x分支,该分支将在2021年底之前得到支持(并且可能只会接收关键更新或错误修复)。

假设您希望继续支持Android 4,就像我一样,因为10%的Android用户基础仍然是相当大的比例,并且不想陷入死胡同分支...

与其针对所有sdk版本使用3.12.x分支,是否有任何方法可以使用3.12分支作为sdk <21的版本和3.13分支作为sdk >=21的版本,就像当然可以使用HttpUrlConnection作为sdk <21和OkHttp 3.13作为sdk >=21


3
可以实现。创建两个 构建变体,一个带有 minSdkVersion 21 和 OkHttp 3.13+,另一个带有默认的 minSdkVersion 和 OkHttp < 3.13。以下是如何为不同变体包含不同依赖项的示例:LeakCanary 自述文件请记住,您不能在公共代码(src/main)中使用新的 API,只能在 src/<newOkHttpFlavor> 中使用。 - Eugen Pechanec
1
有趣。但我的项目中也有不同的版本:freeprodevfreedevpro,每个版本都有略微不同的设置。这是否使得采用你的方法变得不可能(或非常困难),因为我们需要将它们拆分成 free-okhttp-oldfree-okhttp-new 等?如果新的 3.13 分支是完全独立的库(也许叫做 okhttp4),那么我们就可以独立使用它,并根据 android.os.Build.VERSION.SDK_INT 在代码中进行选择,这样不会更容易吗? - drmrbrewer
3
搜索“口味维度”。似乎您应该有3个维度,“环境”包括“生产”和“开发”,“货币化”包括“免费”和“付费”,以及“SDK”包括“遗留版”和“棒棒糖”。不要限制在okhttp上。各种事物都需要API 21。不要在运行时决定这个。未使用的代码根本不应该在apk中。 - Eugen Pechanec
1
谢谢,这很有帮助。听起来我需要稍微重新组织一下我的项目。非常感谢你的帮助。 - drmrbrewer
@EugenPechanec 如果您将第一条评论作为答案,我可以接受它! - drmrbrewer
1个回答

2
我在为NativeScript创建的项目中创建了一个示例:nativescript-http
我希望minSdk >= 21使用OkHttp4,而minSdk > 17 && minSdk < 21使用LTS版本:OkHttp 3.12。我使用minSdk 17,因为这是NativeScript支持的最低版本。当然,你也可以选择低于OkHttp3支持的版本。
由于NativeScript通过插件处理依赖关系,所以创建不同minSdk版本的flavors并不像想象中那么简单。我花了半天时间才弄明白怎么做,所以在这里发布一下,希望能帮到有需要的人。
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中,需要创建两个产品风格,一个适用于minSdk 17,另一个适用于minSdk 21。
在android.applicationVariants部分包括两件事:
1. 确保flavor minApi17使用版本3.12.+适用于minSdk 17
2. 确保每个flavor都有自己的build versionCode。它从清单中获取版本并为minApi17执行(10000000 + manifestVersionCode),为minApi21执行(20000000 + manifestVersionCode)。这将在构建发布时创建2个APK,一个用于Android 4 (app-minApi17-release.apk),一个用于Android 5 (app-minApi21-release.apk)。您还可以将其与ABI拆分结合使用。
当您将两个APK上传到Play商店时,谷歌会确保将适当的APK分发给不同的设备。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接