Merge "Add atom logging for intervention framework"

This commit is contained in:
Xiang Wang
2022-12-01 18:36:13 +00:00
committed by Android (Google) Code Review

View File

@@ -40,6 +40,7 @@ import android.app.GameModeInfo;
import android.app.GameState;
import android.app.IGameManagerService;
import android.app.IGameModeListener;
import android.app.StatsManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -76,6 +77,7 @@ import android.util.AtomicFile;
import android.util.AttributeSet;
import android.util.KeyValueListParser;
import android.util.Slog;
import android.util.StatsEvent;
import android.util.Xml;
import com.android.internal.annotations.GuardedBy;
@@ -104,6 +106,7 @@ import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Service to manage game related features.
@@ -932,6 +935,7 @@ public final class GameManagerService extends IGameManagerService.Stub {
public void onBootPhase(int phase) {
if (phase == PHASE_BOOT_COMPLETED) {
mService.onBootCompleted();
mService.registerStatsCallbacks();
}
}
@@ -1150,6 +1154,15 @@ public final class GameManagerService extends IGameManagerService.Stub {
sendUserMessage(userId, WRITE_SETTINGS, "SET_GAME_MODE", WRITE_DELAY_MILLIS);
sendUserMessage(userId, WRITE_GAME_MODE_INTERVENTION_LIST_FILE,
"SET_GAME_MODE", 0 /*delayMillis*/);
int gameUid = -1;
try {
gameUid = mPackageManager.getPackageUidAsUser(packageName, userId);
} catch (NameNotFoundException ex) {
Slog.d(TAG, "Cannot find the UID for package " + packageName + " under user " + userId);
}
FrameworkStatsLog.write(FrameworkStatsLog.GAME_MODE_CHANGED, gameUid,
Binder.getCallingUid(), gameModeToStatsdGameMode(fromGameMode),
gameModeToStatsdGameMode(gameMode));
}
/**
@@ -1364,11 +1377,21 @@ public final class GameManagerService extends IGameManagerService.Stub {
}
GamePackageConfiguration.GameModeConfiguration internalConfig =
configOverride.getOrAddDefaultGameModeConfiguration(GameManager.GAME_MODE_CUSTOM);
int gameUid = -1;
try {
gameUid = mPackageManager.getPackageUidAsUser(packageName, userId);
} catch (NameNotFoundException ex) {
Slog.d(TAG, "Cannot find the UID for package " + packageName + " under user " + userId);
}
FrameworkStatsLog.write(FrameworkStatsLog.GAME_MODE_CONFIGURATION_CHANGED, gameUid,
Binder.getCallingUid(), gameModeToStatsdGameMode(GameManager.GAME_MODE_CUSTOM),
internalConfig.getScaling(), gameModeConfig.getScalingFactor(),
internalConfig.getFps(), gameModeConfig.getFpsOverride());
internalConfig.updateFromPublicGameModeConfig(gameModeConfig);
Slog.i(TAG, "Updated custom game mode config for package: " + packageName
+ " with FPS=" + internalConfig.getFps() + ";Scaling="
+ internalConfig.getScaling());
+ internalConfig.getScaling() + " under user " + userId);
}
/**
@@ -1629,11 +1652,6 @@ public final class GameManagerService extends IGameManagerService.Stub {
public void resetGameModeConfigOverride(String packageName, @UserIdInt int userId,
@GameMode int gameModeToReset) throws SecurityException {
checkPermission(Manifest.permission.MANAGE_GAME_MODE);
final GamePackageConfiguration deviceConfig;
synchronized (mDeviceConfigLock) {
deviceConfig = mConfigs.get(packageName);
}
// resets GamePackageConfiguration of a given packageName.
// If a gameMode is specified, only reset the GameModeConfiguration of the gameMode.
synchronized (mLock) {
@@ -1949,13 +1967,99 @@ public final class GameManagerService extends IGameManagerService.Stub {
LocalServices.addService(GameManagerInternal.class, new LocalService());
}
private String dumpDeviceConfigs() {
StringBuilder out = new StringBuilder();
for (String key : mConfigs.keySet()) {
out.append("[\nName: ").append(key)
.append("\nConfig: ").append(mConfigs.get(key).toString()).append("\n]");
private void registerStatsCallbacks() {
final StatsManager statsManager = mContext.getSystemService(StatsManager.class);
statsManager.setPullAtomCallback(
FrameworkStatsLog.GAME_MODE_INFO,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
this::onPullAtom);
statsManager.setPullAtomCallback(
FrameworkStatsLog.GAME_MODE_CONFIGURATION,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
this::onPullAtom);
statsManager.setPullAtomCallback(
FrameworkStatsLog.GAME_MODE_LISTENER,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
this::onPullAtom);
}
private int onPullAtom(int atomTag, @NonNull List<StatsEvent> data) {
if (atomTag == FrameworkStatsLog.GAME_MODE_INFO
|| atomTag == FrameworkStatsLog.GAME_MODE_CONFIGURATION) {
int userId = ActivityManager.getCurrentUser();
Set<String> packages;
synchronized (mDeviceConfigLock) {
packages = mConfigs.keySet();
}
for (String p : packages) {
GamePackageConfiguration config = getConfig(p, userId);
if (config == null) {
continue;
}
int uid = -1;
try {
uid = mPackageManager.getPackageUidAsUser(p, userId);
} catch (NameNotFoundException ex) {
Slog.d(TAG,
"Cannot find UID for package " + p + " under user handle id " + userId);
}
if (atomTag == FrameworkStatsLog.GAME_MODE_INFO) {
data.add(
FrameworkStatsLog.buildStatsEvent(FrameworkStatsLog.GAME_MODE_INFO, uid,
gameModesToStatsdGameModes(config.getOptedInGameModes()),
gameModesToStatsdGameModes(config.getAvailableGameModes())));
} else if (atomTag == FrameworkStatsLog.GAME_MODE_CONFIGURATION) {
for (int gameMode : config.getAvailableGameModes()) {
GamePackageConfiguration.GameModeConfiguration modeConfig =
config.getGameModeConfiguration(gameMode);
if (modeConfig != null) {
data.add(FrameworkStatsLog.buildStatsEvent(
FrameworkStatsLog.GAME_MODE_CONFIGURATION, uid,
gameModeToStatsdGameMode(gameMode), modeConfig.getFps(),
modeConfig.getScaling()));
}
}
}
}
} else if (atomTag == FrameworkStatsLog.GAME_MODE_LISTENER) {
synchronized (mGameModeListenerLock) {
data.add(FrameworkStatsLog.buildStatsEvent(FrameworkStatsLog.GAME_MODE_LISTENER,
mGameModeListeners.size()));
}
}
return android.app.StatsManager.PULL_SUCCESS;
}
private static int[] gameModesToStatsdGameModes(int[] modes) {
if (modes == null) {
return null;
}
int[] statsdModes = new int[modes.length];
int i = 0;
for (int mode : modes) {
statsdModes[i++] = gameModeToStatsdGameMode(mode);
}
return statsdModes;
}
private static int gameModeToStatsdGameMode(int mode) {
switch (mode) {
case GameManager.GAME_MODE_BATTERY:
return FrameworkStatsLog.GAME_MODE_CONFIGURATION__GAME_MODE__GAME_MODE_BATTERY;
case GameManager.GAME_MODE_PERFORMANCE:
return FrameworkStatsLog.GAME_MODE_CONFIGURATION__GAME_MODE__GAME_MODE_PERFORMANCE;
case GameManager.GAME_MODE_CUSTOM:
return FrameworkStatsLog.GAME_MODE_CONFIGURATION__GAME_MODE__GAME_MODE_CUSTOM;
case GameManager.GAME_MODE_STANDARD:
return FrameworkStatsLog.GAME_MODE_CONFIGURATION__GAME_MODE__GAME_MODE_STANDARD;
case GameManager.GAME_MODE_UNSUPPORTED:
return FrameworkStatsLog.GAME_MODE_CONFIGURATION__GAME_MODE__GAME_MODE_UNSUPPORTED;
default:
return FrameworkStatsLog.GAME_MODE_CONFIGURATION__GAME_MODE__GAME_MODE_UNSPECIFIED;
}
return out.toString();
}
private static int gameStateModeToStatsdGameState(int mode) {