diff options
-rw-r--r-- | libart/src/main/java/dalvik/system/VMRuntime.java | 71 | ||||
-rw-r--r-- | mmodules/core_platform_api/api/platform/current-api.txt | 9 |
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); } |