summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libart/src/main/java/dalvik/system/VMRuntime.java71
-rw-r--r--mmodules/core_platform_api/api/platform/current-api.txt9
2 files changed, 80 insertions, 0 deletions
diff --git a/libart/src/main/java/dalvik/system/VMRuntime.java b/libart/src/main/java/dalvik/system/VMRuntime.java
index d2f0317b18..c5cabe31c4 100644
--- a/libart/src/main/java/dalvik/system/VMRuntime.java
+++ b/libart/src/main/java/dalvik/system/VMRuntime.java
@@ -56,6 +56,77 @@ public final class VMRuntime {
}
/**
+ * Interface for logging hidden API usage events.
+ */
+ @libcore.api.CorePlatformApi
+ public interface HiddenApiUsageLogger {
+
+ // The following ACCESS_METHOD_ constants must match the values in
+ // art/runtime/hidden_api.h
+ /**
+ * Internal test value that does not correspond to an actual access by the
+ * application. Never logged, added for completeness.
+ */
+ public static final int ACCESS_METHOD_NONE = 0;
+
+ /**
+ * Used when a method has been accessed via reflection.
+ */
+ public static final int ACCESS_METHOD_REFLECTION = 1;
+
+ /**
+ * Used when a method has been accessed via JNI.
+ */
+ public static final int ACCESS_METHOD_JNI = 2;
+
+ /**
+ * Used when a method is accessed at link time. Never logged, added only
+ * for completeness.
+ */
+ public static final int ACCESS_METHOD_LINKING = 3;
+
+ /**
+ * Logs hidden API access
+ *
+ * @param appPackageName package name of the app attempting the access
+ * @param signature signature of the method being called, i.e
+ * class_name->member_name:type_signature (e.g.
+ * {@code com.android.app.Activity->mDoReportFullyDrawn:Z}) for fields and
+ * class_name->method_name_and_signature for methods (e.g
+ * {@code com.android.app.Activity->finish(I)V})
+ * @param accessType how the accessed was done
+ * @param accessDenied whether the access was allowed or not
+ */
+ public void hiddenApiUsed(String appPackageName, String signature,
+ int accessType, boolean accessDenied);
+ }
+
+ static HiddenApiUsageLogger hiddenApiUsageLogger;
+
+ /**
+ * Sets the hidden API usage logger {@link #hiddenApiUsageLogger}.
+ * It should only be called if {@link #setHiddenApiAccessLogSamplingRate(int)}
+ * is called with a value > 0
+ */
+ @libcore.api.CorePlatformApi
+ public static void setHiddenApiUsageLogger(HiddenApiUsageLogger hiddenApiUsageLogger) {
+ VMRuntime.hiddenApiUsageLogger = hiddenApiUsageLogger;
+ }
+
+ /**
+ * Records an attempted hidden API access to
+ * {@link HiddenApiUsageLogger#hiddenApiUsed(String, String, int, boolean}
+ * if a logger is registered via {@link #setHiddenApiUsageLogger}.
+ */
+ private static void hiddenApiUsed(String appPackageName, String signature,
+ int accessType, boolean accessDenied) {
+ if (VMRuntime.hiddenApiUsageLogger != null) {
+ VMRuntime.hiddenApiUsageLogger.hiddenApiUsed(appPackageName, signature,
+ accessType, accessDenied);
+ }
+ }
+
+ /**
* Magic version number for a current development build, which has not
* yet turned into an official release. This number must be larger than
* any released version in {@code android.os.Build.VERSION_CODES}.
diff --git a/mmodules/core_platform_api/api/platform/current-api.txt b/mmodules/core_platform_api/api/platform/current-api.txt
index d2ecf2976b..23dd527b85 100644
--- a/mmodules/core_platform_api/api/platform/current-api.txt
+++ b/mmodules/core_platform_api/api/platform/current-api.txt
@@ -774,6 +774,7 @@ package dalvik.system {
method public static void setDedupeHiddenApiWarnings(boolean);
method public void setHiddenApiAccessLogSamplingRate(int);
method public void setHiddenApiExemptions(String[]);
+ method public static void setHiddenApiUsageLogger(dalvik.system.VMRuntime.HiddenApiUsageLogger);
method public static void setNonSdkApiUsageConsumer(java.util.function.Consumer<java.lang.String>);
method public static void setProcessPackageName(String);
method @dalvik.annotation.compat.UnsupportedAppUsage public float setTargetHeapUtilization(float);
@@ -785,6 +786,14 @@ package dalvik.system {
field public static final int SDK_VERSION_CUR_DEVELOPMENT = 10000; // 0x2710
}
+ public static interface VMRuntime.HiddenApiUsageLogger {
+ method public void hiddenApiUsed(String, String, int, boolean);
+ field public static final int ACCESS_METHOD_JNI = 2; // 0x2
+ field public static final int ACCESS_METHOD_LINKING = 3; // 0x3
+ field public static final int ACCESS_METHOD_NONE = 0; // 0x0
+ field public static final int ACCESS_METHOD_REFLECTION = 1; // 0x1
+ }
+
public final class VMStack {
method @dalvik.annotation.optimization.FastNative public static dalvik.system.AnnotatedStackTraceElement[] getAnnotatedThreadStackTrace(Thread);
}