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) {