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

Commit 5771a6cc authored by Jeremy Meyer's avatar Jeremy Meyer
Browse files

filter flagged xml elements

This makes the xml parser skip over xml elements behind disabled flags

Bug:377974898
Test: new cts FlaggedResourcesRWTest
Flag: android.content.res.layout_readwrite_flags

Change-Id: Iecd32f85b25e6676f21d2a95ffacd6d0f5d94dd0
parent 8076adb3
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -29,6 +29,8 @@ import android.ravenwood.annotation.RavenwoodKeepWholeClass;
import android.util.TypedValue;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.pm.pkg.component.AconfigFlags;
import com.android.internal.pm.pkg.parsing.ParsingPackageUtils;
import com.android.internal.util.XmlUtils;

import dalvik.annotation.optimization.CriticalNative;
@@ -50,6 +52,7 @@ import java.io.Reader;
@RavenwoodClassLoadHook(RavenwoodClassLoadHook.LIBANDROID_LOADING_HOOK)
public final class XmlBlock implements AutoCloseable {
    private static final boolean DEBUG=false;
    public static final String ANDROID_RESOURCES = "http://schemas.android.com/apk/res/android";

    @UnsupportedAppUsage
    public XmlBlock(byte[] data) {
@@ -343,6 +346,23 @@ public final class XmlBlock implements AutoCloseable {
            if (ev == ERROR_BAD_DOCUMENT) {
                throw new XmlPullParserException("Corrupt XML binary file");
            }
            if (Flags.layoutReadwriteFlags() && ev == START_TAG) {
                AconfigFlags flags = ParsingPackageUtils.getAconfigFlags();
                if (flags.skipCurrentElement(/* pkg= */ null, this)) {
                    int depth = 1;
                    while (depth > 0) {
                        int ev2 = nativeNext(mParseState);
                        if (ev2 == ERROR_BAD_DOCUMENT) {
                            throw new XmlPullParserException("Corrupt XML binary file");
                        } else if (ev2 == START_TAG) {
                            depth++;
                        } else if (ev2 == END_TAG) {
                            depth--;
                        }
                    }
                    return next();
                }
            }
            if (mDecNextDepth) {
                mDepth--;
                mDecNextDepth = false;