Loading core/java/com/android/internal/os/ZygoteConnection.java +40 −2 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import static com.android.internal.os.ZygoteConnectionConstants.CONNECTION_TIMEO import static com.android.internal.os.ZygoteConnectionConstants.WRAPPED_PID_TIMEOUT_MILLIS; import android.content.pm.ApplicationInfo; import android.metrics.LogMaker; import android.net.Credentials; import android.net.LocalSocket; import android.os.Parcel; Loading @@ -37,6 +38,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; Loading Loading @@ -330,9 +334,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); Loading core/java/com/android/internal/os/ZygoteInit.java +8 −0 Original line number Diff line number Diff line Loading @@ -532,6 +532,14 @@ public class ZygoteInit { VMRuntime.getRuntime().setHiddenApiAccessLogSamplingRate(percent); } /** * 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 Loading Loading
core/java/com/android/internal/os/ZygoteConnection.java +40 −2 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import static com.android.internal.os.ZygoteConnectionConstants.CONNECTION_TIMEO import static com.android.internal.os.ZygoteConnectionConstants.WRAPPED_PID_TIMEOUT_MILLIS; import android.content.pm.ApplicationInfo; import android.metrics.LogMaker; import android.net.Credentials; import android.net.LocalSocket; import android.os.Parcel; Loading @@ -37,6 +38,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; Loading Loading @@ -330,9 +334,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); Loading
core/java/com/android/internal/os/ZygoteInit.java +8 −0 Original line number Diff line number Diff line Loading @@ -532,6 +532,14 @@ public class ZygoteInit { VMRuntime.getRuntime().setHiddenApiAccessLogSamplingRate(percent); } /** * 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 Loading