summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Xiang Wang <xwxw@google.com> 2025-01-13 15:41:33 -0800
committer Xiang Wang <xwxw@google.com> 2025-02-07 15:27:56 -0800
commitcb1eb9b9e99e0f2f79982d854d6ad2bc54137d3b (patch)
tree504e340a058e2a8647183e742e8c20b67fecc208
parentab9c80e6b30fa39dea5780f74aa717d05c97862e (diff)
Fix the DiskReadViolation in GameManagerSettings
* Run the settings read in GameManagerService's handler as the thread calling from AM doesn't have IO permission. * Replace the close with try-with-resources for stability, or we should close in the finally block instead. * Fix the lazy init loading for the test. Bug: 322221105 Flag: EXEMPT bugfix Test: atest GameManagerServiceTests GameManagerServiceSettingsTests Change-Id: Ic6227a607c71353e5f1c4c28ebe2a24c4c752935
-rw-r--r--services/core/java/com/android/server/app/GameManagerService.java26
-rw-r--r--services/core/java/com/android/server/app/GameManagerSettings.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java4
3 files changed, 23 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java
index c0a97db7275b..767201125e09 100644
--- a/services/core/java/com/android/server/app/GameManagerService.java
+++ b/services/core/java/com/android/server/app/GameManagerService.java
@@ -361,6 +361,14 @@ public final class GameManagerService extends IGameManagerService.Stub {
case POPULATE_GAME_MODE_SETTINGS: {
removeEqualMessages(POPULATE_GAME_MODE_SETTINGS, msg.obj);
final int userId = (int) msg.obj;
+ synchronized (mLock) {
+ if (!mSettings.containsKey(userId)) {
+ GameManagerSettings userSettings = new GameManagerSettings(
+ Environment.getDataSystemDeDirectory(userId));
+ mSettings.put(userId, userSettings);
+ userSettings.readPersistentDataLocked();
+ }
+ }
final String[] packageNames = getInstalledGamePackageNames(userId);
updateConfigsForUser(userId, false /*checkGamePackage*/, packageNames);
break;
@@ -990,8 +998,7 @@ public final class GameManagerService extends IGameManagerService.Stub {
@Override
public void onUserStarting(@NonNull TargetUser user) {
Slog.d(TAG, "Starting user " + user.getUserIdentifier());
- mService.onUserStarting(user,
- Environment.getDataSystemDeDirectory(user.getUserIdentifier()));
+ mService.onUserStarting(user, /*settingDataDirOverride*/ null);
}
@Override
@@ -1596,13 +1603,16 @@ public final class GameManagerService extends IGameManagerService.Stub {
}
}
- void onUserStarting(@NonNull TargetUser user, File settingDataDir) {
+ void onUserStarting(@NonNull TargetUser user, File settingDataDirOverride) {
final int userId = user.getUserIdentifier();
- synchronized (mLock) {
- if (!mSettings.containsKey(userId)) {
- GameManagerSettings userSettings = new GameManagerSettings(settingDataDir);
- mSettings.put(userId, userSettings);
- userSettings.readPersistentDataLocked();
+ if (settingDataDirOverride != null) {
+ synchronized (mLock) {
+ if (!mSettings.containsKey(userId)) {
+ GameManagerSettings userSettings = new GameManagerSettings(
+ settingDataDirOverride);
+ mSettings.put(userId, userSettings);
+ userSettings.readPersistentDataLocked();
+ }
}
}
sendUserMessage(userId, POPULATE_GAME_MODE_SETTINGS, EVENT_ON_USER_STARTING,
diff --git a/services/core/java/com/android/server/app/GameManagerSettings.java b/services/core/java/com/android/server/app/GameManagerSettings.java
index c57a1f73d7d7..fd4bf2f3ef65 100644
--- a/services/core/java/com/android/server/app/GameManagerSettings.java
+++ b/services/core/java/com/android/server/app/GameManagerSettings.java
@@ -221,9 +221,7 @@ public class GameManagerSettings {
return false;
}
- try {
- final FileInputStream str = mSettingsFile.openRead();
-
+ try (FileInputStream str = mSettingsFile.openRead()) {
final TypedXmlPullParser parser = Xml.resolvePullParser(str);
int type;
while ((type = parser.next()) != XmlPullParser.START_TAG
@@ -251,7 +249,6 @@ public class GameManagerSettings {
+ type);
}
}
- str.close();
} catch (XmlPullParserException | java.io.IOException e) {
Slog.wtf(TAG, "Error reading game manager settings", e);
return false;
diff --git a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java
index 17f5ebb3b02a..7349c5f463a6 100644
--- a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java
@@ -116,6 +116,10 @@ public class GameManagerServiceSettingsTests {
deleteFolder(InstrumentationRegistry.getTargetContext().getFilesDir());
}
+ static {
+ System.loadLibrary("servicestestjni");
+ }
+
@Test
public void testReadGameServiceSettings() {
writeOldFiles();