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

Commit 26bb8bda authored by Haiping Yang's avatar Haiping Yang Committed by Android (Google) Code Review
Browse files

Merge "Add dexopt, cur and ref profile fizes to computeAppStatsByDataTypes." into main

parents 00fea611 5f5e1515
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -9357,9 +9357,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);
        }
    }
}