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

Commit 9062d5d2 authored by Essence Cain's avatar Essence Cain
Browse files

Introduce a new APK attribute: emergencyInstaller

Allow app stores in the system image to designate in their manifest the package name of another system app which can serve as an “emergency installer”.

See more details here: go/android-firebrick-emergency-installer-1pager

Bug: 321080601
Test: m
Change-Id: Ibaac0c7dc2d038e9d08f3543d54ea94178387d15
parent 1bbf379b
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -144,6 +144,11 @@ public class ApkLite {
     */
    private final boolean mUpdatableSystem;

    /**
     * Name of the emergency installer for the designated system app.
     */
    private final @Nullable String mEmergencyInstaller;

    /**
     * Archival install info.
     */
@@ -159,7 +164,8 @@ public class ApkLite {
            String requiredSystemPropertyName, String requiredSystemPropertyValue,
            int minSdkVersion, int targetSdkVersion, int rollbackDataPolicy,
            Set<String> requiredSplitTypes, Set<String> splitTypes,
            boolean hasDeviceAdminReceiver, boolean isSdkLibrary, boolean updatableSystem) {
            boolean hasDeviceAdminReceiver, boolean isSdkLibrary, boolean updatableSystem,
            String emergencyInstaller) {
        mPath = path;
        mPackageName = packageName;
        mSplitName = splitName;
@@ -194,6 +200,7 @@ public class ApkLite {
        mHasDeviceAdminReceiver = hasDeviceAdminReceiver;
        mIsSdkLibrary = isSdkLibrary;
        mUpdatableSystem = updatableSystem;
        mEmergencyInstaller = emergencyInstaller;
        mArchivedPackage = null;
    }

@@ -232,6 +239,7 @@ public class ApkLite {
        mHasDeviceAdminReceiver = false;
        mIsSdkLibrary = false;
        mUpdatableSystem = true;
        mEmergencyInstaller = null;
        mArchivedPackage = archivedPackage;
    }

@@ -549,6 +557,14 @@ public class ApkLite {
        return mUpdatableSystem;
    }

    /**
     * Name of the emergency installer for the designated system app.
     */
    @DataClass.Generated.Member
    public @Nullable String getEmergencyInstaller() {
        return mEmergencyInstaller;
    }

    /**
     * Archival install info.
     */
@@ -558,10 +574,10 @@ public class ApkLite {
    }

    @DataClass.Generated(
            time = 1699587291575L,
            time = 1706896661616L,
            codegenVersion = "1.0.23",
            sourceFile = "frameworks/base/core/java/android/content/pm/parsing/ApkLite.java",
            inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.Nullable java.lang.String mUsesSplitName\nprivate final @android.annotation.Nullable java.lang.String mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mSplitTypes\nprivate final  int mVersionCodeMajor\nprivate final  int mVersionCode\nprivate final  int mRevisionCode\nprivate final  int mInstallLocation\nprivate final  int mMinSdkVersion\nprivate final  int mTargetSdkVersion\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final  boolean mFeatureSplit\nprivate final  boolean mIsolatedSplits\nprivate final  boolean mSplitRequired\nprivate final  boolean mCoreApp\nprivate final  boolean mDebuggable\nprivate final  boolean mProfileableByShell\nprivate final  boolean mMultiArch\nprivate final  boolean mUse32bitAbi\nprivate final  boolean mExtractNativeLibs\nprivate final  boolean mUseEmbeddedDex\nprivate final @android.annotation.Nullable java.lang.String mTargetPackageName\nprivate final  boolean mOverlayIsStatic\nprivate final  int mOverlayPriority\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyName\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyValue\nprivate final  int mRollbackDataPolicy\nprivate final  boolean mHasDeviceAdminReceiver\nprivate final  boolean mIsSdkLibrary\nprivate final  boolean mUpdatableSystem\nprivate final @android.annotation.Nullable android.content.pm.ArchivedPackageParcel mArchivedPackage\npublic  long getLongVersionCode()\nprivate  boolean hasAnyRequiredSplitTypes()\nclass ApkLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)")
            inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.Nullable java.lang.String mUsesSplitName\nprivate final @android.annotation.Nullable java.lang.String mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mSplitTypes\nprivate final  int mVersionCodeMajor\nprivate final  int mVersionCode\nprivate final  int mRevisionCode\nprivate final  int mInstallLocation\nprivate final  int mMinSdkVersion\nprivate final  int mTargetSdkVersion\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final  boolean mFeatureSplit\nprivate final  boolean mIsolatedSplits\nprivate final  boolean mSplitRequired\nprivate final  boolean mCoreApp\nprivate final  boolean mDebuggable\nprivate final  boolean mProfileableByShell\nprivate final  boolean mMultiArch\nprivate final  boolean mUse32bitAbi\nprivate final  boolean mExtractNativeLibs\nprivate final  boolean mUseEmbeddedDex\nprivate final @android.annotation.Nullable java.lang.String mTargetPackageName\nprivate final  boolean mOverlayIsStatic\nprivate final  int mOverlayPriority\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyName\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyValue\nprivate final  int mRollbackDataPolicy\nprivate final  boolean mHasDeviceAdminReceiver\nprivate final  boolean mIsSdkLibrary\nprivate final  boolean mUpdatableSystem\nprivate final @android.annotation.Nullable java.lang.String mEmergencyInstaller\nprivate final @android.annotation.Nullable android.content.pm.ArchivedPackageParcel mArchivedPackage\npublic  long getLongVersionCode()\nprivate  boolean hasAnyRequiredSplitTypes()\nclass ApkLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)")
    @Deprecated
    private void __metadata() {}

+2 −1
Original line number Diff line number Diff line
@@ -435,6 +435,7 @@ public class ApkLiteParseUtils {
        boolean isSplitRequired = parser.getAttributeBooleanValue(ANDROID_RES_NAMESPACE,
                "isSplitRequired", false);
        String configForSplit = parser.getAttributeValue(null, "configForSplit");
        String emergencyInstaller = parser.getAttributeValue(null, "emergencyInstaller");

        int targetSdkVersion = DEFAULT_TARGET_SDK_VERSION;
        int minSdkVersion = DEFAULT_MIN_SDK_VERSION;
@@ -644,7 +645,7 @@ public class ApkLiteParseUtils {
                        overlayIsStatic, overlayPriority, requiredSystemPropertyName,
                        requiredSystemPropertyValue, minSdkVersion, targetSdkVersion,
                        rollbackDataPolicy, requiredSplitTypes.first, requiredSplitTypes.second,
                        hasDeviceAdminReceiver, isSdkLibrary, updatableSystem));
                        hasDeviceAdminReceiver, isSdkLibrary, updatableSystem, emergencyInstaller));
    }

    private static boolean isDeviceAdminReceiver(
+17 −0
Original line number Diff line number Diff line
@@ -227,6 +227,9 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
    private String requiredAccountType;
    @Nullable
    @DataClass.ParcelWith(ForInternedString.class)
    private String mEmergencyInstaller;
    @Nullable
    @DataClass.ParcelWith(ForInternedString.class)
    private String overlayTarget;
    @Nullable
    @DataClass.ParcelWith(ForInternedString.class)
@@ -1275,6 +1278,12 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
        return restrictedAccountType;
    }

    @Nullable
    @Override
    public String getEmergencyInstaller() {
        return mEmergencyInstaller;
    }

    @Override
    public int getRoundIconResourceId() {
        return roundIconRes;
@@ -2335,6 +2344,12 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
        return this;
    }

    @Override
    public PackageImpl setEmergencyInstaller(@Nullable String emergencyInstaller) {
        this.mEmergencyInstaller = emergencyInstaller;
        return this;
    }

    @Override
    public PackageImpl setRoundIconResourceId(int value) {
        roundIconRes = value;
@@ -3105,6 +3120,7 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
        dest.writeString(this.mBaseApkPath);
        dest.writeString(this.restrictedAccountType);
        dest.writeString(this.requiredAccountType);
        dest.writeString(this.mEmergencyInstaller);
        sForInternedString.parcel(this.overlayTarget, dest, flags);
        dest.writeString(this.overlayTargetOverlayableName);
        dest.writeString(this.overlayCategory);
@@ -3255,6 +3271,7 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
        this.mBaseApkPath = in.readString();
        this.restrictedAccountType = in.readString();
        this.requiredAccountType = in.readString();
        this.mEmergencyInstaller = in.readString();
        this.overlayTarget = sForInternedString.unparcel(in);
        this.overlayTargetOverlayableName = in.readString();
        this.overlayCategory = in.readString();
+5 −0
Original line number Diff line number Diff line
@@ -75,6 +75,11 @@ public interface ParsedPackage extends AndroidPackage {

    ParsedPackage setUpdatableSystem(boolean value);

    /**
     * Sets a system app that is allowed to update another system app
     */
    ParsedPackage setEmergencyInstaller(String emergencyInstaller);

    ParsedPackage markNotActivitiesAsNotExportedIfSingleUser();

    ParsedPackage setOdm(boolean odm);
+5 −0
Original line number Diff line number Diff line
@@ -347,6 +347,11 @@ public interface ParsingPackage {

    ParsingPackage setUpdatableSystem(boolean value);

    /**
     * Sets a system app that is allowed to update another system app
     */
    ParsingPackage setEmergencyInstaller(String emergencyInstaller);

    ParsingPackage setLargeScreensSupported(int supportsLargeScreens);

    ParsingPackage setNormalScreensSupported(int supportsNormalScreens);
Loading