Merge "Add dexopt, cur and ref profile fizes to computeAppStatsByDataTypes." into main
diff --git a/core/api/current.txt b/core/api/current.txt
index 283e429..4351143 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -9357,9 +9357,12 @@
method public long getDataBytes();
method public long getExternalCacheBytes();
method public void writeToParcel(android.os.Parcel, int);
- field @FlaggedApi("android.app.usage.get_app_bytes_by_data_type_api") public static final int APP_DATA_TYPE_FILE_TYPE_APK = 0; // 0x0
- field @FlaggedApi("android.app.usage.get_app_bytes_by_data_type_api") public static final int APP_DATA_TYPE_FILE_TYPE_DM = 1; // 0x1
- field @FlaggedApi("android.app.usage.get_app_bytes_by_data_type_api") public static final int APP_DATA_TYPE_LIB = 2; // 0x2
+ field @FlaggedApi("android.app.usage.get_app_bytes_by_data_type_api") public static final int APP_DATA_TYPE_FILE_TYPE_APK = 3; // 0x3
+ field @FlaggedApi("android.app.usage.get_app_bytes_by_data_type_api") public static final int APP_DATA_TYPE_FILE_TYPE_CURRENT_PROFILE = 2; // 0x2
+ field @FlaggedApi("android.app.usage.get_app_bytes_by_data_type_api") public static final int APP_DATA_TYPE_FILE_TYPE_DEXOPT_ARTIFACT = 0; // 0x0
+ field @FlaggedApi("android.app.usage.get_app_bytes_by_data_type_api") public static final int APP_DATA_TYPE_FILE_TYPE_DM = 4; // 0x4
+ field @FlaggedApi("android.app.usage.get_app_bytes_by_data_type_api") public static final int APP_DATA_TYPE_FILE_TYPE_REFERENCE_PROFILE = 1; // 0x1
+ field @FlaggedApi("android.app.usage.get_app_bytes_by_data_type_api") public static final int APP_DATA_TYPE_LIB = 5; // 0x5
field @NonNull public static final android.os.Parcelable.Creator<android.app.usage.StorageStats> CREATOR;
}
diff --git a/core/java/android/app/usage/StorageStats.java b/core/java/android/app/usage/StorageStats.java
index 87d97d5..7bfaef4 100644
--- a/core/java/android/app/usage/StorageStats.java
+++ b/core/java/android/app/usage/StorageStats.java
@@ -40,28 +40,79 @@
/** @hide */ public long apkBytes;
/** @hide */ public long libBytes;
/** @hide */ public long dmBytes;
+ /** @hide */ public long dexoptBytes;
+ /** @hide */ public long curProfBytes;
+ /** @hide */ public long refProfBytes;
/** @hide */ public long externalCacheBytes;
- /** Represents all .apk files in application code path.
+ /**
+ * Represents all nonstale dexopt and runtime artifacts of application.
+ * This includes AOT-compiled code and other data that can speed up app execution.
+ * For more detailed information, read the
+ * <a href="https://source.android.com/docs/core/runtime/jit-compiler#flow">JIT compiler</a>
+ * guide.
+ *
+ * Dexopt artifacts become stale when one of their dependencies
+ * has changed. They may be cleaned up or replaced by ART Services at any time.
+ *
+ * For a preload app, this type includes dexopt artifacts on readonly partitions
+ * if they are up-to-date.
+ *
+ * Can be used as an input to {@link #getAppBytesByDataType(int)}
+ * to get the sum of sizes for files of this type. The sum might include the size of data
+ * that is part of appBytes, dataBytes or cacheBytes.
+ */
+ @FlaggedApi(Flags.FLAG_GET_APP_BYTES_BY_DATA_TYPE_API)
+ public static final int APP_DATA_TYPE_FILE_TYPE_DEXOPT_ARTIFACT = 0;
+
+ /**
+ * Represents reference profile of application.
+ *
+ * Reference profiles are the ones used during the last profile-guided dexopt.
+ * If the last dexopt wasn't profile-guided, then these profiles were not used.
+ *
+ * Can be used as an input to {@link #getAppBytesByDataType(int)}
+ * to get the size of files of this type.
+ */
+ @FlaggedApi(Flags.FLAG_GET_APP_BYTES_BY_DATA_TYPE_API)
+ public static final int APP_DATA_TYPE_FILE_TYPE_REFERENCE_PROFILE = 1;
+
+ /**
+ * Represents current profile of application.
+ *
+ * Current profiles may or may not be used during the next profile-guided dexopt.
+ *
+ * Can be used as an input to {@link #getAppBytesByDataType(int)}
+ * to get the size of files of this type. This size fluctuates regularly,
+ * it goes up when the user uses more and more classes/methods and comes down when
+ * a deamon merges this into the ref profile and does profile-guided dexopt.
+ */
+ @FlaggedApi(Flags.FLAG_GET_APP_BYTES_BY_DATA_TYPE_API)
+ public static final int APP_DATA_TYPE_FILE_TYPE_CURRENT_PROFILE = 2;
+
+ /**
+ * Represents all .apk files in application code path.
* Can be used as an input to {@link #getAppBytesByDataType(int)}
* to get the sum of sizes for files of this type.
*/
@FlaggedApi(Flags.FLAG_GET_APP_BYTES_BY_DATA_TYPE_API)
- public static final int APP_DATA_TYPE_FILE_TYPE_APK = 0;
+ public static final int APP_DATA_TYPE_FILE_TYPE_APK = 3;
- /** Represents all .dm files in application code path.
+ /**
+ * Represents all .dm files in application code path.
* Can be used as an input to {@link #getAppBytesByDataType(int)}
* to get the sum of sizes for files of this type.
*/
@FlaggedApi(Flags.FLAG_GET_APP_BYTES_BY_DATA_TYPE_API)
- public static final int APP_DATA_TYPE_FILE_TYPE_DM = 1;
+ public static final int APP_DATA_TYPE_FILE_TYPE_DM = 4;
- /** Represents lib/ in application code path.
+ /**
+ * Represents lib/ in application code path.
* Can be used as an input to {@link #getAppBytesByDataType(int)}
* to get the size of lib/ directory.
*/
@FlaggedApi(Flags.FLAG_GET_APP_BYTES_BY_DATA_TYPE_API)
- public static final int APP_DATA_TYPE_LIB = 2;
+ public static final int APP_DATA_TYPE_LIB = 5;
/**
* Keep in sync with the file types defined above.
@@ -69,6 +120,9 @@
*/
@FlaggedApi(Flags.FLAG_GET_APP_BYTES_BY_DATA_TYPE_API)
@IntDef(flag = false, value = {
+ APP_DATA_TYPE_FILE_TYPE_DEXOPT_ARTIFACT,
+ APP_DATA_TYPE_FILE_TYPE_REFERENCE_PROFILE,
+ APP_DATA_TYPE_FILE_TYPE_CURRENT_PROFILE,
APP_DATA_TYPE_FILE_TYPE_APK,
APP_DATA_TYPE_FILE_TYPE_DM,
APP_DATA_TYPE_LIB,
@@ -103,6 +157,9 @@
@FlaggedApi(Flags.FLAG_GET_APP_BYTES_BY_DATA_TYPE_API)
public long getAppBytesByDataType(@AppDataType int dataType) {
switch (dataType) {
+ case APP_DATA_TYPE_FILE_TYPE_DEXOPT_ARTIFACT: return dexoptBytes;
+ case APP_DATA_TYPE_FILE_TYPE_REFERENCE_PROFILE: return refProfBytes;
+ case APP_DATA_TYPE_FILE_TYPE_CURRENT_PROFILE: return curProfBytes;
case APP_DATA_TYPE_FILE_TYPE_APK: return apkBytes;
case APP_DATA_TYPE_LIB: return libBytes;
case APP_DATA_TYPE_FILE_TYPE_DM: return dmBytes;
@@ -161,6 +218,9 @@
this.codeBytes = in.readLong();
this.dataBytes = in.readLong();
this.cacheBytes = in.readLong();
+ this.dexoptBytes = in.readLong();
+ this.refProfBytes = in.readLong();
+ this.curProfBytes = in.readLong();
this.apkBytes = in.readLong();
this.libBytes = in.readLong();
this.dmBytes = in.readLong();
@@ -177,6 +237,9 @@
dest.writeLong(codeBytes);
dest.writeLong(dataBytes);
dest.writeLong(cacheBytes);
+ dest.writeLong(dexoptBytes);
+ dest.writeLong(refProfBytes);
+ dest.writeLong(curProfBytes);
dest.writeLong(apkBytes);
dest.writeLong(libBytes);
dest.writeLong(dmBytes);
diff --git a/core/java/android/content/pm/PackageStats.java b/core/java/android/content/pm/PackageStats.java
index b919c4b..db3050f 100644
--- a/core/java/android/content/pm/PackageStats.java
+++ b/core/java/android/content/pm/PackageStats.java
@@ -67,6 +67,18 @@
/** @hide */
public long dmSize;
+ /** Size of dexopt artifacts of the application. */
+ /** @hide */
+ public long dexoptSize;
+
+ /** Size of the current profile of the application. */
+ /** @hide */
+ public long curProfSize;
+
+ /** Size of the reference profile of the application. */
+ /** @hide */
+ public long refProfSize;
+
/**
* Size of the secure container on external storage holding the
* application's code.
@@ -132,6 +144,18 @@
sb.append(" dm=");
sb.append(dmSize);
}
+ if (dexoptSize != 0) {
+ sb.append(" dexopt=");
+ sb.append(dexoptSize);
+ }
+ if (curProfSize != 0) {
+ sb.append(" curProf=");
+ sb.append(curProfSize);
+ }
+ if (refProfSize != 0) {
+ sb.append(" refProf=");
+ sb.append(refProfSize);
+ }
if (externalCodeSize != 0) {
sb.append(" extCode=");
sb.append(externalCodeSize);
@@ -176,6 +200,9 @@
apkSize = source.readLong();
libSize = source.readLong();
dmSize = source.readLong();
+ dexoptSize = source.readLong();
+ curProfSize = source.readLong();
+ refProfSize = source.readLong();
externalCodeSize = source.readLong();
externalDataSize = source.readLong();
externalCacheSize = source.readLong();
@@ -192,6 +219,9 @@
apkSize = pStats.apkSize;
libSize = pStats.libSize;
dmSize = pStats.dmSize;
+ dexoptSize = pStats.dexoptSize;
+ curProfSize = pStats.curProfSize;
+ refProfSize = pStats.refProfSize;
externalCodeSize = pStats.externalCodeSize;
externalDataSize = pStats.externalDataSize;
externalCacheSize = pStats.externalCacheSize;
@@ -212,6 +242,9 @@
dest.writeLong(apkSize);
dest.writeLong(libSize);
dest.writeLong(dmSize);
+ dest.writeLong(dexoptSize);
+ dest.writeLong(curProfSize);
+ dest.writeLong(refProfSize);
dest.writeLong(externalCodeSize);
dest.writeLong(externalDataSize);
dest.writeLong(externalCacheSize);
@@ -234,6 +267,9 @@
&& apkSize == otherStats.apkSize
&& libSize == otherStats.libSize
&& dmSize == otherStats.dmSize
+ && dexoptSize == otherStats.dexoptSize
+ && curProfSize == otherStats.curProfSize
+ && refProfSize == otherStats.refProfSize
&& externalCodeSize == otherStats.externalCodeSize
&& externalDataSize == otherStats.externalDataSize
&& externalCacheSize == otherStats.externalCacheSize
@@ -244,7 +280,8 @@
@Override
public int hashCode() {
return Objects.hash(packageName, userHandle, codeSize, dataSize,
- apkSize, libSize, dmSize, cacheSize, externalCodeSize,
+ apkSize, libSize, dmSize, dexoptSize, curProfSize,
+ refProfSize, cacheSize, externalCodeSize,
externalDataSize, externalCacheSize, externalMediaSize,
externalObbSize);
}
diff --git a/services/usage/Android.bp b/services/usage/Android.bp
index 867773d..2c1095a 100644
--- a/services/usage/Android.bp
+++ b/services/usage/Android.bp
@@ -18,5 +18,8 @@
name: "services.usage",
defaults: ["platform_service_defaults"],
srcs: [":services.usage-sources"],
- libs: ["services.core"],
+ libs: [
+ "services.core",
+ "service-art.stubs.system_server",
+ ],
}
diff --git a/services/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java
index 2445f51..44f4068 100644
--- a/services/usage/java/com/android/server/usage/StorageStatsService.java
+++ b/services/usage/java/com/android/server/usage/StorageStatsService.java
@@ -19,7 +19,9 @@
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static com.android.internal.util.ArrayUtils.defeatNullable;
+import static com.android.server.pm.DexOptHelper.getArtManagerLocal;
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
+import static com.android.server.pm.PackageManagerServiceUtils.getPackageManagerLocal;
import static com.android.server.usage.StorageStatsManagerLocal.StorageStatsAugmenter;
import android.Manifest;
@@ -76,6 +78,9 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
+import com.android.server.art.ArtManagerLocal;
+import com.android.server.art.model.ArtManagedFileStats;
+import com.android.server.pm.PackageManagerLocal.FilteredSnapshot;
import com.android.server.IoThread;
import com.android.server.LocalManagerRegistry;
import com.android.server.LocalServices;
@@ -449,7 +454,7 @@
}
if (Flags.getAppBytesByDataTypeApi()) {
computeAppStatsByDataTypes(
- stats, appInfo.sourceDir);
+ stats, appInfo.sourceDir, packageNames[i]);
}
}
} catch (NameNotFoundException e) {
@@ -592,6 +597,9 @@
res.codeBytes = stats.codeSize + stats.externalCodeSize;
res.dataBytes = stats.dataSize + stats.externalDataSize;
res.cacheBytes = stats.cacheSize + stats.externalCacheSize;
+ res.dexoptBytes = stats.dexoptSize;
+ res.curProfBytes = stats.curProfSize;
+ res.refProfBytes = stats.refProfSize;
res.apkBytes = stats.apkSize;
res.libBytes = stats.libSize;
res.dmBytes = stats.dmSize;
@@ -946,7 +954,7 @@
}
private void computeAppStatsByDataTypes(
- PackageStats stats, String sourceDirName) {
+ PackageStats stats, String sourceDirName, String packageName) {
// Get apk, lib, dm file sizes.
File srcDir = new File(sourceDirName);
@@ -958,5 +966,24 @@
stats.apkSize += getFileBytesInDir(srcDir, ".apk");
stats.dmSize += getFileBytesInDir(srcDir, ".dm");
stats.libSize += getDirBytes(new File(sourceDirName + "/lib/"));
+
+ // Get dexopt, current profle and reference profile sizes.
+ if (SystemProperties.getBoolean("dalvik.vm.features.art_managed_file_stats", false)) {
+ ArtManagedFileStats artManagedFileStats;
+ try (var snapshot = getPackageManagerLocal().withFilteredSnapshot()) {
+ artManagedFileStats =
+ getArtManagerLocal().getArtManagedFileStats(snapshot, packageName);
+ }
+
+ stats.dexoptSize +=
+ artManagedFileStats
+ .getTotalSizeBytesByType(ArtManagedFileStats.TYPE_DEXOPT_ARTIFACT);
+ stats.refProfSize +=
+ artManagedFileStats
+ .getTotalSizeBytesByType(ArtManagedFileStats.TYPE_REF_PROFILE);
+ stats.curProfSize +=
+ artManagedFileStats
+ .getTotalSizeBytesByType(ArtManagedFileStats.TYPE_CUR_PROFILE);
+ }
}
}