From 99023d616065f60fe2e76a6c4c9900330e527b0c Mon Sep 17 00:00:00 2001 From: Zhi Dou Date: Thu, 22 Aug 2024 19:56:48 +0000 Subject: [PATCH] Remove local copy of the flag file This change removes the local copy of the flag file in PackageTable, and FlagValueList. PackageTable copied the entire flag file into memory, and the FlagValueList copied the entire flag value list into memory. In this change FlagValueList directly access the flag value list in the memory. PackageTable will iterate the file, and find the target package node. Change-Id: Id766c28b71a54290b266cc5f3f404f5c82590da2 Test: atest aconfig_storage_file.test.java aconfig_storage_read_api.test.java Bug: 352078117 --- .../aconfig/storage/ByteBufferReader.java | 4 +++ .../aconfig/storage/FlagValueList.java | 24 +++++------------- .../android/aconfig/storage/PackageTable.java | 25 +++++++++---------- .../tests/srcs/FlagValueListTest.java | 6 ++--- .../storage/StorageInternalReader.java | 2 +- 5 files changed, 26 insertions(+), 35 deletions(-) diff --git a/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/ByteBufferReader.java b/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/ByteBufferReader.java index 1c72364e6b..4bea0836f0 100644 --- a/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/ByteBufferReader.java +++ b/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/ByteBufferReader.java @@ -48,6 +48,10 @@ public class ByteBufferReader { return new String(bytes, StandardCharsets.UTF_8); } + public int readByte(int i) { + return Byte.toUnsignedInt(mByteBuffer.get(i)); + } + public void position(int newPosition) { mByteBuffer.position(newPosition); } diff --git a/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/FlagValueList.java b/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/FlagValueList.java index 0ddc147e82..493436d2a2 100644 --- a/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/FlagValueList.java +++ b/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/FlagValueList.java @@ -17,33 +17,21 @@ package android.aconfig.storage; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; public class FlagValueList { private Header mHeader; - private List mList; - - private int mSize; + private ByteBufferReader mReader; public static FlagValueList fromBytes(ByteBuffer bytes) { FlagValueList flagValueList = new FlagValueList(); - ByteBufferReader reader = new ByteBufferReader(bytes); - Header header = Header.fromBytes(reader); - flagValueList.mHeader = header; - flagValueList.mList = new ArrayList(header.mNumFlags); - reader.position(header.mBooleanValueOffset); - for (int i = 0; i < header.mNumFlags; i++) { - boolean val = reader.readByte() == 1; - flagValueList.mList.add(val); - } - flagValueList.mSize = flagValueList.mList.size(); + flagValueList.mReader = new ByteBufferReader(bytes); + flagValueList.mHeader = Header.fromBytes(flagValueList.mReader); return flagValueList; } - public boolean get(int index) { - return mList.get(index); + public boolean getBoolean(int index) { + return mReader.readByte(mHeader.mBooleanValueOffset + index) == 1; } public Header getHeader() { @@ -51,7 +39,7 @@ public class FlagValueList { } public int size() { - return mSize; + return mHeader.mNumFlags; } public static class Header { diff --git a/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/PackageTable.java b/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/PackageTable.java index d04e1ac391..7ef947dac7 100644 --- a/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/PackageTable.java +++ b/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/PackageTable.java @@ -17,31 +17,30 @@ package android.aconfig.storage; import java.nio.ByteBuffer; -import java.util.HashMap; -import java.util.Map; import java.util.Objects; public class PackageTable { private Header mHeader; - private Map mNodeMap; + private ByteBufferReader mReader; public static PackageTable fromBytes(ByteBuffer bytes) { PackageTable packageTable = new PackageTable(); - ByteBufferReader reader = new ByteBufferReader(bytes); - Header header = Header.fromBytes(reader); - packageTable.mHeader = header; - packageTable.mNodeMap = new HashMap(TableUtils.getTableSize(header.mNumPackages)); - reader.position(header.mNodeOffset); - for (int i = 0; i < header.mNumPackages; i++) { - Node node = Node.fromBytes(reader); - packageTable.mNodeMap.put(node.mPackageName, node); - } + packageTable.mReader = new ByteBufferReader(bytes); + packageTable.mHeader = Header.fromBytes(packageTable.mReader); + return packageTable; } public Node get(String packageName) { - return mNodeMap.get(packageName); + mReader.position(mHeader.mNodeOffset); + for (int i = 0; i < mHeader.mNumPackages; i++) { + Node node = Node.fromBytes(mReader); + if (Objects.equals(node.mPackageName, packageName)) { + return node; + } + } + throw new AconfigStorageException("get cannot find package: " + packageName); } public Header getHeader() { diff --git a/tools/aconfig/aconfig_storage_file/tests/srcs/FlagValueListTest.java b/tools/aconfig/aconfig_storage_file/tests/srcs/FlagValueListTest.java index c18590accc..1b0de630c7 100644 --- a/tools/aconfig/aconfig_storage_file/tests/srcs/FlagValueListTest.java +++ b/tools/aconfig/aconfig_storage_file/tests/srcs/FlagValueListTest.java @@ -53,7 +53,7 @@ public class FlagValueListTest { assertEquals(expected.length, flagValueList.size()); for (int i = 0; i < flagValueList.size(); i++) { - assertEquals(expected[i], flagValueList.get(i)); + assertEquals(expected[i], flagValueList.getBoolean(i)); } } @@ -68,10 +68,10 @@ public class FlagValueListTest { PackageTable.Node pNode = packageTable.get("com.android.aconfig.storage.test_1"); FlagTable.Node fNode = flagTable.get(pNode.getPackageId(), "enabled_rw"); - assertTrue(flagValueList.get(pNode.getBooleanStartIndex() + fNode.getFlagIndex())); + assertTrue(flagValueList.getBoolean(pNode.getBooleanStartIndex() + fNode.getFlagIndex())); pNode = packageTable.get("com.android.aconfig.storage.test_4"); fNode = flagTable.get(pNode.getPackageId(), "enabled_fixed_ro"); - assertTrue(flagValueList.get(pNode.getBooleanStartIndex() + fNode.getFlagIndex())); + assertTrue(flagValueList.getBoolean(pNode.getBooleanStartIndex() + fNode.getFlagIndex())); } } diff --git a/tools/aconfig/aconfig_storage_read_api/srcs/android/aconfig/storage/StorageInternalReader.java b/tools/aconfig/aconfig_storage_read_api/srcs/android/aconfig/storage/StorageInternalReader.java index 71c1c0dc09..29ebee5ab4 100644 --- a/tools/aconfig/aconfig_storage_read_api/srcs/android/aconfig/storage/StorageInternalReader.java +++ b/tools/aconfig/aconfig_storage_read_api/srcs/android/aconfig/storage/StorageInternalReader.java @@ -56,7 +56,7 @@ public class StorageInternalReader { if (index >= mFlagValueList.size()) { throw new AconfigStorageException("Fail to get boolean flag value"); } - return mFlagValueList.get(index); + return mFlagValueList.getBoolean(index); } private int getPackageBooleanStartOffset(String packageName) {