1
0
mirror of https://github.com/square/okhttp.git synced 2025-11-24 18:41:06 +03:00

Upgrade to Android 10 APIs when available (#5821)

* Upgrade robolectric dependency

* cleanup

* Suppress animal sniffer checks on known classes

* Update build.gradle

* Update build.gradle
This commit is contained in:
Yuri Schimke
2020-04-10 15:42:29 +01:00
committed by GitHub
parent 91f16b4354
commit b3b788a942
11 changed files with 42 additions and 15 deletions

View File

@@ -25,7 +25,7 @@ buildscript {
ext.deps = [ ext.deps = [
'picocli': "info.picocli:picocli:${versions.picocli}", 'picocli': "info.picocli:picocli:${versions.picocli}",
'android': "org.robolectric:android-all:9-robolectric-4913185-2", 'android': "org.robolectric:android-all:10-robolectric-5803371",
'animalSniffer': "org.codehaus.mojo:animal-sniffer-annotations:${versions.animalSniffer}", 'animalSniffer': "org.codehaus.mojo:animal-sniffer-annotations:${versions.animalSniffer}",
'assertj': "org.assertj:assertj-core:${versions.assertj}", 'assertj': "org.assertj:assertj-core:${versions.assertj}",
'bouncycastle': "org.bouncycastle:bcprov-jdk15on:${versions.bouncycastle}", 'bouncycastle': "org.bouncycastle:bcprov-jdk15on:${versions.bouncycastle}",
@@ -141,8 +141,11 @@ subprojects { project ->
} }
} }
// Animal Sniffer confirms we don't use APIs not on both Java 8 and Android 5. // Animal Sniffer confirms we generally don't use APIs not on Java 8.
animalsniffer { animalsniffer {
// https://github.com/mojohaus/animal-sniffer/issues/70
excludeJars "android-all-*"
annotation "okhttp3.internal.SuppressSignatureCheck"
sourceSets = [sourceSets.main] sourceSets = [sourceSets.main]
} }
dependencies { dependencies {

View File

@@ -19,8 +19,10 @@ import java.io.IOException
import java.net.InetAddress import java.net.InetAddress
import java.net.InetSocketAddress import java.net.InetSocketAddress
import java.net.Proxy import java.net.Proxy
import okhttp3.internal.SuppressSignatureCheck
/** Data classes that correspond to each of the methods of [EventListener]. */ /** Data classes that correspond to each of the methods of [EventListener]. */
@SuppressSignatureCheck
sealed class CallEvent { sealed class CallEvent {
abstract val timestampNs: Long abstract val timestampNs: Long
abstract val call: Call abstract val call: Call

View File

@@ -51,10 +51,6 @@ afterEvaluate { project ->
} }
} }
animalsniffer {
ignore 'javax.net.ssl.SSLParameters', 'javax.net.ssl.SSLSocket'
}
task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask, dependsOn: 'jar') { task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask, dependsOn: 'jar') {
oldClasspath = files(baselineJar(project, baselineVersion)) oldClasspath = files(baselineJar(project, baselineVersion))
newClasspath = files(jar.archivePath) newClasspath = files(jar.archivePath)

View File

@@ -0,0 +1,12 @@
package okhttp3.internal
import java.lang.annotation.Documented
import kotlin.annotation.AnnotationRetention.BINARY
import kotlin.annotation.AnnotationTarget.CLASS
import kotlin.annotation.AnnotationTarget.CONSTRUCTOR
import kotlin.annotation.AnnotationTarget.FUNCTION
@Retention(BINARY)
@Documented
@Target(CONSTRUCTOR, CLASS, FUNCTION)
annotation class SuppressSignatureCheck

View File

@@ -15,13 +15,14 @@
*/ */
package okhttp3.internal.platform package okhttp3.internal.platform
import android.annotation.TargetApi import android.annotation.SuppressLint
import android.os.Build import android.os.Build
import android.security.NetworkSecurityPolicy import android.security.NetworkSecurityPolicy
import javax.net.ssl.SSLSocket import javax.net.ssl.SSLSocket
import javax.net.ssl.SSLSocketFactory import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.X509TrustManager import javax.net.ssl.X509TrustManager
import okhttp3.Protocol import okhttp3.Protocol
import okhttp3.internal.SuppressSignatureCheck
import okhttp3.internal.platform.AndroidPlatform.Companion.isAndroid import okhttp3.internal.platform.AndroidPlatform.Companion.isAndroid
import okhttp3.internal.platform.android.Android10CertificateChainCleaner import okhttp3.internal.platform.android.Android10CertificateChainCleaner
import okhttp3.internal.platform.android.Android10SocketAdapter import okhttp3.internal.platform.android.Android10SocketAdapter
@@ -31,6 +32,7 @@ import okhttp3.internal.platform.android.androidLog
import okhttp3.internal.tls.CertificateChainCleaner import okhttp3.internal.tls.CertificateChainCleaner
/** Android 29+. */ /** Android 29+. */
@SuppressSignatureCheck
class Android10Platform : Platform() { class Android10Platform : Platform() {
private val socketAdapters = listOfNotNull( private val socketAdapters = listOfNotNull(
Android10SocketAdapter.buildIfSupported(), Android10SocketAdapter.buildIfSupported(),
@@ -56,7 +58,7 @@ class Android10Platform : Platform() {
androidLog(level, message, t) androidLog(level, message, t)
} }
@TargetApi(Build.VERSION_CODES.N) @SuppressLint("NewApi")
override fun isCleartextTrafficPermitted(hostname: String): Boolean = override fun isCleartextTrafficPermitted(hostname: String): Boolean =
NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(hostname) NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(hostname)

View File

@@ -27,6 +27,7 @@ import javax.net.ssl.SSLSocket
import javax.net.ssl.SSLSocketFactory import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.X509TrustManager import javax.net.ssl.X509TrustManager
import okhttp3.Protocol import okhttp3.Protocol
import okhttp3.internal.SuppressSignatureCheck
import okhttp3.internal.platform.android.AndroidCertificateChainCleaner import okhttp3.internal.platform.android.AndroidCertificateChainCleaner
import okhttp3.internal.platform.android.CloseGuard import okhttp3.internal.platform.android.CloseGuard
import okhttp3.internal.platform.android.ConscryptSocketAdapter import okhttp3.internal.platform.android.ConscryptSocketAdapter
@@ -38,6 +39,7 @@ import okhttp3.internal.tls.CertificateChainCleaner
import okhttp3.internal.tls.TrustRootIndex import okhttp3.internal.tls.TrustRootIndex
/** Android 5+. */ /** Android 5+. */
@SuppressSignatureCheck
class AndroidPlatform : Platform() { class AndroidPlatform : Platform() {
private val socketAdapters = listOfNotNull( private val socketAdapters = listOfNotNull(
StandardAndroidSocketAdapter.buildIfSupported(), StandardAndroidSocketAdapter.buildIfSupported(),

View File

@@ -19,9 +19,11 @@ import javax.net.ssl.SSLSocket
import javax.net.ssl.SSLSocketFactory import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.X509TrustManager import javax.net.ssl.X509TrustManager
import okhttp3.Protocol import okhttp3.Protocol
import okhttp3.internal.SuppressSignatureCheck
/** OpenJDK 9+. */ /** OpenJDK 9+. */
open class Jdk9Platform : Platform() { open class Jdk9Platform : Platform() {
@SuppressSignatureCheck
override fun configureTlsExtensions( override fun configureTlsExtensions(
sslSocket: SSLSocket, sslSocket: SSLSocket,
hostname: String?, hostname: String?,
@@ -36,6 +38,7 @@ open class Jdk9Platform : Platform() {
sslSocket.sslParameters = sslParameters sslSocket.sslParameters = sslParameters
} }
@SuppressSignatureCheck
override fun getSelectedProtocol(sslSocket: SSLSocket): String? { override fun getSelectedProtocol(sslSocket: SSLSocket): String? {
// SSLSocket.getApplicationProtocol returns "" if application protocols values will not // SSLSocket.getApplicationProtocol returns "" if application protocols values will not
// be used. Observed if you didn't specify SSLParameters.setApplicationProtocols // be used. Observed if you didn't specify SSLParameters.setApplicationProtocols

View File

@@ -22,6 +22,7 @@ import java.security.cert.CertificateException
import java.security.cert.X509Certificate import java.security.cert.X509Certificate
import javax.net.ssl.SSLPeerUnverifiedException import javax.net.ssl.SSLPeerUnverifiedException
import javax.net.ssl.X509TrustManager import javax.net.ssl.X509TrustManager
import okhttp3.internal.SuppressSignatureCheck
import okhttp3.internal.tls.CertificateChainCleaner import okhttp3.internal.tls.CertificateChainCleaner
/** /**
@@ -37,6 +38,7 @@ internal class Android10CertificateChainCleaner(
) : CertificateChainCleaner() { ) : CertificateChainCleaner() {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@Throws(SSLPeerUnverifiedException::class) @Throws(SSLPeerUnverifiedException::class)
@SuppressSignatureCheck
override override
fun clean(chain: List<Certificate>, hostname: String): List<Certificate> { fun clean(chain: List<Certificate>, hostname: String): List<Certificate> {
val certificates = (chain as List<X509Certificate>).toTypedArray() val certificates = (chain as List<X509Certificate>).toTypedArray()
@@ -54,6 +56,7 @@ internal class Android10CertificateChainCleaner(
override fun hashCode(): Int = System.identityHashCode(trustManager) override fun hashCode(): Int = System.identityHashCode(trustManager)
companion object { companion object {
@SuppressSignatureCheck
fun buildIfSupported(trustManager: X509TrustManager): Android10CertificateChainCleaner? { fun buildIfSupported(trustManager: X509TrustManager): Android10CertificateChainCleaner? {
val extensions = try { val extensions = try {
X509TrustManagerExtensions(trustManager) X509TrustManagerExtensions(trustManager)

View File

@@ -16,7 +16,7 @@
package okhttp3.internal.platform.android package okhttp3.internal.platform.android
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.net.SSLCertificateSocketFactory import android.net.ssl.SSLSockets
import android.os.Build import android.os.Build
import java.io.IOException import java.io.IOException
import java.lang.IllegalArgumentException import java.lang.IllegalArgumentException
@@ -24,22 +24,21 @@ import javax.net.ssl.SSLSocket
import javax.net.ssl.SSLSocketFactory import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.X509TrustManager import javax.net.ssl.X509TrustManager
import okhttp3.Protocol import okhttp3.Protocol
import okhttp3.internal.SuppressSignatureCheck
import okhttp3.internal.platform.AndroidPlatform.Companion.isAndroid import okhttp3.internal.platform.AndroidPlatform.Companion.isAndroid
import okhttp3.internal.platform.Platform import okhttp3.internal.platform.Platform
/** /**
* Simple non-reflection SocketAdapter for Android Q. * Simple non-reflection SocketAdapter for Android Q.
*/ */
@SuppressLint("NewApi")
@SuppressSignatureCheck
class Android10SocketAdapter : SocketAdapter { class Android10SocketAdapter : SocketAdapter {
private val socketFactory =
SSLCertificateSocketFactory.getDefault(10000) as SSLCertificateSocketFactory
override fun trustManager(sslSocketFactory: SSLSocketFactory): X509TrustManager? = null override fun trustManager(sslSocketFactory: SSLSocketFactory): X509TrustManager? = null
override fun matchesSocketFactory(sslSocketFactory: SSLSocketFactory): Boolean = false override fun matchesSocketFactory(sslSocketFactory: SSLSocketFactory): Boolean = false
override fun matchesSocket(sslSocket: SSLSocket): Boolean = sslSocket.javaClass.name.startsWith( override fun matchesSocket(sslSocket: SSLSocket): Boolean = SSLSockets.isSupportedSocket(sslSocket)
"com.android.org.conscrypt")
override fun isSupported(): Boolean = Companion.isSupported() override fun isSupported(): Boolean = Companion.isSupported()
@@ -57,7 +56,7 @@ class Android10SocketAdapter : SocketAdapter {
protocols: List<Protocol> protocols: List<Protocol>
) { ) {
try { try {
socketFactory.setUseSessionTickets(sslSocket, true) SSLSockets.setUseSessionTickets(sslSocket, true)
val sslParameters = sslSocket.sslParameters val sslParameters = sslSocket.sslParameters
@@ -71,6 +70,7 @@ class Android10SocketAdapter : SocketAdapter {
} }
} }
@SuppressSignatureCheck
companion object { companion object {
fun buildIfSupported(): SocketAdapter? = fun buildIfSupported(): SocketAdapter? =
if (isSupported()) Android10SocketAdapter() else null if (isSupported()) Android10SocketAdapter() else null

View File

@@ -21,6 +21,7 @@ import java.security.cert.Certificate
import java.security.cert.X509Certificate import java.security.cert.X509Certificate
import javax.net.ssl.SSLPeerUnverifiedException import javax.net.ssl.SSLPeerUnverifiedException
import javax.net.ssl.X509TrustManager import javax.net.ssl.X509TrustManager
import okhttp3.internal.SuppressSignatureCheck
import okhttp3.internal.tls.CertificateChainCleaner import okhttp3.internal.tls.CertificateChainCleaner
/** /**
@@ -38,6 +39,7 @@ internal class AndroidCertificateChainCleaner(
@Suppress("UNCHECKED_CAST") // Reflection on List<Certificate> @Suppress("UNCHECKED_CAST") // Reflection on List<Certificate>
@Throws(SSLPeerUnverifiedException::class) @Throws(SSLPeerUnverifiedException::class)
@SuppressSignatureCheck
override override
fun clean(chain: List<Certificate>, hostname: String): List<Certificate> = try { fun clean(chain: List<Certificate>, hostname: String): List<Certificate> = try {
val certificates = (chain as List<X509Certificate>).toTypedArray() val certificates = (chain as List<X509Certificate>).toTypedArray()

View File

@@ -16,10 +16,12 @@
package okhttp3.internal.platform.android package okhttp3.internal.platform.android
import android.util.Log import android.util.Log
import okhttp3.internal.SuppressSignatureCheck
import okhttp3.internal.platform.Platform import okhttp3.internal.platform.Platform
private const val MAX_LOG_LENGTH = 4000 private const val MAX_LOG_LENGTH = 4000
@SuppressSignatureCheck
internal fun androidLog(level: Int, message: String, t: Throwable?) { internal fun androidLog(level: Int, message: String, t: Throwable?) {
var logMessage = message var logMessage = message
val logLevel = when (level) { val logLevel = when (level) {