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

Commit 74f2cf8c authored by Zhi Dou's avatar Zhi Dou
Browse files

Cache all platform aconfig packages in PlatformAconfigPackage

This change utilizes zygote caching all platform aconfig package in
PlatformAconfigPackage. Zygote will load all platform aconfig packages
and stores them in PlatformAconfigPackage.

The benefits of this change are

1. PlatformAconfigPackageInteral has faster package loading, since it
   can directly get the flag package from PlatformAconfigPackage,
   instead of reading from the mapped file.
2. Flag read won't cause disk restrict mode failure

Test: atest aconfig.test aconfig_storage_read_functional
aconfig_storage_file.test.java
Bug: 386382756
Flag: EXEMPT refactor

Change-Id: I0f42b72073e5a410619f5dc17ffb2890e670a5ff
parent 0d6e9f21
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -106,10 +106,6 @@
    {
      // aconfig_storage read functional test
      "name": "aconfig_storage_read_functional"
    },
    {
      // aconfig_storage read unit test
      "name": "aconfig_storage_read_unit"
    }
  ]
}
+1 −1
Original line number Diff line number Diff line
@@ -555,7 +555,7 @@ mod tests {
            private static boolean enabledRw = true;
            private void init() {
                try {
                    PlatformAconfigPackageInternal reader = PlatformAconfigPackageInternal.load("system", "com.android.aconfig.test", 0x5081CE7221C77064L);
                    PlatformAconfigPackageInternal reader = PlatformAconfigPackageInternal.load("com.android.aconfig.test", 0x5081CE7221C77064L);
                    disabledRw = reader.getBooleanFlagValue(0);
                    disabledRwExported = reader.getBooleanFlagValue(1);
                    enabledRw = reader.getBooleanFlagValue(7);
+2 −2
Original line number Diff line number Diff line
@@ -27,9 +27,9 @@ public final class FeatureFlagsImpl implements FeatureFlags \{
    private void init() \{
        try \{
{{ if is_platform_container }}
            PlatformAconfigPackageInternal reader = PlatformAconfigPackageInternal.load("{container}", "{package_name}", {package_fingerprint});
            PlatformAconfigPackageInternal reader = PlatformAconfigPackageInternal.load("{package_name}", {package_fingerprint});
{{ -else }}
            AconfigPackageInternal reader = AconfigPackageInternal.load("{container}", "{package_name}", {package_fingerprint});
            AconfigPackageInternal reader = AconfigPackageInternal.load("{package_name}", {package_fingerprint});
{{ -endif }}
        {{ -for namespace_with_flags in namespace_flags }}
        {{ -for flag in namespace_with_flags.flags }}
+12 −0
Original line number Diff line number Diff line
@@ -63,4 +63,16 @@ public class TableUtils {
        long hashVal = SipHasher13.hash(val);
        return (int) Long.remainderUnsigned(hashVal, numBuckets);
    }

     public static class StorageFilesBundle {
        public final PackageTable packageTable;
        public final FlagTable flagTable;
        public final FlagValueList flagValueList;

        public StorageFilesBundle (PackageTable pTable, FlagTable fTable, FlagValueList fValueList) {
            this.packageTable = pTable;
            this.flagTable = fTable;
            this.flagValueList = fValueList;
        }
     }
}
+17 −11
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.os.flagging;

import static android.aconfig.storage.TableUtils.StorageFilesBundle;

import android.aconfig.storage.AconfigStorageException;
import android.aconfig.storage.FlagTable;
import android.aconfig.storage.FlagValueList;
@@ -49,8 +51,6 @@ public class PlatformAconfigPackage {
    private static final String MAP_PATH = "/metadata/aconfig/maps/";
    private static final String BOOT_PATH = "/metadata/aconfig/boot/";

    private static final Map<String, PackageTable> sPackageTableCache = new HashMap<>();

    private FlagTable mFlagTable;
    private FlagValueList mFlagValueList;

@@ -59,6 +59,9 @@ public class PlatformAconfigPackage {

    private PlatformAconfigPackage() {}

    /** @hide */
    static final Map<String, StorageFilesBundle> sStorageFilesCache = new HashMap<>();

    /** @hide */
    @UnsupportedAppUsage
    public static final Set<String> PLATFORM_PACKAGE_MAP_FILES =
@@ -68,8 +71,14 @@ public class PlatformAconfigPackage {
        for (String pf : PLATFORM_PACKAGE_MAP_FILES) {
            try {
                PackageTable pTable = PackageTable.fromBytes(mapStorageFile(MAP_PATH + pf));
                String container = pTable.getHeader().getContainer();
                FlagTable fTable =
                        FlagTable.fromBytes(mapStorageFile(MAP_PATH + container + ".flag.map"));
                FlagValueList fValueList =
                        FlagValueList.fromBytes(mapStorageFile(BOOT_PATH + container + ".val"));
                StorageFilesBundle files = new StorageFilesBundle(pTable, fTable, fValueList);
                for (String packageName : pTable.getPackageList()) {
                    sPackageTableCache.put(packageName, pTable);
                    sStorageFilesCache.put(packageName, files);
                }
            } catch (Exception e) {
                // pass
@@ -95,16 +104,13 @@ public class PlatformAconfigPackage {
    public static PlatformAconfigPackage load(String packageName) {
        try {
            PlatformAconfigPackage aconfigPackage = new PlatformAconfigPackage();
            PackageTable pTable = sPackageTableCache.get(packageName);
            if (pTable == null) {
            StorageFilesBundle files = sStorageFilesCache.get(packageName);
            if (files == null) {
                return null;
            }
            PackageTable.Node pNode = pTable.get(packageName);
            String container = pTable.getHeader().getContainer();
            aconfigPackage.mFlagTable =
                    FlagTable.fromBytes(mapStorageFile(MAP_PATH + container + ".flag.map"));
            aconfigPackage.mFlagValueList =
                    FlagValueList.fromBytes(mapStorageFile(BOOT_PATH + container + ".val"));
            PackageTable.Node pNode = files.packageTable.get(packageName);
            aconfigPackage.mFlagTable = files.flagTable;
            aconfigPackage.mFlagValueList = files.flagValueList;
            aconfigPackage.mPackageBooleanStartOffset = pNode.getBooleanStartIndex();
            aconfigPackage.mPackageId = pNode.getPackageId();
            return aconfigPackage;
Loading