Merge "Initialise hidden api usage logger pre-fork"

This commit is contained in:
Andrei-Valentin Onea 2019-01-29 15:31:14 +00:00 committed by Android (Google) Code Review
commit f5e95eff50
2 changed files with 48 additions and 2 deletions

View File

@ -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;
@ -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;
@ -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);

View File

@ -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