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

Commit 01a047cd authored by Pawan Wagh's avatar Pawan Wagh Committed by Android (Google) Code Review
Browse files

Merge "Add AppInfo flags and APIs for 16Kb appcompat" into main

parents 64c4818c 5f3fa672
Loading
Loading
Loading
Loading
+27 −1
Original line number Diff line number Diff line
@@ -130,7 +130,6 @@ import android.util.Slog;
import android.util.Xml;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.Immutable;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.SomeArgs;
import com.android.internal.pm.RoSystemFeatures;
@@ -1020,6 +1019,33 @@ public class ApplicationPackageManager extends PackageManager {
        }
    }

    @Override
    public void setPageSizeAppCompatFlagsSettingsOverride(String packageName, boolean enabled) {
        try {
            mPM.setPageSizeAppCompatFlagsSettingsOverride(packageName, enabled);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    @Override
    public boolean isPageSizeCompatEnabled(String packageName) {
        try {
            return mPM.isPageSizeCompatEnabled(packageName);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    @Override
    public String getPageSizeCompatWarningMessage(String packageName) {
        try {
            return mPM.getPageSizeCompatWarningMessage(packageName);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    private static List<byte[]> encodeCertificates(List<Certificate> certs) throws
            CertificateEncodingException {
        if (certs == null) {
+104 −1
Original line number Diff line number Diff line
@@ -1449,6 +1449,97 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
        }
    }

    /**
     * Use this to report any errors during alignment checks
     *
     * @hide
     */
    public static final int PAGE_SIZE_APP_COMPAT_FLAG_ERROR = -1;

    /**
     * Initial value for mPageSizeAppCompatFlags
     *
     * @hide
     */
    public static final int PAGE_SIZE_APP_COMPAT_FLAG_UNDEFINED = 0;

    /**
     * if set, extract libs forcefully for 16 KB device and show warning dialog.
     *
     * @hide
     */
    public static final int PAGE_SIZE_APP_COMPAT_FLAG_UNCOMPRESSED_LIBS_NOT_ALIGNED = 1 << 1;

    /**
     * if set, load 4 KB aligned ELFs on 16 KB device in compat mode and show warning dialog.
     *
     * @hide
     */
    public static final int PAGE_SIZE_APP_COMPAT_FLAG_ELF_NOT_ALIGNED = 1 << 2;

    /**
     * Run in 16 KB app compat mode. This flag will be set explicitly through settings. If set, 16
     * KB app compat warning dialogs will still show up.
     *
     * @hide
     */
    public static final int PAGE_SIZE_APP_COMPAT_FLAG_SETTINGS_OVERRIDE_ENABLED = 1 << 3;

    /**
     * Disable 16 KB app compat mode through settings. It should only affect ELF loading as app is
     * already installed.
     *
     * @hide
     */
    public static final int PAGE_SIZE_APP_COMPAT_FLAG_SETTINGS_OVERRIDE_DISABLED = 1 << 4;

    /**
     * Run in 16 KB app compat mode. This flag will be set explicitly through manifest. If set, hide
     * the 16 KB app compat warning dialogs. This has the highest priority to enable compat mode.
     *
     * @hide
     */
    public static final int PAGE_SIZE_APP_COMPAT_FLAG_MANIFEST_OVERRIDE_ENABLED = 1 << 5;

    /**
     * Disable 16 KB app compat mode. This has the highest priority to disable compat mode.
     *
     * @hide
     */
    public static final int PAGE_SIZE_APP_COMPAT_FLAG_MANIFEST_OVERRIDE_DISABLED = 1 << 6;

    /**
     * Max value for page size app compat
     *
     * @hide
     */
    public static final int PAGE_SIZE_APP_COMPAT_FLAG_MAX = 1 << 7;

    /**
     * 16 KB app compat status for the app. App can have native shared libs which are not page
     * aligned, LOAD segments inside the shared libs have to be page aligned. Apps can specify the
     * override in manifest file as well.
     */
    private @PageSizeAppCompatFlags int mPageSizeAppCompatFlags =
            ApplicationInfo.PAGE_SIZE_APP_COMPAT_FLAG_UNDEFINED;

    /** {@hide} */
    @IntDef(
            prefix = {"PAGE_SIZE_APP_COMPAT_FLAG_"},
            value = {
                PAGE_SIZE_APP_COMPAT_FLAG_ERROR,
                PAGE_SIZE_APP_COMPAT_FLAG_UNDEFINED,
                PAGE_SIZE_APP_COMPAT_FLAG_UNCOMPRESSED_LIBS_NOT_ALIGNED,
                PAGE_SIZE_APP_COMPAT_FLAG_ELF_NOT_ALIGNED,
                PAGE_SIZE_APP_COMPAT_FLAG_MANIFEST_OVERRIDE_ENABLED,
                PAGE_SIZE_APP_COMPAT_FLAG_MANIFEST_OVERRIDE_DISABLED,
                PAGE_SIZE_APP_COMPAT_FLAG_SETTINGS_OVERRIDE_ENABLED,
                PAGE_SIZE_APP_COMPAT_FLAG_SETTINGS_OVERRIDE_DISABLED,
                PAGE_SIZE_APP_COMPAT_FLAG_MAX,
            })
    @Retention(RetentionPolicy.SOURCE)
    public @interface PageSizeAppCompatFlags {}

    /** @hide */
    public String classLoaderName;

@@ -1777,7 +1868,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
            pw.println(prefix + "enableOnBackInvokedCallback=" + isOnBackInvokedCallbackEnabled());
            pw.println(prefix + "allowCrossUidActivitySwitchFromBelow="
                    + allowCrossUidActivitySwitchFromBelow);

            pw.println(prefix + "mPageSizeAppCompatFlags=" + mPageSizeAppCompatFlags);
        }
        pw.println(prefix + "createTimestamp=" + createTimestamp);
        if (mKnownActivityEmbeddingCerts != null) {
@@ -1897,6 +1988,10 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
            }
            proto.write(ApplicationInfoProto.Detail.ALLOW_CROSS_UID_ACTIVITY_SWITCH_FROM_BELOW,
                    allowCrossUidActivitySwitchFromBelow);

            proto.write(ApplicationInfoProto.Detail.ENABLE_PAGE_SIZE_APP_COMPAT,
                        mPageSizeAppCompatFlags);

            proto.end(detailToken);
        }
        if (!ArrayUtils.isEmpty(mKnownActivityEmbeddingCerts)) {
@@ -2024,6 +2119,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
        localeConfigRes = orig.localeConfigRes;
        allowCrossUidActivitySwitchFromBelow = orig.allowCrossUidActivitySwitchFromBelow;
        createTimestamp = SystemClock.uptimeMillis();
        mPageSizeAppCompatFlags = orig.mPageSizeAppCompatFlags;
    }

    public String toString() {
@@ -2128,6 +2224,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
        }
        dest.writeInt(localeConfigRes);
        dest.writeInt(allowCrossUidActivitySwitchFromBelow ? 1 : 0);
        dest.writeInt(mPageSizeAppCompatFlags);

        sForStringSet.parcel(mKnownActivityEmbeddingCerts, dest, flags);
    }
@@ -2228,6 +2325,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
        }
        localeConfigRes = source.readInt();
        allowCrossUidActivitySwitchFromBelow = source.readInt() != 0;
        mPageSizeAppCompatFlags = source.readInt();

        mKnownActivityEmbeddingCerts = sForStringSet.unparcel(source);
        if (mKnownActivityEmbeddingCerts.isEmpty()) {
@@ -2765,6 +2863,11 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
        requestRawExternalStorageAccess = value;
    }

    /** {@hide} */
    public void setPageSizeAppCompatFlags(@PageSizeAppCompatFlags int value) {
        mPageSizeAppCompatFlags |= value;
    }

    /**
     * Replaces {@link #mAppClassNamesByProcess}. This takes over the ownership of the passed map.
     * Do not modify the argument at the callsite.
+6 −0
Original line number Diff line number Diff line
@@ -848,4 +848,10 @@ interface IPackageManager {
    int getAppMetadataSource(String packageName, int userId);

    ComponentName getDomainVerificationAgent(int userId);

    void setPageSizeAppCompatFlagsSettingsOverride(in String packageName, boolean enabled);

    boolean isPageSizeCompatEnabled(in String packageName);

    String getPageSizeCompatWarningMessage(in String packageName);
}
+35 −1
Original line number Diff line number Diff line
@@ -804,7 +804,6 @@ public abstract class PackageManager {
        @Deprecated
        private void __metadata() {}


        //@formatter:on
        // End of generated code

@@ -11007,6 +11006,41 @@ public abstract class PackageManager {
        throw new UnsupportedOperationException("setHarmfulAppWarning not implemented in subclass");
    }

    /**
     * Set the page compat mode override for given package
     *
     * @hide
     */
    @FlaggedApi(android.content.pm.Flags.FLAG_APP_COMPAT_OPTION_16KB)
    public void setPageSizeAppCompatFlagsSettingsOverride(@NonNull String packageName,
            boolean enabled) {
        throw new UnsupportedOperationException(
                "setPageSizeAppCompatFlagsSettingsOverride not implemented in subclass");
    }

    /**
     * Check whether page size app compat mode is enabled for given package
     *
     * @hide
     */
    @FlaggedApi(android.content.pm.Flags.FLAG_APP_COMPAT_OPTION_16KB)
    public boolean isPageSizeCompatEnabled(@NonNull String packageName) {
        throw new UnsupportedOperationException(
                "isPageSizeCompatEnabled not implemented in subclass");
    }

    /**
     * Get the page size app compat warning dialog to show at app launch time
     *
     * @hide
     */
    @Nullable
    @FlaggedApi(android.content.pm.Flags.FLAG_APP_COMPAT_OPTION_16KB)
    public String getPageSizeCompatWarningMessage(@NonNull String packageName) {
        throw new UnsupportedOperationException(
                "getPageSizeCompatWarningMessage not implemented in subclass");
    }

     /**
     * Returns the harmful app warning string for the given app, or null if there is none set.
     *
+19 −0
Original line number Diff line number Diff line
@@ -392,6 +392,10 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
    private int memtagMode;
    @ApplicationInfo.NativeHeapZeroInitialized
    private int nativeHeapZeroInitialized;

    @ApplicationInfo.PageSizeAppCompatFlags private int mPageSizeAppCompatFlags =
            ApplicationInfo.PAGE_SIZE_APP_COMPAT_FLAG_UNDEFINED;

    @Nullable
    @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class)
    private Boolean requestRawExternalStorageAccess;
@@ -1118,6 +1122,12 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
        return nativeHeapZeroInitialized;
    }

    @ApplicationInfo.PageSizeAppCompatFlags
    @Override
    public int getPageSizeAppCompatFlags() {
        return mPageSizeAppCompatFlags;
    }

    @Override
    public int getNetworkSecurityConfigResourceId() {
        return networkSecurityConfigRes;
@@ -2220,6 +2230,12 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
        return this;
    }

    @Override
    public PackageImpl setPageSizeAppCompatFlags(@ApplicationInfo.PageSizeAppCompatFlags int flag) {
        mPageSizeAppCompatFlags = flag;
        return this;
    }

    @Override
    public PackageImpl setNetworkSecurityConfigResourceId(int value) {
        networkSecurityConfigRes = value;
@@ -2703,6 +2719,7 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
            appInfo.setKnownActivityEmbeddingCerts(mKnownActivityEmbeddingCerts);
        }
        appInfo.allowCrossUidActivitySwitchFromBelow = mAllowCrossUidActivitySwitchFromBelow;
        appInfo.setPageSizeAppCompatFlags(mPageSizeAppCompatFlags);

        return appInfo;
    }
@@ -3305,6 +3322,7 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
        dest.writeInt(this.mIntentMatchingFlags);
        dest.writeIntArray(this.mAlternateLauncherIconResIds);
        dest.writeIntArray(this.mAlternateLauncherLabelResIds);
        dest.writeInt(this.mPageSizeAppCompatFlags);
    }

    private void writeFeatureFlagState(@NonNull Parcel dest) {
@@ -3499,6 +3517,7 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
        this.mIntentMatchingFlags = in.readInt();
        this.mAlternateLauncherIconResIds = in.createIntArray();
        this.mAlternateLauncherLabelResIds = in.createIntArray();
        this.mPageSizeAppCompatFlags = in.readInt();

        assignDerivedFields();
        assignDerivedFields2();
Loading