summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmds/statsd/src/atoms.proto44
-rw-r--r--services/core/java/com/android/server/pm/BackgroundDexOptService.java59
-rw-r--r--services/core/java/com/android/server/storage/DeviceStorageMonitorService.java9
3 files changed, 108 insertions, 4 deletions
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 0a8746a639fc..7ceef999d6af 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -188,6 +188,9 @@ message Atom {
BluetoothLinkLayerConnectionEvent bluetooth_link_layer_connection_event = 125;
BluetoothAclConnectionStateChanged bluetooth_acl_connection_state_changed = 126;
BluetoothScoConnectionStateChanged bluetooth_sco_connection_state_changed = 127;
+ AppDowngraded app_downgraded = 128;
+ AppOptimizedAfterDowngraded app_optimized_after_downgraded = 129;
+ LowStorageStateChanged low_storage_state_changed = 130;
}
// Pulled events will start at field 10000.
@@ -1787,6 +1790,47 @@ message ActivityForegroundStateChanged {
}
/**
+ * Logs when a volume entered low Storage state.
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
+ */
+message LowStorageStateChanged {
+ // Volume that ran out of storage.
+ optional string volume_description = 1;
+
+ enum State {
+ UNKNOWN = 0;
+ OFF = 1;
+ ON = 2;
+ }
+ optional State state = 2;
+}
+
+/**
+ * Logs when an app is downgraded.
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+ */
+message AppDowngraded {
+ optional string package_name = 1;
+ // Size of the package (all data) before being downgraded.
+ optional int64 size_in_bytes_before = 2;
+ // Size of the package (all data) after being downgraded.
+ optional int64 size_in_bytes_after = 3;
+
+ optional bool aggressive = 4;
+}
+
+/**
+ * Logs when an app is optimized after being downgraded.
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+ */
+message AppOptimizedAfterDowngraded {
+ optional string package_name = 1;
+}
+
+/**
* Logs when an app crashes.
* Logged from:
* frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index d6ab5f717568..65fc9824c76e 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -27,24 +27,29 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageInfo;
import android.os.BatteryManager;
import android.os.Environment;
import android.os.ServiceManager;
import android.os.SystemProperties;
+import android.os.UserHandle;
import android.os.storage.StorageManager;
import android.util.ArraySet;
import android.util.Log;
+import android.util.StatsLog;
-import com.android.server.pm.dex.DexManager;
+import com.android.internal.util.ArrayUtils;
import com.android.server.LocalServices;
import com.android.server.PinnerService;
+import com.android.server.pm.dex.DexManager;
import com.android.server.pm.dex.DexoptOptions;
import java.io.File;
+import java.nio.file.Paths;
import java.util.List;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
/**
* {@hide}
@@ -289,6 +294,50 @@ public class BackgroundDexOptService extends JobService {
return result;
}
+ /**
+ * Get the size of the directory. It uses recursion to go over all files.
+ * @param f
+ * @return
+ */
+ private long getDirectorySize(File f) {
+ long size = 0;
+ if (f.isDirectory()) {
+ for (File file: f.listFiles()) {
+ size += getDirectorySize(file);
+ }
+ } else {
+ size = f.length();
+ }
+ return size;
+ }
+
+ /**
+ * Get the size of a package.
+ * @param pkg
+ */
+ private long getPackageSize(PackageManagerService pm, String pkg) {
+ PackageInfo info = pm.getPackageInfo(pkg, 0, UserHandle.USER_SYSTEM);
+ long size = 0;
+ if (info != null && info.applicationInfo != null) {
+ File path = Paths.get(info.applicationInfo.sourceDir).toFile();
+ if (path.isFile()) {
+ path = path.getParentFile();
+ }
+ size += getDirectorySize(path);
+ if (!ArrayUtils.isEmpty(info.applicationInfo.splitSourceDirs)) {
+ for (String splitSourceDir : info.applicationInfo.splitSourceDirs) {
+ path = Paths.get(splitSourceDir).toFile();
+ if (path.isFile()) {
+ path = path.getParentFile();
+ }
+ size += getDirectorySize(path);
+ }
+ }
+ return size;
+ }
+ return 0;
+ }
+
private int optimizePackages(PackageManagerService pm, ArraySet<String> pkgs,
long lowStorageThreshold, boolean is_for_primary_dex,
ArraySet<String> failedPackageNames) {
@@ -315,8 +364,10 @@ public class BackgroundDexOptService extends JobService {
int reason;
boolean downgrade;
+ long package_size_before = 0; //used when the app is downgraded
// Downgrade unused packages.
if (unusedPackages.contains(pkg) && shouldDowngrade) {
+ package_size_before = getPackageSize(pm, pkg);
// This applies for system apps or if packages location is not a directory, i.e.
// monolithic install.
if (is_for_primary_dex && !pm.canHaveOatDir(pkg)) {
@@ -366,6 +417,10 @@ public class BackgroundDexOptService extends JobService {
synchronized (failedPackageNames) {
failedPackageNames.remove(pkg);
}
+ if (downgrade) {
+ StatsLog.write(StatsLog.APP_DOWNGRADED, pkg, package_size_before,
+ getPackageSize(pm, pkg), /*aggressive=*/ false);
+ }
}
}
notifyPinService(updatedPackages);
diff --git a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
index f7cc4432f9bc..2700f9ddc203 100644
--- a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
+++ b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
@@ -24,7 +24,6 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
-import android.net.TrafficStats;
import android.os.Binder;
import android.os.Environment;
import android.os.FileObserver;
@@ -42,13 +41,13 @@ import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.DataUnit;
import android.util.Slog;
+import android.util.StatsLog;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.EventLogTags;
-import com.android.server.IoThread;
import com.android.server.SystemService;
import com.android.server.pm.InstructionSets;
import com.android.server.pm.PackageManagerService;
@@ -499,9 +498,15 @@ public class DeviceStorageMonitorService extends SystemService {
notification.flags |= Notification.FLAG_NO_CLEAR;
mNotifManager.notifyAsUser(uuid.toString(), SystemMessage.NOTE_LOW_STORAGE,
notification, UserHandle.ALL);
+ StatsLog.write(StatsLog.LOW_STORAGE_STATE_CHANGED,
+ Objects.toString(vol.getDescription()),
+ StatsLog.LOW_STORAGE_STATE_CHANGED__STATE__ON);
} else if (State.isLeaving(State.LEVEL_LOW, oldLevel, newLevel)) {
mNotifManager.cancelAsUser(uuid.toString(), SystemMessage.NOTE_LOW_STORAGE,
UserHandle.ALL);
+ StatsLog.write(StatsLog.LOW_STORAGE_STATE_CHANGED,
+ Objects.toString(vol.getDescription()),
+ StatsLog.LOW_STORAGE_STATE_CHANGED__STATE__OFF);
}
}