diff options
-rw-r--r-- | core/api/current.txt | 9 | ||||
-rw-r--r-- | core/java/android/app/usage/StorageStats.java | 75 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageStats.java | 39 | ||||
-rw-r--r-- | services/usage/Android.bp | 5 | ||||
-rw-r--r-- | services/usage/java/com/android/server/usage/StorageStatsService.java | 31 |
5 files changed, 146 insertions, 13 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 15c054f0b5e8..29ff222831ba 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -9323,9 +9323,12 @@ package android.app.usage { 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 87d97d55318a..7bfaef4e9857 100644 --- a/core/java/android/app/usage/StorageStats.java +++ b/core/java/android/app/usage/StorageStats.java @@ -40,28 +40,79 @@ public final class StorageStats implements Parcelable { /** @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 @@ public final class StorageStats implements Parcelable { */ @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 @@ public final class StorageStats implements Parcelable { @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 @@ public final class StorageStats implements Parcelable { 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 @@ public final class StorageStats implements Parcelable { 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 b919c4b065fd..db3050fc18b6 100644 --- a/core/java/android/content/pm/PackageStats.java +++ b/core/java/android/content/pm/PackageStats.java @@ -67,6 +67,18 @@ public class PackageStats implements Parcelable { /** @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 @@ public class PackageStats implements Parcelable { 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 @@ public class PackageStats implements Parcelable { 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 @@ public class PackageStats implements Parcelable { 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 @@ public class PackageStats implements Parcelable { 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 @@ public class PackageStats implements Parcelable { && 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 @@ public class PackageStats implements Parcelable { @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 867773da7ba9..2c1095a34cfb 100644 --- a/services/usage/Android.bp +++ b/services/usage/Android.bp @@ -18,5 +18,8 @@ java_library_static { 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 2445f51a4241..44f4068fb424 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 @@ package com.android.server.usage; 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.GuardedBy; 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 @@ public class StorageStatsService extends IStorageStatsManager.Stub { } if (Flags.getAppBytesByDataTypeApi()) { computeAppStatsByDataTypes( - stats, appInfo.sourceDir); + stats, appInfo.sourceDir, packageNames[i]); } } } catch (NameNotFoundException e) { @@ -592,6 +597,9 @@ public class StorageStatsService extends IStorageStatsManager.Stub { 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 @@ public class StorageStatsService extends IStorageStatsManager.Stub { } 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 @@ public class StorageStatsService extends IStorageStatsManager.Stub { 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); + } } } |