Loading cmds/statsd/src/StatsService.cpp +59 −1 Original line number Diff line number Diff line Loading @@ -1349,6 +1349,64 @@ Status StatsService::sendBinaryPushStateChangedAtom(const android::String16& tra return Status::ok(); } Status StatsService::sendWatchdogRollbackOccurredAtom(const int32_t rollbackTypeIn, const android::String16& packageNameIn, const int64_t packageVersionCodeIn) { // Note: We skip the usage stats op check here since we do not have a package name. // This is ok since we are overloading the usage_stats permission. // This method only sends data, it does not receive it. pid_t pid = IPCThreadState::self()->getCallingPid(); uid_t uid = IPCThreadState::self()->getCallingUid(); // Root, system, and shell always have access if (uid != AID_ROOT && uid != AID_SYSTEM && uid != AID_SHELL) { // Caller must be granted these permissions if (!checkCallingPermission(String16(kPermissionDump))) { return exception(binder::Status::EX_SECURITY, StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, kPermissionDump)); } if (!checkCallingPermission(String16(kPermissionUsage))) { return exception(binder::Status::EX_SECURITY, StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, kPermissionUsage)); } } android::util::stats_write(android::util::WATCHDOG_ROLLBACK_OCCURRED, rollbackTypeIn, String8(packageNameIn).string(), packageVersionCodeIn); // Fast return to save disk read. if (rollbackTypeIn != android::util::WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_SUCCESS && rollbackTypeIn != android::util::WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_INITIATE) { return Status::ok(); } bool readTrainInfoSuccess = false; InstallTrainInfo trainInfoOnDisk; readTrainInfoSuccess = StorageManager::readTrainInfo(trainInfoOnDisk); if (!readTrainInfoSuccess) { return Status::ok(); } std::vector<int64_t> experimentIds = trainInfoOnDisk.experimentIds; if (experimentIds.empty()) { return Status::ok(); } switch (rollbackTypeIn) { case android::util::WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_INITIATE: experimentIds.push_back(experimentIds[0] + 4); break; case android::util::WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_SUCCESS: experimentIds.push_back(experimentIds[0] + 5); break; } StorageManager::writeTrainInfo(trainInfoOnDisk.trainVersionCode, trainInfoOnDisk.trainName, trainInfoOnDisk.status, experimentIds); return Status::ok(); } Status StatsService::getRegisteredExperimentIds(std::vector<int64_t>* experimentIdsOut) { uid_t uid = IPCThreadState::self()->getCallingUid(); Loading cmds/statsd/src/StatsService.h +8 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,14 @@ public: const int32_t state, const std::vector<int64_t>& experimentIdsIn) override; /** * Binder call to log WatchdogRollbackOccurred atom. */ virtual Status sendWatchdogRollbackOccurredAtom( const int32_t rollbackTypeIn, const android::String16& packageNameIn, const int64_t packageVersionCodeIn) override; /** * Binder call to get registered experiment IDs. */ Loading core/java/android/os/IStatsManager.aidl +6 −0 Original line number Diff line number Diff line Loading @@ -218,6 +218,12 @@ interface IStatsManager { oneway void sendBinaryPushStateChangedAtom(in String trainName, in long trainVersionCode, in int options, in int state, in long[] experimentId); /** * Logs an event for watchdog rollbacks. */ oneway void sendWatchdogRollbackOccurredAtom(in int rollbackType, in String packageName, in long packageVersionCode); /** * Returns the most recently registered experiment IDs. */ Loading core/java/android/util/StatsLog.java +40 −5 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ import android.Manifest; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.app.IActivityManager; import android.content.Context; import android.os.IStatsManager; import android.os.RemoteException; Loading Loading @@ -159,10 +158,6 @@ public final class StatsLog extends StatsLogInternal { } return false; } int userId = IActivityManager.Stub.asInterface( ServiceManager.getService("activity")) .getCurrentUser() .id; service.sendBinaryPushStateChangedAtom( trainName, trainVersionCode, options, state, experimentIds); return true; Loading @@ -178,6 +173,46 @@ public final class StatsLog extends StatsLogInternal { } } /** * Logs an event for watchdog rollbacks. * * @param rollbackType state of the rollback. * @param packageName package name being rolled back. * @param packageVersionCode version of the package being rolled back. * * @return True if the log request was sent to statsd. * * @hide */ @RequiresPermission(allOf = {DUMP, PACKAGE_USAGE_STATS}) public static boolean logWatchdogRollbackOccurred(int rollbackType, String packageName, long packageVersionCode) { synchronized (sLogLock) { try { IStatsManager service = getIStatsManagerLocked(); if (service == null) { if (DEBUG) { Slog.d(TAG, "Failed to find statsd when logging event"); } return false; } service.sendWatchdogRollbackOccurredAtom(rollbackType, packageName, packageVersionCode); return true; } catch (RemoteException e) { sService = null; if (DEBUG) { Slog.d(TAG, "Failed to connect to StatsCompanionService when logging " + "WatchdogRollbackOccurred"); } return false; } } } private static IStatsManager getIStatsManagerLocked() throws RemoteException { if (sService != null) { return sService; Loading services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java +2 −2 Original line number Diff line number Diff line Loading @@ -358,8 +358,8 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve private static void logEvent(@Nullable VersionedPackage moduleMetadataPackage, int type) { Slog.i(TAG, "Watchdog event occurred of type: " + type); if (moduleMetadataPackage != null) { StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED, type, moduleMetadataPackage.getPackageName(), moduleMetadataPackage.getVersionCode()); StatsLog.logWatchdogRollbackOccurred(type, moduleMetadataPackage.getPackageName(), moduleMetadataPackage.getVersionCode()); } } Loading Loading
cmds/statsd/src/StatsService.cpp +59 −1 Original line number Diff line number Diff line Loading @@ -1349,6 +1349,64 @@ Status StatsService::sendBinaryPushStateChangedAtom(const android::String16& tra return Status::ok(); } Status StatsService::sendWatchdogRollbackOccurredAtom(const int32_t rollbackTypeIn, const android::String16& packageNameIn, const int64_t packageVersionCodeIn) { // Note: We skip the usage stats op check here since we do not have a package name. // This is ok since we are overloading the usage_stats permission. // This method only sends data, it does not receive it. pid_t pid = IPCThreadState::self()->getCallingPid(); uid_t uid = IPCThreadState::self()->getCallingUid(); // Root, system, and shell always have access if (uid != AID_ROOT && uid != AID_SYSTEM && uid != AID_SHELL) { // Caller must be granted these permissions if (!checkCallingPermission(String16(kPermissionDump))) { return exception(binder::Status::EX_SECURITY, StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, kPermissionDump)); } if (!checkCallingPermission(String16(kPermissionUsage))) { return exception(binder::Status::EX_SECURITY, StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, kPermissionUsage)); } } android::util::stats_write(android::util::WATCHDOG_ROLLBACK_OCCURRED, rollbackTypeIn, String8(packageNameIn).string(), packageVersionCodeIn); // Fast return to save disk read. if (rollbackTypeIn != android::util::WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_SUCCESS && rollbackTypeIn != android::util::WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_INITIATE) { return Status::ok(); } bool readTrainInfoSuccess = false; InstallTrainInfo trainInfoOnDisk; readTrainInfoSuccess = StorageManager::readTrainInfo(trainInfoOnDisk); if (!readTrainInfoSuccess) { return Status::ok(); } std::vector<int64_t> experimentIds = trainInfoOnDisk.experimentIds; if (experimentIds.empty()) { return Status::ok(); } switch (rollbackTypeIn) { case android::util::WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_INITIATE: experimentIds.push_back(experimentIds[0] + 4); break; case android::util::WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_SUCCESS: experimentIds.push_back(experimentIds[0] + 5); break; } StorageManager::writeTrainInfo(trainInfoOnDisk.trainVersionCode, trainInfoOnDisk.trainName, trainInfoOnDisk.status, experimentIds); return Status::ok(); } Status StatsService::getRegisteredExperimentIds(std::vector<int64_t>* experimentIdsOut) { uid_t uid = IPCThreadState::self()->getCallingUid(); Loading
cmds/statsd/src/StatsService.h +8 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,14 @@ public: const int32_t state, const std::vector<int64_t>& experimentIdsIn) override; /** * Binder call to log WatchdogRollbackOccurred atom. */ virtual Status sendWatchdogRollbackOccurredAtom( const int32_t rollbackTypeIn, const android::String16& packageNameIn, const int64_t packageVersionCodeIn) override; /** * Binder call to get registered experiment IDs. */ Loading
core/java/android/os/IStatsManager.aidl +6 −0 Original line number Diff line number Diff line Loading @@ -218,6 +218,12 @@ interface IStatsManager { oneway void sendBinaryPushStateChangedAtom(in String trainName, in long trainVersionCode, in int options, in int state, in long[] experimentId); /** * Logs an event for watchdog rollbacks. */ oneway void sendWatchdogRollbackOccurredAtom(in int rollbackType, in String packageName, in long packageVersionCode); /** * Returns the most recently registered experiment IDs. */ Loading
core/java/android/util/StatsLog.java +40 −5 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ import android.Manifest; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.app.IActivityManager; import android.content.Context; import android.os.IStatsManager; import android.os.RemoteException; Loading Loading @@ -159,10 +158,6 @@ public final class StatsLog extends StatsLogInternal { } return false; } int userId = IActivityManager.Stub.asInterface( ServiceManager.getService("activity")) .getCurrentUser() .id; service.sendBinaryPushStateChangedAtom( trainName, trainVersionCode, options, state, experimentIds); return true; Loading @@ -178,6 +173,46 @@ public final class StatsLog extends StatsLogInternal { } } /** * Logs an event for watchdog rollbacks. * * @param rollbackType state of the rollback. * @param packageName package name being rolled back. * @param packageVersionCode version of the package being rolled back. * * @return True if the log request was sent to statsd. * * @hide */ @RequiresPermission(allOf = {DUMP, PACKAGE_USAGE_STATS}) public static boolean logWatchdogRollbackOccurred(int rollbackType, String packageName, long packageVersionCode) { synchronized (sLogLock) { try { IStatsManager service = getIStatsManagerLocked(); if (service == null) { if (DEBUG) { Slog.d(TAG, "Failed to find statsd when logging event"); } return false; } service.sendWatchdogRollbackOccurredAtom(rollbackType, packageName, packageVersionCode); return true; } catch (RemoteException e) { sService = null; if (DEBUG) { Slog.d(TAG, "Failed to connect to StatsCompanionService when logging " + "WatchdogRollbackOccurred"); } return false; } } } private static IStatsManager getIStatsManagerLocked() throws RemoteException { if (sService != null) { return sService; Loading
services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java +2 −2 Original line number Diff line number Diff line Loading @@ -358,8 +358,8 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve private static void logEvent(@Nullable VersionedPackage moduleMetadataPackage, int type) { Slog.i(TAG, "Watchdog event occurred of type: " + type); if (moduleMetadataPackage != null) { StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED, type, moduleMetadataPackage.getPackageName(), moduleMetadataPackage.getVersionCode()); StatsLog.logWatchdogRollbackOccurred(type, moduleMetadataPackage.getPackageName(), moduleMetadataPackage.getVersionCode()); } } Loading