Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 99023d61 authored by Zhi Dou's avatar Zhi Dou
Browse files

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
parent 2f0d0b86
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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);
    }
+6 −18
Original line number Diff line number Diff line
@@ -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 {
+12 −13
Original line number Diff line number Diff line
@@ -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() {
+3 −3
Original line number Diff line number Diff line
@@ -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()));
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -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) {