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:
@@ -48,6 +48,10 @@ public class ByteBufferReader {
|
|||||||
return new String(bytes, StandardCharsets.UTF_8);
|
return new String(bytes, StandardCharsets.UTF_8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int readByte(int i) {
|
||||||
|
return Byte.toUnsignedInt(mByteBuffer.get(i));
|
||||||
|
}
|
||||||
|
|
||||||
public void position(int newPosition) {
|
public void position(int newPosition) {
|
||||||
mByteBuffer.position(newPosition);
|
mByteBuffer.position(newPosition);
|
||||||
}
|
}
|
||||||
|
@@ -17,33 +17,21 @@
|
|||||||
package android.aconfig.storage;
|
package android.aconfig.storage;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class FlagValueList {
|
public class FlagValueList {
|
||||||
|
|
||||||
private Header mHeader;
|
private Header mHeader;
|
||||||
private List<Boolean> mList;
|
private ByteBufferReader mReader;
|
||||||
|
|
||||||
private int mSize;
|
|
||||||
|
|
||||||
public static FlagValueList fromBytes(ByteBuffer bytes) {
|
public static FlagValueList fromBytes(ByteBuffer bytes) {
|
||||||
FlagValueList flagValueList = new FlagValueList();
|
FlagValueList flagValueList = new FlagValueList();
|
||||||
ByteBufferReader reader = new ByteBufferReader(bytes);
|
flagValueList.mReader = new ByteBufferReader(bytes);
|
||||||
Header header = Header.fromBytes(reader);
|
flagValueList.mHeader = Header.fromBytes(flagValueList.mReader);
|
||||||
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();
|
|
||||||
return flagValueList;
|
return flagValueList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean get(int index) {
|
public boolean getBoolean(int index) {
|
||||||
return mList.get(index);
|
return mReader.readByte(mHeader.mBooleanValueOffset + index) == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Header getHeader() {
|
public Header getHeader() {
|
||||||
@@ -51,7 +39,7 @@ public class FlagValueList {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int size() {
|
public int size() {
|
||||||
return mSize;
|
return mHeader.mNumFlags;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Header {
|
public static class Header {
|
||||||
|
@@ -17,31 +17,30 @@
|
|||||||
package android.aconfig.storage;
|
package android.aconfig.storage;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
public class PackageTable {
|
public class PackageTable {
|
||||||
|
|
||||||
private Header mHeader;
|
private Header mHeader;
|
||||||
private Map<String, Node> mNodeMap;
|
private ByteBufferReader mReader;
|
||||||
|
|
||||||
public static PackageTable fromBytes(ByteBuffer bytes) {
|
public static PackageTable fromBytes(ByteBuffer bytes) {
|
||||||
PackageTable packageTable = new PackageTable();
|
PackageTable packageTable = new PackageTable();
|
||||||
ByteBufferReader reader = new ByteBufferReader(bytes);
|
packageTable.mReader = new ByteBufferReader(bytes);
|
||||||
Header header = Header.fromBytes(reader);
|
packageTable.mHeader = Header.fromBytes(packageTable.mReader);
|
||||||
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);
|
|
||||||
}
|
|
||||||
return packageTable;
|
return packageTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Node get(String packageName) {
|
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() {
|
public Header getHeader() {
|
||||||
|
@@ -53,7 +53,7 @@ public class FlagValueListTest {
|
|||||||
assertEquals(expected.length, flagValueList.size());
|
assertEquals(expected.length, flagValueList.size());
|
||||||
|
|
||||||
for (int i = 0; i < flagValueList.size(); i++) {
|
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");
|
PackageTable.Node pNode = packageTable.get("com.android.aconfig.storage.test_1");
|
||||||
FlagTable.Node fNode = flagTable.get(pNode.getPackageId(), "enabled_rw");
|
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");
|
pNode = packageTable.get("com.android.aconfig.storage.test_4");
|
||||||
fNode = flagTable.get(pNode.getPackageId(), "enabled_fixed_ro");
|
fNode = flagTable.get(pNode.getPackageId(), "enabled_fixed_ro");
|
||||||
assertTrue(flagValueList.get(pNode.getBooleanStartIndex() + fNode.getFlagIndex()));
|
assertTrue(flagValueList.getBoolean(pNode.getBooleanStartIndex() + fNode.getFlagIndex()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -56,7 +56,7 @@ public class StorageInternalReader {
|
|||||||
if (index >= mFlagValueList.size()) {
|
if (index >= mFlagValueList.size()) {
|
||||||
throw new AconfigStorageException("Fail to get boolean flag value");
|
throw new AconfigStorageException("Fail to get boolean flag value");
|
||||||
}
|
}
|
||||||
return mFlagValueList.get(index);
|
return mFlagValueList.getBoolean(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getPackageBooleanStartOffset(String packageName) {
|
private int getPackageBooleanStartOffset(String packageName) {
|
||||||
|
Reference in New Issue
Block a user