Make BackgroundDexOpt aware of thermal state
This change makes the BackgroundDexOpt service consider the thermal
state of the device before running. If the device is in a moderate thermal
state or worse background dexopt will not run.
Bug: 165935246
Test: Treehugger && atest BackgroundDexOptServiceIntegrationTests
Change-Id: Ie5ccbab7aa6d414241780136407f397d326340bf
diff --git a/tests/BackgroundDexOptServiceIntegrationTests/OWNERS b/tests/BackgroundDexOptServiceIntegrationTests/OWNERS
new file mode 100644
index 0000000..3414a74
--- /dev/null
+++ b/tests/BackgroundDexOptServiceIntegrationTests/OWNERS
@@ -0,0 +1 @@
+include platform/art:/OWNERS
diff --git a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java
index e05816e..90ddb6f 100644
--- a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java
+++ b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
+import android.os.PowerManager;
import android.os.SystemProperties;
import android.os.storage.StorageManager;
import android.util.Log;
@@ -201,11 +202,16 @@
fillUpStorage((long) (getStorageLowBytes() * LOW_STORAGE_MULTIPLIER));
}
- // TODO(aeubanks): figure out how to get scheduled bg-dexopt to run
private static void runBackgroundDexOpt() throws IOException {
+ runBackgroundDexOpt("Success");
+ }
+
+ // TODO(aeubanks): figure out how to get scheduled bg-dexopt to run
+ private static void runBackgroundDexOpt(String expectedStatus) throws IOException {
String result = runShellCommand("cmd package bg-dexopt-job " + PACKAGE_NAME);
- if (!result.trim().equals("Success")) {
- throw new IllegalStateException("Expected command success, received >" + result + "<");
+ if (!result.trim().equals(expectedStatus)) {
+ throw new IllegalStateException("Expected status: " + expectedStatus
+ + "; Received: " + result.trim());
}
}
@@ -242,6 +248,16 @@
runShellCommand(String.format("cmd package compile -f -m %s %s", filter, pkg));
}
+ // Override the thermal status of the device
+ public static void overrideThermalStatus(int status) throws IOException {
+ runShellCommand("cmd thermalservice override-status " + status);
+ }
+
+ // Reset the thermal status of the device
+ public static void resetThermalStatus() throws IOException {
+ runShellCommand("cmd thermalservice reset");
+ }
+
// Test that background dexopt under normal conditions succeeds.
@Test
public void testBackgroundDexOpt() throws IOException {
@@ -307,4 +323,17 @@
}
}
+ // Test that background dexopt job doesn't trigger if the device is under thermal throttling.
+ @Test
+ public void testBackgroundDexOptThermalThrottling() throws IOException {
+ try {
+ compilePackageWithFilter(PACKAGE_NAME, "verify");
+ overrideThermalStatus(PowerManager.THERMAL_STATUS_MODERATE);
+ // The bgdexopt task should fail when onStartJob is run
+ runBackgroundDexOpt("Failure");
+ Assert.assertEquals("verify", getCompilerFilter(PACKAGE_NAME));
+ } finally {
+ resetThermalStatus();
+ }
+ }
}