Loading Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -104,6 +104,7 @@ filegroup { ":android.security.apc-java-source", ":android.security.apc-java-source", ":android.security.authorization-java-source", ":android.security.authorization-java-source", ":android.security.maintenance-java-source", ":android.security.maintenance-java-source", ":android.security.metrics-java-source", ":android.security.vpnprofilestore-java-source", ":android.security.vpnprofilestore-java-source", ":android.system.keystore2-V1-java-source", ":android.system.keystore2-V1-java-source", ":credstore_aidl", ":credstore_aidl", Loading services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +309 −0 Original line number Original line Diff line number Diff line Loading @@ -117,6 +117,7 @@ import android.os.Parcelable; import android.os.Process; import android.os.Process; import android.os.RemoteException; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceManager; import android.os.ServiceSpecificException; import android.os.StatFs; import android.os.StatFs; import android.os.SynchronousResultReceiver; import android.os.SynchronousResultReceiver; import android.os.SystemClock; import android.os.SystemClock; Loading @@ -132,6 +133,18 @@ import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.os.storage.VolumeInfo; import android.provider.DeviceConfig; import android.provider.DeviceConfig; import android.provider.Settings; import android.provider.Settings; import android.security.metrics.IKeystoreMetrics; import android.security.metrics.KeyCreationWithAuthInfo; import android.security.metrics.KeyCreationWithGeneralInfo; import android.security.metrics.KeyCreationWithPurposeAndModesInfo; import android.security.metrics.KeyOperationWithGeneralInfo; import android.security.metrics.KeyOperationWithPurposeAndModesInfo; import android.security.metrics.Keystore2AtomWithOverflow; import android.security.metrics.KeystoreAtom; import android.security.metrics.KeystoreAtomPayload; import android.security.metrics.RkpErrorStats; import android.security.metrics.RkpPoolStats; import android.security.metrics.StorageStats; import android.stats.storage.StorageEnums; import android.stats.storage.StorageEnums; import android.telephony.ModemActivityInfo; import android.telephony.ModemActivityInfo; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo; Loading Loading @@ -373,6 +386,10 @@ public class StatsPullAtomService extends SystemService { private SelectedProcessCpuThreadReader mSurfaceFlingerProcessCpuThreadReader; private SelectedProcessCpuThreadReader mSurfaceFlingerProcessCpuThreadReader; // Only access via getIKeystoreMetricsService @GuardedBy("mKeystoreLock") private IKeystoreMetrics mIKeystoreMetrics; // Puller locks // Puller locks private final Object mDataBytesTransferLock = new Object(); private final Object mDataBytesTransferLock = new Object(); private final Object mBluetoothBytesTransferLock = new Object(); private final Object mBluetoothBytesTransferLock = new Object(); Loading Loading @@ -428,6 +445,7 @@ public class StatsPullAtomService extends SystemService { private final Object mAttributedAppOpsLock = new Object(); private final Object mAttributedAppOpsLock = new Object(); private final Object mSettingsStatsLock = new Object(); private final Object mSettingsStatsLock = new Object(); private final Object mInstalledIncrementalPackagesLock = new Object(); private final Object mInstalledIncrementalPackagesLock = new Object(); private final Object mKeystoreLock = new Object(); public StatsPullAtomService(Context context) { public StatsPullAtomService(Context context) { super(context); super(context); Loading @@ -435,6 +453,7 @@ public class StatsPullAtomService extends SystemService { } } private native void initializeNativePullers(); private native void initializeNativePullers(); /** /** * Use of this StatsPullAtomCallbackImpl means we avoid one class per tagId, which we would * Use of this StatsPullAtomCallbackImpl means we avoid one class per tagId, which we would * get if we used lambdas. * get if we used lambdas. Loading Loading @@ -703,6 +722,16 @@ public class StatsPullAtomService extends SystemService { synchronized (mInstalledIncrementalPackagesLock) { synchronized (mInstalledIncrementalPackagesLock) { return pullInstalledIncrementalPackagesLocked(atomTag, data); return pullInstalledIncrementalPackagesLocked(atomTag, data); } } case FrameworkStatsLog.KEYSTORE2_STORAGE_STATS: case FrameworkStatsLog.RKP_POOL_STATS: case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO: case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO: case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO: case FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW: case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO: case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO: case FrameworkStatsLog.RKP_ERROR_STATS: return pullKeystoreAtoms(atomTag, data); default: default: throw new UnsupportedOperationException("Unknown tagId=" + atomTag); throw new UnsupportedOperationException("Unknown tagId=" + atomTag); } } Loading Loading @@ -795,6 +824,8 @@ public class StatsPullAtomService extends SystemService { mSurfaceFlingerProcessCpuThreadReader = mSurfaceFlingerProcessCpuThreadReader = new SelectedProcessCpuThreadReader("/system/bin/surfaceflinger"); new SelectedProcessCpuThreadReader("/system/bin/surfaceflinger"); getIKeystoreMetricsService(); } } void registerEventListeners() { void registerEventListeners() { Loading Loading @@ -887,6 +918,15 @@ public class StatsPullAtomService extends SystemService { registerBatteryCycleCount(); registerBatteryCycleCount(); registerSettingsStats(); registerSettingsStats(); registerInstalledIncrementalPackages(); registerInstalledIncrementalPackages(); registerKeystoreStorageStats(); registerRkpPoolStats(); registerKeystoreKeyCreationWithGeneralInfo(); registerKeystoreKeyCreationWithAuthInfo(); registerKeystoreKeyCreationWithPurposeModesInfo(); registerKeystoreAtomWithOverflow(); registerKeystoreKeyOperationWithPurposeAndModesInfo(); registerKeystoreKeyOperationWithGeneralInfo(); registerRkpErrorStats(); } } private void initAndRegisterNetworkStatsPullers() { private void initAndRegisterNetworkStatsPullers() { Loading Loading @@ -971,6 +1011,28 @@ public class StatsPullAtomService extends SystemService { } } } } private IKeystoreMetrics getIKeystoreMetricsService() { synchronized (mKeystoreLock) { if (mIKeystoreMetrics == null) { mIKeystoreMetrics = IKeystoreMetrics.Stub.asInterface( ServiceManager.getService("android.security.metrics")); if (mIKeystoreMetrics != null) { try { mIKeystoreMetrics.asBinder().linkToDeath(() -> { synchronized (mKeystoreLock) { mIKeystoreMetrics = null; } }, /* flags */ 0); } catch (RemoteException e) { Slog.e(TAG, "linkToDeath with IKeystoreMetrics failed", e); mIKeystoreMetrics = null; } } } return mIKeystoreMetrics; } } private IStoraged getIStoragedService() { private IStoraged getIStoragedService() { synchronized (mStoragedLock) { synchronized (mStoragedLock) { if (mStorageService == null) { if (mStorageService == null) { Loading Loading @@ -4005,6 +4067,253 @@ public class StatsPullAtomService extends SystemService { return StatsManager.PULL_SUCCESS; return StatsManager.PULL_SUCCESS; } } private void registerKeystoreStorageStats() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_STORAGE_STATS, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerRkpPoolStats() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.RKP_POOL_STATS, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerKeystoreKeyCreationWithGeneralInfo() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerKeystoreKeyCreationWithAuthInfo() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerKeystoreKeyCreationWithPurposeModesInfo() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerKeystoreAtomWithOverflow() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerKeystoreKeyOperationWithPurposeAndModesInfo() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerKeystoreKeyOperationWithGeneralInfo() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerRkpErrorStats() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.RKP_ERROR_STATS, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } int parseKeystoreStorageStats(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.storageStats) { return StatsManager.PULL_SKIP; } StorageStats atom = atomWrapper.payload.getStorageStats(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_STORAGE_STATS, atom.storage_type, atom.size, atom.unused_size)); } return StatsManager.PULL_SUCCESS; } int parseRkpPoolStats(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.rkpPoolStats) { return StatsManager.PULL_SKIP; } RkpPoolStats atom = atomWrapper.payload.getRkpPoolStats(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.RKP_POOL_STATS, atom.pool_status, atom.count_of_keys)); } return StatsManager.PULL_SUCCESS; } int parseKeystoreKeyCreationWithGeneralInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keyCreationWithGeneralInfo) { return StatsManager.PULL_SKIP; } KeyCreationWithGeneralInfo atom = atomWrapper.payload.getKeyCreationWithGeneralInfo(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO, atom.algorithm, atom.key_size, atom.ec_curve, atom.key_origin, atom.error_code, atom.attestation_requested, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int parseKeystoreKeyCreationWithAuthInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keyCreationWithAuthInfo) { return StatsManager.PULL_SKIP; } KeyCreationWithAuthInfo atom = atomWrapper.payload.getKeyCreationWithAuthInfo(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO, atom.user_auth_type, atom.log10_auth_key_timeout_seconds, atom.security_level, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int parseKeystoreKeyCreationWithPurposeModesInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keyCreationWithPurposeAndModesInfo) { return StatsManager.PULL_SKIP; } KeyCreationWithPurposeAndModesInfo atom = atomWrapper.payload.getKeyCreationWithPurposeAndModesInfo(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO, atom.algorithm, atom.purpose_bitmap, atom.padding_mode_bitmap, atom.digest_bitmap, atom.block_mode_bitmap, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int parseKeystoreAtomWithOverflow(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keystore2AtomWithOverflow) { return StatsManager.PULL_SKIP; } Keystore2AtomWithOverflow atom = atomWrapper.payload.getKeystore2AtomWithOverflow(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW, atom.atom_id, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int parseKeystoreKeyOperationWithPurposeModesInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keyOperationWithPurposeAndModesInfo) { return StatsManager.PULL_SKIP; } KeyOperationWithPurposeAndModesInfo atom = atomWrapper.payload.getKeyOperationWithPurposeAndModesInfo(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO, atom.purpose, atom.padding_mode_bitmap, atom.digest_bitmap, atom.block_mode_bitmap, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int parseKeystoreKeyOperationWithGeneralInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keyOperationWithGeneralInfo) { return StatsManager.PULL_SKIP; } KeyOperationWithGeneralInfo atom = atomWrapper.payload.getKeyOperationWithGeneralInfo(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO, atom.outcome, atom.error_code, atom.key_upgraded, atom.security_level, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int parseRkpErrorStats(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.rkpErrorStats) { return StatsManager.PULL_SKIP; } RkpErrorStats atom = atomWrapper.payload.getRkpErrorStats(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.RKP_ERROR_STATS, atom.rkpError, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int pullKeystoreAtoms(int atomTag, List<StatsEvent> pulledData) { IKeystoreMetrics keystoreMetricsService = getIKeystoreMetricsService(); if (keystoreMetricsService == null) { Slog.w(TAG, "Keystore service is null"); return StatsManager.PULL_SKIP; } final long callingToken = Binder.clearCallingIdentity(); try { KeystoreAtom[] atoms = keystoreMetricsService.pullMetrics(atomTag); switch (atomTag) { case FrameworkStatsLog.KEYSTORE2_STORAGE_STATS: return parseKeystoreStorageStats(atoms, pulledData); case FrameworkStatsLog.RKP_POOL_STATS: return parseRkpPoolStats(atoms, pulledData); case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO: return parseKeystoreKeyCreationWithGeneralInfo(atoms, pulledData); case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO: return parseKeystoreKeyCreationWithAuthInfo(atoms, pulledData); case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO: return parseKeystoreKeyCreationWithPurposeModesInfo(atoms, pulledData); case FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW: return parseKeystoreAtomWithOverflow(atoms, pulledData); case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO: return parseKeystoreKeyOperationWithPurposeModesInfo(atoms, pulledData); case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO: return parseKeystoreKeyOperationWithGeneralInfo(atoms, pulledData); case FrameworkStatsLog.RKP_ERROR_STATS: return parseRkpErrorStats(atoms, pulledData); default: Slog.w(TAG, "Unsupported keystore atom: " + atomTag); return StatsManager.PULL_SKIP; } } catch (RemoteException e) { // Should not happen. Slog.e(TAG, "Disconnected from keystore service. Cannot pull.", e); return StatsManager.PULL_SKIP; } catch (ServiceSpecificException e) { Slog.e(TAG, "pulling keystore metrics failed", e); return StatsManager.PULL_SKIP; } finally { Binder.restoreCallingIdentity(callingToken); } } // Thermal event received from vendor thermal management subsystem // Thermal event received from vendor thermal management subsystem private static final class ThermalEventListener extends IThermalEventListener.Stub { private static final class ThermalEventListener extends IThermalEventListener.Stub { @Override @Override Loading Loading
Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -104,6 +104,7 @@ filegroup { ":android.security.apc-java-source", ":android.security.apc-java-source", ":android.security.authorization-java-source", ":android.security.authorization-java-source", ":android.security.maintenance-java-source", ":android.security.maintenance-java-source", ":android.security.metrics-java-source", ":android.security.vpnprofilestore-java-source", ":android.security.vpnprofilestore-java-source", ":android.system.keystore2-V1-java-source", ":android.system.keystore2-V1-java-source", ":credstore_aidl", ":credstore_aidl", Loading
services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +309 −0 Original line number Original line Diff line number Diff line Loading @@ -117,6 +117,7 @@ import android.os.Parcelable; import android.os.Process; import android.os.Process; import android.os.RemoteException; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceManager; import android.os.ServiceSpecificException; import android.os.StatFs; import android.os.StatFs; import android.os.SynchronousResultReceiver; import android.os.SynchronousResultReceiver; import android.os.SystemClock; import android.os.SystemClock; Loading @@ -132,6 +133,18 @@ import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.os.storage.VolumeInfo; import android.provider.DeviceConfig; import android.provider.DeviceConfig; import android.provider.Settings; import android.provider.Settings; import android.security.metrics.IKeystoreMetrics; import android.security.metrics.KeyCreationWithAuthInfo; import android.security.metrics.KeyCreationWithGeneralInfo; import android.security.metrics.KeyCreationWithPurposeAndModesInfo; import android.security.metrics.KeyOperationWithGeneralInfo; import android.security.metrics.KeyOperationWithPurposeAndModesInfo; import android.security.metrics.Keystore2AtomWithOverflow; import android.security.metrics.KeystoreAtom; import android.security.metrics.KeystoreAtomPayload; import android.security.metrics.RkpErrorStats; import android.security.metrics.RkpPoolStats; import android.security.metrics.StorageStats; import android.stats.storage.StorageEnums; import android.stats.storage.StorageEnums; import android.telephony.ModemActivityInfo; import android.telephony.ModemActivityInfo; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo; Loading Loading @@ -373,6 +386,10 @@ public class StatsPullAtomService extends SystemService { private SelectedProcessCpuThreadReader mSurfaceFlingerProcessCpuThreadReader; private SelectedProcessCpuThreadReader mSurfaceFlingerProcessCpuThreadReader; // Only access via getIKeystoreMetricsService @GuardedBy("mKeystoreLock") private IKeystoreMetrics mIKeystoreMetrics; // Puller locks // Puller locks private final Object mDataBytesTransferLock = new Object(); private final Object mDataBytesTransferLock = new Object(); private final Object mBluetoothBytesTransferLock = new Object(); private final Object mBluetoothBytesTransferLock = new Object(); Loading Loading @@ -428,6 +445,7 @@ public class StatsPullAtomService extends SystemService { private final Object mAttributedAppOpsLock = new Object(); private final Object mAttributedAppOpsLock = new Object(); private final Object mSettingsStatsLock = new Object(); private final Object mSettingsStatsLock = new Object(); private final Object mInstalledIncrementalPackagesLock = new Object(); private final Object mInstalledIncrementalPackagesLock = new Object(); private final Object mKeystoreLock = new Object(); public StatsPullAtomService(Context context) { public StatsPullAtomService(Context context) { super(context); super(context); Loading @@ -435,6 +453,7 @@ public class StatsPullAtomService extends SystemService { } } private native void initializeNativePullers(); private native void initializeNativePullers(); /** /** * Use of this StatsPullAtomCallbackImpl means we avoid one class per tagId, which we would * Use of this StatsPullAtomCallbackImpl means we avoid one class per tagId, which we would * get if we used lambdas. * get if we used lambdas. Loading Loading @@ -703,6 +722,16 @@ public class StatsPullAtomService extends SystemService { synchronized (mInstalledIncrementalPackagesLock) { synchronized (mInstalledIncrementalPackagesLock) { return pullInstalledIncrementalPackagesLocked(atomTag, data); return pullInstalledIncrementalPackagesLocked(atomTag, data); } } case FrameworkStatsLog.KEYSTORE2_STORAGE_STATS: case FrameworkStatsLog.RKP_POOL_STATS: case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO: case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO: case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO: case FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW: case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO: case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO: case FrameworkStatsLog.RKP_ERROR_STATS: return pullKeystoreAtoms(atomTag, data); default: default: throw new UnsupportedOperationException("Unknown tagId=" + atomTag); throw new UnsupportedOperationException("Unknown tagId=" + atomTag); } } Loading Loading @@ -795,6 +824,8 @@ public class StatsPullAtomService extends SystemService { mSurfaceFlingerProcessCpuThreadReader = mSurfaceFlingerProcessCpuThreadReader = new SelectedProcessCpuThreadReader("/system/bin/surfaceflinger"); new SelectedProcessCpuThreadReader("/system/bin/surfaceflinger"); getIKeystoreMetricsService(); } } void registerEventListeners() { void registerEventListeners() { Loading Loading @@ -887,6 +918,15 @@ public class StatsPullAtomService extends SystemService { registerBatteryCycleCount(); registerBatteryCycleCount(); registerSettingsStats(); registerSettingsStats(); registerInstalledIncrementalPackages(); registerInstalledIncrementalPackages(); registerKeystoreStorageStats(); registerRkpPoolStats(); registerKeystoreKeyCreationWithGeneralInfo(); registerKeystoreKeyCreationWithAuthInfo(); registerKeystoreKeyCreationWithPurposeModesInfo(); registerKeystoreAtomWithOverflow(); registerKeystoreKeyOperationWithPurposeAndModesInfo(); registerKeystoreKeyOperationWithGeneralInfo(); registerRkpErrorStats(); } } private void initAndRegisterNetworkStatsPullers() { private void initAndRegisterNetworkStatsPullers() { Loading Loading @@ -971,6 +1011,28 @@ public class StatsPullAtomService extends SystemService { } } } } private IKeystoreMetrics getIKeystoreMetricsService() { synchronized (mKeystoreLock) { if (mIKeystoreMetrics == null) { mIKeystoreMetrics = IKeystoreMetrics.Stub.asInterface( ServiceManager.getService("android.security.metrics")); if (mIKeystoreMetrics != null) { try { mIKeystoreMetrics.asBinder().linkToDeath(() -> { synchronized (mKeystoreLock) { mIKeystoreMetrics = null; } }, /* flags */ 0); } catch (RemoteException e) { Slog.e(TAG, "linkToDeath with IKeystoreMetrics failed", e); mIKeystoreMetrics = null; } } } return mIKeystoreMetrics; } } private IStoraged getIStoragedService() { private IStoraged getIStoragedService() { synchronized (mStoragedLock) { synchronized (mStoragedLock) { if (mStorageService == null) { if (mStorageService == null) { Loading Loading @@ -4005,6 +4067,253 @@ public class StatsPullAtomService extends SystemService { return StatsManager.PULL_SUCCESS; return StatsManager.PULL_SUCCESS; } } private void registerKeystoreStorageStats() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_STORAGE_STATS, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerRkpPoolStats() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.RKP_POOL_STATS, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerKeystoreKeyCreationWithGeneralInfo() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerKeystoreKeyCreationWithAuthInfo() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerKeystoreKeyCreationWithPurposeModesInfo() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerKeystoreAtomWithOverflow() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerKeystoreKeyOperationWithPurposeAndModesInfo() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerKeystoreKeyOperationWithGeneralInfo() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } private void registerRkpErrorStats() { mStatsManager.setPullAtomCallback( FrameworkStatsLog.RKP_ERROR_STATS, null, // use default PullAtomMetadata values, DIRECT_EXECUTOR, mStatsCallbackImpl); } int parseKeystoreStorageStats(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.storageStats) { return StatsManager.PULL_SKIP; } StorageStats atom = atomWrapper.payload.getStorageStats(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_STORAGE_STATS, atom.storage_type, atom.size, atom.unused_size)); } return StatsManager.PULL_SUCCESS; } int parseRkpPoolStats(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.rkpPoolStats) { return StatsManager.PULL_SKIP; } RkpPoolStats atom = atomWrapper.payload.getRkpPoolStats(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.RKP_POOL_STATS, atom.pool_status, atom.count_of_keys)); } return StatsManager.PULL_SUCCESS; } int parseKeystoreKeyCreationWithGeneralInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keyCreationWithGeneralInfo) { return StatsManager.PULL_SKIP; } KeyCreationWithGeneralInfo atom = atomWrapper.payload.getKeyCreationWithGeneralInfo(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO, atom.algorithm, atom.key_size, atom.ec_curve, atom.key_origin, atom.error_code, atom.attestation_requested, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int parseKeystoreKeyCreationWithAuthInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keyCreationWithAuthInfo) { return StatsManager.PULL_SKIP; } KeyCreationWithAuthInfo atom = atomWrapper.payload.getKeyCreationWithAuthInfo(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO, atom.user_auth_type, atom.log10_auth_key_timeout_seconds, atom.security_level, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int parseKeystoreKeyCreationWithPurposeModesInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keyCreationWithPurposeAndModesInfo) { return StatsManager.PULL_SKIP; } KeyCreationWithPurposeAndModesInfo atom = atomWrapper.payload.getKeyCreationWithPurposeAndModesInfo(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO, atom.algorithm, atom.purpose_bitmap, atom.padding_mode_bitmap, atom.digest_bitmap, atom.block_mode_bitmap, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int parseKeystoreAtomWithOverflow(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keystore2AtomWithOverflow) { return StatsManager.PULL_SKIP; } Keystore2AtomWithOverflow atom = atomWrapper.payload.getKeystore2AtomWithOverflow(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW, atom.atom_id, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int parseKeystoreKeyOperationWithPurposeModesInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keyOperationWithPurposeAndModesInfo) { return StatsManager.PULL_SKIP; } KeyOperationWithPurposeAndModesInfo atom = atomWrapper.payload.getKeyOperationWithPurposeAndModesInfo(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO, atom.purpose, atom.padding_mode_bitmap, atom.digest_bitmap, atom.block_mode_bitmap, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int parseKeystoreKeyOperationWithGeneralInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keyOperationWithGeneralInfo) { return StatsManager.PULL_SKIP; } KeyOperationWithGeneralInfo atom = atomWrapper.payload.getKeyOperationWithGeneralInfo(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO, atom.outcome, atom.error_code, atom.key_upgraded, atom.security_level, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int parseRkpErrorStats(KeystoreAtom[] atoms, List<StatsEvent> pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.rkpErrorStats) { return StatsManager.PULL_SKIP; } RkpErrorStats atom = atomWrapper.payload.getRkpErrorStats(); pulledData.add(FrameworkStatsLog.buildStatsEvent( FrameworkStatsLog.RKP_ERROR_STATS, atom.rkpError, atomWrapper.count)); } return StatsManager.PULL_SUCCESS; } int pullKeystoreAtoms(int atomTag, List<StatsEvent> pulledData) { IKeystoreMetrics keystoreMetricsService = getIKeystoreMetricsService(); if (keystoreMetricsService == null) { Slog.w(TAG, "Keystore service is null"); return StatsManager.PULL_SKIP; } final long callingToken = Binder.clearCallingIdentity(); try { KeystoreAtom[] atoms = keystoreMetricsService.pullMetrics(atomTag); switch (atomTag) { case FrameworkStatsLog.KEYSTORE2_STORAGE_STATS: return parseKeystoreStorageStats(atoms, pulledData); case FrameworkStatsLog.RKP_POOL_STATS: return parseRkpPoolStats(atoms, pulledData); case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO: return parseKeystoreKeyCreationWithGeneralInfo(atoms, pulledData); case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO: return parseKeystoreKeyCreationWithAuthInfo(atoms, pulledData); case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO: return parseKeystoreKeyCreationWithPurposeModesInfo(atoms, pulledData); case FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW: return parseKeystoreAtomWithOverflow(atoms, pulledData); case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO: return parseKeystoreKeyOperationWithPurposeModesInfo(atoms, pulledData); case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO: return parseKeystoreKeyOperationWithGeneralInfo(atoms, pulledData); case FrameworkStatsLog.RKP_ERROR_STATS: return parseRkpErrorStats(atoms, pulledData); default: Slog.w(TAG, "Unsupported keystore atom: " + atomTag); return StatsManager.PULL_SKIP; } } catch (RemoteException e) { // Should not happen. Slog.e(TAG, "Disconnected from keystore service. Cannot pull.", e); return StatsManager.PULL_SKIP; } catch (ServiceSpecificException e) { Slog.e(TAG, "pulling keystore metrics failed", e); return StatsManager.PULL_SKIP; } finally { Binder.restoreCallingIdentity(callingToken); } } // Thermal event received from vendor thermal management subsystem // Thermal event received from vendor thermal management subsystem private static final class ThermalEventListener extends IThermalEventListener.Stub { private static final class ThermalEventListener extends IThermalEventListener.Stub { @Override @Override Loading