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


package android.os.flagging;
package android.os.flagging;


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

import android.aconfig.storage.AconfigStorageException;
import android.aconfig.storage.AconfigStorageException;
import android.aconfig.storage.FlagTable;
import android.aconfig.storage.FlagTable;
import android.aconfig.storage.FlagValueList;
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 MAP_PATH = "/metadata/aconfig/maps/";
    private static final String BOOT_PATH = "/metadata/aconfig/boot/";
    private static final String BOOT_PATH = "/metadata/aconfig/boot/";


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

    private FlagTable mFlagTable;
    private FlagTable mFlagTable;
    private FlagValueList mFlagValueList;
    private FlagValueList mFlagValueList;


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


    private PlatformAconfigPackage() {}
    private PlatformAconfigPackage() {}


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

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