diff options
author | Andrei-Valentin Onea <andreionea@google.com> | 2019-01-30 16:42:54 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2019-01-30 16:42:54 +0000 |
commit | 763747b7ceabf3a98ed6d08ba0a101157e89d9ab (patch) | |
tree | ca58ffe6619d757bd42b0e294ef73cc8a558cad2 | |
parent | 20bca262f573e968cc1af91a3e24f6b0be4cb21a (diff) | |
parent | 89acbab9c82b30dcf8ef464379f1c8d8a4b2dff7 (diff) |
Merge "Initialise hidden api usage logger pre-fork"
-rw-r--r-- | core/java/com/android/internal/os/ZygoteConnection.java | 42 | ||||
-rw-r--r-- | core/java/com/android/internal/os/ZygoteInit.java | 8 |
2 files changed, 48 insertions, 2 deletions
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java index ab356a6f9a99..2bb075989f35 100644 --- a/core/java/com/android/internal/os/ZygoteConnection.java +++ b/core/java/com/android/internal/os/ZygoteConnection.java @@ -26,6 +26,7 @@ import static android.system.OsConstants.STDOUT_FILENO; import static com.android.internal.os.ZygoteConnectionConstants.CONNECTION_TIMEOUT_MILLIS; import static com.android.internal.os.ZygoteConnectionConstants.WRAPPED_PID_TIMEOUT_MILLIS; +import android.metrics.LogMaker; import android.net.Credentials; import android.net.LocalSocket; import android.os.Process; @@ -35,6 +36,9 @@ import android.system.Os; import android.system.StructPollfd; import android.util.Log; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; + import dalvik.system.VMRuntime; import libcore.io.IoUtils; @@ -311,9 +315,43 @@ class ZygoteConnection { } } - private void handleHiddenApiAccessLogSampleRate(int percent) { + private class HiddenApiUsageLogger implements VMRuntime.HiddenApiUsageLogger { + + private final MetricsLogger mMetricsLogger = new MetricsLogger(); + + public void hiddenApiUsed(String packageName, String signature, + int accessMethod, boolean accessDenied) { + int accessMethodMetric = HiddenApiUsageLogger.ACCESS_METHOD_NONE; + switch(accessMethod) { + case HiddenApiUsageLogger.ACCESS_METHOD_NONE: + accessMethodMetric = MetricsEvent.ACCESS_METHOD_NONE; + break; + case HiddenApiUsageLogger.ACCESS_METHOD_REFLECTION: + accessMethodMetric = MetricsEvent.ACCESS_METHOD_REFLECTION; + break; + case HiddenApiUsageLogger.ACCESS_METHOD_JNI: + accessMethodMetric = MetricsEvent.ACCESS_METHOD_JNI; + break; + case HiddenApiUsageLogger.ACCESS_METHOD_LINKING: + accessMethodMetric = MetricsEvent.ACCESS_METHOD_LINKING; + break; + } + LogMaker logMaker = new LogMaker(MetricsEvent.ACTION_HIDDEN_API_ACCESSED) + .setPackageName(packageName) + .addTaggedData(MetricsEvent.FIELD_HIDDEN_API_SIGNATURE, signature) + .addTaggedData(MetricsEvent.FIELD_HIDDEN_API_ACCESS_METHOD, + accessMethodMetric); + if (accessDenied) { + logMaker.addTaggedData(MetricsEvent.FIELD_HIDDEN_API_ACCESS_DENIED, 1); + } + mMetricsLogger.write(logMaker); + } + } + + private void handleHiddenApiAccessLogSampleRate(int samplingRate) { try { - ZygoteInit.setHiddenApiAccessLogSampleRate(percent); + ZygoteInit.setHiddenApiAccessLogSampleRate(samplingRate); + ZygoteInit.setHiddenApiUsageLogger(new HiddenApiUsageLogger()); mSocketOutStream.writeInt(0); } catch (IOException ioe) { throw new IllegalStateException("Error writing to command socket", ioe); diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index e3e55ed28c6f..9f23797d6ccc 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -533,6 +533,14 @@ public class ZygoteInit { } /** + * Sets the implementation to be used for logging hidden API accesses + * @param logger the implementation of the VMRuntime.HiddenApiUsageLogger interface + */ + public static void setHiddenApiUsageLogger(VMRuntime.HiddenApiUsageLogger logger) { + VMRuntime.getRuntime().setHiddenApiUsageLogger(logger); + } + + /** * Creates a PathClassLoader for the given class path that is associated with a shared * namespace, i.e., this classloader can access platform-private native libraries. The * classloader will use java.library.path as the native library path. |