Commit ea711e1b authored by Paul Jensen's avatar Paul Jensen Committed by Commit Bot

Replace reflection with direct calls to Android P APIs.

This is possible now that Android P SDK is in Chromium.
The direct calls are placed in an ApiHelper class to avoid ART runtime
verification issues.

Change-Id: I88cf7788006aaa63b708a16f52aad00132e28c05
Reviewed-on: https://chromium-review.googlesource.com/c/1335874Reviewed-by: default avatarMisha Efimov <mef@chromium.org>
Reviewed-by: default avatarNate Fischer <ntfschr@chromium.org>
Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Commit-Queue: Paul Jensen <pauljensen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#608394}
parent c549deee
......@@ -2988,6 +2988,7 @@ if (is_android) {
"android/java/src/org/chromium/base/compat/ApiHelperForM.java",
"android/java/src/org/chromium/base/compat/ApiHelperForN.java",
"android/java/src/org/chromium/base/compat/ApiHelperForO.java",
"android/java/src/org/chromium/base/compat/ApiHelperForP.java",
"android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
"android/java/src/org/chromium/base/library_loader/Linker.java",
"android/java/src/org/chromium/base/library_loader/LoaderErrors.java",
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.base.compat;
import android.annotation.TargetApi;
import android.net.LinkProperties;
import android.os.Build;
import org.chromium.base.annotations.DoNotInline;
/**
* Utility class to use new APIs that were added in P (API level 28). These need to exist in a
* separate class so that Android framework can successfully verify classes without
* encountering the new APIs.
*/
@DoNotInline
@TargetApi(Build.VERSION_CODES.P)
public final class ApiHelperForP {
private ApiHelperForP() {}
/** See {@link LinkProperties#isPrivateDnsActive() }. */
public static boolean isPrivateDnsActive(LinkProperties linkProperties) {
return linkProperties.isPrivateDnsActive();
}
/** See {@link LinkProperties#getPrivateDnsServerName() }. */
public static String getPrivateDnsServerName(LinkProperties linkProperties) {
return linkProperties.getPrivateDnsServerName();
}
}
......@@ -32,6 +32,7 @@ import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.CalledByNativeUnchecked;
import org.chromium.base.annotations.MainDex;
import org.chromium.base.compat.ApiHelperForM;
import org.chromium.base.compat.ApiHelperForP;
import org.chromium.base.metrics.RecordHistogram;
import java.io.FileDescriptor;
......@@ -64,10 +65,6 @@ import java.util.Set;
class AndroidNetworkLibrary {
private static final String TAG = "AndroidNetworkLibrary";
// Cached Method for LinkProperties.isPrivateDnsActive().
private static Method sIsPrivateDnsActiveMethod;
// Cached Method for LinkProperties.getPrivateDnsServerName().
private static Method sGetPrivateDnsServerNameMethod;
// Cached value indicating if app has ACCESS_NETWORK_STATE permission.
private static Boolean sHaveAccessNetworkState;
......@@ -342,18 +339,7 @@ class AndroidNetworkLibrary {
*/
static boolean isPrivateDnsActive(LinkProperties linkProperties) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && linkProperties != null) {
// TODO(pauljensen): When Android P SDK is available, remove reflection.
try {
// This could be racy if called on multiple threads, but races will
// end in the same result so it's not a problem.
if (sIsPrivateDnsActiveMethod == null) {
sIsPrivateDnsActiveMethod =
linkProperties.getClass().getMethod("isPrivateDnsActive");
}
return ((Boolean) sIsPrivateDnsActiveMethod.invoke(linkProperties)).booleanValue();
} catch (Exception e) {
Log.e(TAG, "Can not call LinkProperties.isPrivateDnsActive():", e);
}
return ApiHelperForP.isPrivateDnsActive(linkProperties);
}
return false;
}
......@@ -363,18 +349,7 @@ class AndroidNetworkLibrary {
*/
private static String getPrivateDnsServerName(LinkProperties linkProperties) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && linkProperties != null) {
// TODO(pauljensen): When Android P SDK is available, remove reflection.
try {
// This could be racy if called on multiple threads, but races will
// end in the same result so it's not a problem.
if (sGetPrivateDnsServerNameMethod == null) {
sGetPrivateDnsServerNameMethod =
linkProperties.getClass().getMethod("getPrivateDnsServerName");
}
return (String) sGetPrivateDnsServerNameMethod.invoke(linkProperties);
} catch (Exception e) {
Log.e(TAG, "Can not call LinkProperties.getPrivateDnsServerName():", e);
}
return ApiHelperForP.getPrivateDnsServerName(linkProperties);
}
return null;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment