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
This commit is contained in:
Zhi Dou
2024-08-22 19:56:48 +00:00
parent 2f0d0b861b
commit 99023d6160
5 changed files with 26 additions and 35 deletions

View File

@@ -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);
}

View File

@@ -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<Boolean> 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 {

View File

@@ -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<String, Node> 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() {

View File

@@ -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()));
}
}

View File

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