Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5f5e1515 authored by Haiping Yang's avatar Haiping Yang
Browse files

Add dexopt, cur and ref profile fizes to computeAppStatsByDataTypes.

Bug: 294088945

Change-Id: I7f90abf2159c69e76d55b45a467dd1c31006e72a
parent e60af710
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -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;
  }
+69 −6
Original line number Diff line number Diff line
@@ -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);
+38 −1
Original line number Diff line number Diff line
@@ -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);
    }
+4 −1
Original line number Diff line number Diff line
@@ -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",
    ],
}
+29 −2
Original line number Diff line number Diff line
@@ -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);
        }
    }
}