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

Commit 4f0c14dc authored by Winson's avatar Winson
Browse files

Split ParsedMainComponentImpl

Bug: 178218967

Change-Id: I8034273df9f00828f9bc027457bc6f1166d0947a
parent 7c5169e3
Loading
Loading
Loading
Loading
+54 −51
Original line number Diff line number Diff line
@@ -267,8 +267,8 @@ public class ParsingPackageUtils {
            boolean collectCertificates) {
        ParseResult<ParsingPackage> result;

        ParsingPackageUtils parser = new ParsingPackageUtils(false, null, null, splitPermissions,
                new Callback() {
        ParsingPackageUtils parser = new ParsingPackageUtils(false, null /*separateProcesses*/,
                null /*displayMetrics*/, splitPermissions, new Callback() {
            @Override
            public boolean hasFeature(String feature) {
                // Assume the device doesn't support anything. This will affect permission
@@ -625,8 +625,8 @@ public class ParsingPackageUtils {

        final TypedArray manifestArray = res.obtainAttributes(parser, R.styleable.AndroidManifest);
        try {
            final boolean isCoreApp =
                    parser.getAttributeBooleanValue(null, "coreApp", false);
            final boolean isCoreApp = parser.getAttributeBooleanValue(null /*namespace*/,
                    "coreApp",false);
            final ParsingPackage pkg = mCallback.startParsingPackage(
                    pkgName, apkPath, codePath, manifestArray, isCoreApp);
            final ParseResult<ParsingPackage> result =
@@ -732,6 +732,13 @@ public class ParsingPackageUtils {
        } finally {
            sa.recycle();
        }

        // If the loaded component did not specify a split, inherit the split name
        // based on the split it is defined in.
        // This is used to later load the correct split when starting this
        // component.
        String defaultSplitName = pkg.getSplitNames()[splitIndex];

        final int depth = parser.getDepth();
        int type;
        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -753,8 +760,7 @@ public class ParsingPackageUtils {
                case "receiver":
                    ParseResult<ParsedActivity> activityResult =
                            ParsedActivityUtils.parseActivityOrReceiver(mSeparateProcesses, pkg,
                                    res,
                                    parser, flags, sUseRoundIcon, input);
                                    res, parser, flags, sUseRoundIcon, defaultSplitName, input);
                    if (activityResult.isSuccess()) {
                        ParsedActivity activity = activityResult.getResult();
                        if (isActivity) {
@@ -768,8 +774,8 @@ public class ParsingPackageUtils {
                    break;
                case "service":
                    ParseResult<ParsedService> serviceResult = ParsedServiceUtils.parseService(
                            mSeparateProcesses, pkg, res, parser, flags,
                            sUseRoundIcon, input);
                            mSeparateProcesses, pkg, res, parser, flags, sUseRoundIcon,
                            defaultSplitName, input);
                    if (serviceResult.isSuccess()) {
                        ParsedService service = serviceResult.getResult();
                        pkg.addService(service);
@@ -780,7 +786,7 @@ public class ParsingPackageUtils {
                case "provider":
                    ParseResult<ParsedProvider> providerResult =
                            ParsedProviderUtils.parseProvider(mSeparateProcesses, pkg, res, parser,
                                    flags, sUseRoundIcon, input);
                                    flags, sUseRoundIcon, defaultSplitName, input);
                    if (providerResult.isSuccess()) {
                        ParsedProvider provider = providerResult.getResult();
                        pkg.addProvider(provider);
@@ -790,7 +796,7 @@ public class ParsingPackageUtils {
                    break;
                case "activity-alias":
                    activityResult = ParsedActivityUtils.parseActivityAlias(pkg, res, parser,
                            sUseRoundIcon, input);
                            sUseRoundIcon, defaultSplitName, input);
                    if (activityResult.isSuccess()) {
                        ParsedActivity activity = activityResult.getResult();
                        pkg.addActivity(activity);
@@ -807,14 +813,6 @@ public class ParsingPackageUtils {
            if (result.isError()) {
                return input.error(result);
            }

            if (mainComponent != null && mainComponent.getSplitName() == null) {
                // If the loaded component did not specify a split, inherit the split name
                // based on the split it is defined in.
                // This is used to later load the correct split when starting this
                // component.
                mainComponent.setSplitName(pkg.getSplitNames()[splitIndex]);
            }
        }

        return input.success(pkg);
@@ -832,15 +830,15 @@ public class ParsingPackageUtils {
                // note: application meta-data is stored off to the side, so it can
                // remain null in the primary copy (we like to avoid extra copies because
                // it can be large)
                ParseResult<Property> metaDataResult = parseMetaData(pkg, null, res,
                        parser, "<meta-data>", input);
                ParseResult<Property> metaDataResult = parseMetaData(pkg, null /*component*/,
                        res, parser, "<meta-data>", input);
                if (metaDataResult.isSuccess() && metaDataResult.getResult() != null) {
                    pkg.setMetaData(metaDataResult.getResult().toBundle(pkg.getMetaData()));
                }
                return metaDataResult;
            case "property":
                ParseResult<Property> propertyResult = parseMetaData(pkg, null, res,
                        parser, "<property>", input);
                ParseResult<Property> propertyResult = parseMetaData(pkg, null /*component*/,
                        res, parser, "<property>", input);
                if (propertyResult.isSuccess()) {
                    pkg.addProperty(propertyResult.getResult());
                }
@@ -1807,8 +1805,9 @@ public class ParsingPackageUtils {
                continue;
            }
            if (parser.getName().equals("intent")) {
                ParseResult<ParsedIntentInfo> result = ParsedIntentInfoUtils.parseIntentInfo(null,
                        pkg, res, parser, true /*allowGlobs*/, true /*allowAutoVerify*/, input);
                ParseResult<ParsedIntentInfo> result = ParsedIntentInfoUtils.parseIntentInfo(
                        null /*className*/, pkg, res, parser, true /*allowGlobs*/,
                        true /*allowAutoVerify*/, input);
                if (result.isError()) {
                    return input.error(result);
                }
@@ -2077,7 +2076,7 @@ public class ParsingPackageUtils {
                        R.styleable.AndroidManifestApplication_process);
            }
            ParseResult<String> processNameResult = ComponentParseUtils.buildProcessName(
                    pkgName, null, pname, flags, mSeparateProcesses, input);
                    pkgName, null /*defProc*/, pname, flags, mSeparateProcesses, input);
            if (processNameResult.isError()) {
                return input.error(processNameResult);
            }
@@ -2146,7 +2145,8 @@ public class ParsingPackageUtils {
                case "receiver":
                    ParseResult<ParsedActivity> activityResult =
                            ParsedActivityUtils.parseActivityOrReceiver(mSeparateProcesses, pkg,
                                    res, parser, flags, sUseRoundIcon, input);
                                    res, parser, flags, sUseRoundIcon, null /*defaultSplitName*/,
                                    input);

                    if (activityResult.isSuccess()) {
                        ParsedActivity activity = activityResult.getResult();
@@ -2164,7 +2164,8 @@ public class ParsingPackageUtils {
                case "service":
                    ParseResult<ParsedService> serviceResult =
                            ParsedServiceUtils.parseService(mSeparateProcesses, pkg, res, parser,
                                    flags, sUseRoundIcon, input);
                                    flags, sUseRoundIcon, null /*defaultSplitName*/,
                                    input);
                    if (serviceResult.isSuccess()) {
                        ParsedService service = serviceResult.getResult();
                        hasServiceOrder |= (service.getOrder() != 0);
@@ -2176,7 +2177,8 @@ public class ParsingPackageUtils {
                case "provider":
                    ParseResult<ParsedProvider> providerResult =
                            ParsedProviderUtils.parseProvider(mSeparateProcesses, pkg, res, parser,
                                    flags, sUseRoundIcon, input);
                                    flags, sUseRoundIcon, null /*defaultSplitName*/,
                                    input);
                    if (providerResult.isSuccess()) {
                        pkg.addProvider(providerResult.getResult());
                    }
@@ -2185,7 +2187,8 @@ public class ParsingPackageUtils {
                    break;
                case "activity-alias":
                    activityResult = ParsedActivityUtils.parseActivityAlias(pkg, res,
                            parser, sUseRoundIcon, input);
                            parser, sUseRoundIcon, null /*defaultSplitName*/,
                            input);
                    if (activityResult.isSuccess()) {
                        ParsedActivity activity = activityResult.getResult();
                        hasActivityOrder |= (activity.getOrder() != 0);
@@ -2327,15 +2330,15 @@ public class ParsingPackageUtils {
                // note: application meta-data is stored off to the side, so it can
                // remain null in the primary copy (we like to avoid extra copies because
                // it can be large)
                final ParseResult<Property> metaDataResult = parseMetaData(pkg, null, res,
                        parser, "<meta-data>", input);
                final ParseResult<Property> metaDataResult = parseMetaData(pkg, null /*component*/,
                        res, parser, "<meta-data>", input);
                if (metaDataResult.isSuccess() && metaDataResult.getResult() != null) {
                    pkg.setMetaData(metaDataResult.getResult().toBundle(pkg.getMetaData()));
                }
                return metaDataResult;
            case "property":
                final ParseResult<Property> propertyResult = parseMetaData(pkg, null, res,
                        parser, "<property>", input);
                final ParseResult<Property> propertyResult = parseMetaData(pkg, null /*component*/,
                        res, parser, "<property>", input);
                if (propertyResult.isSuccess()) {
                    pkg.addProperty(propertyResult.getResult());
                }
+3 −3
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ import com.android.internal.util.DataClass;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;

/** @hide **/
public class ParsedActivity extends ParsedMainComponent {
public class ParsedActivity extends ParsedMainComponentImpl {

    private int theme;
    private int uiOptions;
@@ -117,7 +117,7 @@ public class ParsedActivity extends ParsedMainComponent {
        ParsedActivity activity = new ParsedActivity();
        activity.setPackageName(packageName);
        activity.theme = android.R.style.Theme_NoDisplay;
        activity.exported = true;
        activity.setExported(true);
        activity.setName(PackageManager.APP_DETAILS_ACTIVITY_CLASS_NAME);
        activity.setProcessName(processName);
        activity.uiOptions = uiOptions;
@@ -169,7 +169,7 @@ public class ParsedActivity extends ParsedMainComponent {
        alias.minAspectRatio = target.minAspectRatio;
        alias.supportsSizeChanges = target.supportsSizeChanges;
        alias.requestedVrComponent = target.requestedVrComponent;
        alias.directBootAware = target.directBootAware;
        alias.setDirectBootAware(target.isDirectBootAware());
        alias.setProcessName(target.getProcessName());
        return alias;

+19 −19
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static android.content.pm.parsing.ParsingUtils.NOT_SET;
import static android.content.pm.parsing.component.ComponentParseUtils.flag;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityTaskManager;
import android.content.Intent;
import android.content.pm.ActivityInfo;
@@ -79,7 +80,7 @@ public class ParsedActivityUtils {
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public static ParseResult<ParsedActivity> parseActivityOrReceiver(String[] separateProcesses,
            ParsingPackage pkg, Resources res, XmlResourceParser parser, int flags,
            boolean useRoundIcon, ParseInput input)
            boolean useRoundIcon, @Nullable String defaultSplitName, ParseInput input)
            throws XmlPullParserException, IOException {
        final String packageName = pkg.getPackageName();
        final ParsedActivity
@@ -90,9 +91,8 @@ public class ParsedActivityUtils {
        TypedArray sa = res.obtainAttributes(parser, R.styleable.AndroidManifestActivity);
        try {
            ParseResult<ParsedActivity> result =
                    ParsedMainComponentUtils.parseMainComponent(
                    activity, tag, separateProcesses,
                    pkg, sa, flags, useRoundIcon, input,
                    ParsedMainComponentUtils.parseMainComponent(activity, tag, separateProcesses,
                            pkg, sa, flags, useRoundIcon, defaultSplitName, input,
                            R.styleable.AndroidManifestActivity_banner,
                            R.styleable.AndroidManifestActivity_description,
                            R.styleable.AndroidManifestActivity_directBootAware,
@@ -227,8 +227,8 @@ public class ParsedActivityUtils {

    @NonNull
    public static ParseResult<ParsedActivity> parseActivityAlias(ParsingPackage pkg, Resources res,
            XmlResourceParser parser, boolean useRoundIcon, ParseInput input)
            throws XmlPullParserException, IOException {
            XmlResourceParser parser, boolean useRoundIcon, @Nullable String defaultSplitName,
            @NonNull ParseInput input) throws XmlPullParserException, IOException {
        TypedArray sa = res.obtainAttributes(parser, R.styleable.AndroidManifestActivityAlias);
        try {
            String targetActivity = sa.getNonConfigurationString(
@@ -267,7 +267,7 @@ public class ParsedActivityUtils {
            String tag = "<" + parser.getName() + ">";

            ParseResult<ParsedActivity> result = ParsedMainComponentUtils.parseMainComponent(
                    activity, tag, null, pkg, sa, 0, useRoundIcon, input,
                    activity, tag, null, pkg, sa, 0, useRoundIcon, defaultSplitName, input,
                    R.styleable.AndroidManifestActivityAlias_banner,
                    R.styleable.AndroidManifestActivityAlias_description,
                    NOT_SET /*directBootAwareAttr*/,
+9 −136
Original line number Diff line number Diff line
@@ -16,157 +16,30 @@

package android.content.pm.parsing.component;

import static android.content.pm.parsing.ParsingPackageImpl.sForInternedString;

import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;

import com.android.internal.util.DataClass;
import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;

/** @hide */
public class ParsedMainComponent extends ParsedComponentImpl {

    @Nullable
    @DataClass.ParcelWith(ForInternedString.class)
    protected String processName;
    protected boolean directBootAware;
    protected boolean enabled = true;
    protected boolean exported;
    protected int order;
public interface ParsedMainComponent extends ParsedComponent {

    @Nullable
    protected String splitName;
    @Nullable
    protected String[] attributionTags;

    public ParsedMainComponent() {
    }

    public ParsedMainComponent(ParsedMainComponent other) {
        super(other);
        this.processName = other.processName;
        this.directBootAware = other.directBootAware;
        this.enabled = other.enabled;
        this.exported = other.exported;
        this.order = other.order;
        this.splitName = other.splitName;
        this.attributionTags = other.attributionTags;
    }

    public ParsedMainComponent setOrder(int order) {
        this.order = order;
        return this;
    }

    public ParsedMainComponent setProcessName(String processName) {
        this.processName = TextUtils.safeIntern(processName);
        return this;
    }

    public ParsedMainComponent setEnabled(boolean enabled) {
        this.enabled = enabled;
        return this;
    }
    String[] getAttributionTags();

    /**
     * A main component's name is a class name. This makes code slightly more readable.
     */
    public String getClassName() {
        return getName();
    }
    String getClassName();

    @Override
    public int describeContents() {
        return 0;
    }
    boolean isDirectBootAware();

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        sForInternedString.parcel(this.processName, dest, flags);
        dest.writeBoolean(this.directBootAware);
        dest.writeBoolean(this.enabled);
        dest.writeBoolean(this.exported);
        dest.writeInt(this.order);
        dest.writeString(this.splitName);
        dest.writeString8Array(this.attributionTags);
    }
    boolean isEnabled();

    protected ParsedMainComponent(Parcel in) {
        super(in);
        this.processName = sForInternedString.unparcel(in);
        this.directBootAware = in.readBoolean();
        this.enabled = in.readBoolean();
        this.exported = in.readBoolean();
        this.order = in.readInt();
        this.splitName = in.readString();
        this.attributionTags = in.createString8Array();
    }
    boolean isExported();

    public static final Parcelable.Creator<ParsedMainComponent> CREATOR =
            new Parcelable.Creator<ParsedMainComponent>() {
                @Override
                public ParsedMainComponent createFromParcel(Parcel source) {
                    return new ParsedMainComponent(source);
                }

                @Override
                public ParsedMainComponent[] newArray(int size) {
                    return new ParsedMainComponent[size];
                }
            };
    int getOrder();

    @Nullable
    public String getProcessName() {
        return processName;
    }

    public boolean isDirectBootAware() {
        return directBootAware;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public boolean isExported() {
        return exported;
    }

    public int getOrder() {
        return order;
    }
    String getProcessName();

    @Nullable
    public String getSplitName() {
        return splitName;
    }

    @Nullable
    public String[] getAttributionTags() {
        return attributionTags;
    }

    public ParsedMainComponent setDirectBootAware(boolean value) {
        directBootAware = value;
        return this;
    }

    public ParsedMainComponent setExported(boolean value) {
        exported = value;
        return this;
    }

    public ParsedMainComponent setSplitName(@Nullable String value) {
        splitName = value;
        return this;
    }

    public ParsedMainComponent setAttributionTags(@Nullable String[] value) {
        attributionTags = value;
        return this;
    }
    String getSplitName();
}
+233 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading