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

Commit 5f3fa672 authored by Pawan Wagh's avatar Pawan Wagh
Browse files

Add AppInfo flags and APIs for 16Kb appcompat

- Adding flags to save alignment info and override info for
16kB app compat mode.
- Parse manifest option
- APIs to set appcompat mode. Clients will be packageManger and settings

Flag: android.content.pm.app_compat_option_16kb
Test: atest -c FileSystemUtilsTests
Test: Install 4KB aligned app and see the dialog on 16 KB device
Bug: 363338964

Change-Id: I742d70493d7a5e48eeee8eb4445a7f3d0f62cf64
parent feb3f74a
Loading
Loading
Loading
Loading
+27 −1
Original line number Original line Diff line number Diff line
@@ -130,7 +130,6 @@ import android.util.Slog;
import android.util.Xml;
import android.util.Xml;


import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.Immutable;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.SomeArgs;
import com.android.internal.os.SomeArgs;
import com.android.internal.pm.RoSystemFeatures;
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
    private static List<byte[]> encodeCertificates(List<Certificate> certs) throws
            CertificateEncodingException {
            CertificateEncodingException {
        if (certs == null) {
        if (certs == null) {
+104 −1
Original line number Original line 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 */
    /** @hide */
    public String classLoaderName;
    public String classLoaderName;


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

            pw.println(prefix + "mPageSizeAppCompatFlags=" + mPageSizeAppCompatFlags);
        }
        }
        pw.println(prefix + "createTimestamp=" + createTimestamp);
        pw.println(prefix + "createTimestamp=" + createTimestamp);
        if (mKnownActivityEmbeddingCerts != null) {
        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,
            proto.write(ApplicationInfoProto.Detail.ALLOW_CROSS_UID_ACTIVITY_SWITCH_FROM_BELOW,
                    allowCrossUidActivitySwitchFromBelow);
                    allowCrossUidActivitySwitchFromBelow);

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

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


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


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


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


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

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


    ComponentName getDomainVerificationAgent(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 Original line Diff line number Diff line
@@ -804,7 +804,6 @@ public abstract class PackageManager {
        @Deprecated
        @Deprecated
        private void __metadata() {}
        private void __metadata() {}



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


@@ -10986,6 +10985,41 @@ public abstract class PackageManager {
        throw new UnsupportedOperationException("setHarmfulAppWarning not implemented in subclass");
        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.
     * Returns the harmful app warning string for the given app, or null if there is none set.
     *
     *
+19 −0
Original line number Original line Diff line number Diff line
@@ -392,6 +392,10 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
    private int memtagMode;
    private int memtagMode;
    @ApplicationInfo.NativeHeapZeroInitialized
    @ApplicationInfo.NativeHeapZeroInitialized
    private int nativeHeapZeroInitialized;
    private int nativeHeapZeroInitialized;

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

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


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

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


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

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


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


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


        assignDerivedFields();
        assignDerivedFields();
        assignDerivedFields2();
        assignDerivedFields2();
Loading