diff --git a/core/java/com/android/internal/content/NativeLibraryHelper.java b/core/java/com/android/internal/content/NativeLibraryHelper.java
index 6ad7fef..0c56c67 100644
--- a/core/java/com/android/internal/content/NativeLibraryHelper.java
+++ b/core/java/com/android/internal/content/NativeLibraryHelper.java
@@ -26,7 +26,6 @@
 import static android.system.OsConstants.S_IXOTH;
 
 import android.content.Context;
-import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.parsing.ApkLiteParseUtils;
 import android.content.pm.parsing.PackageLite;
@@ -178,13 +177,6 @@
     private native static int nativeCopyNativeBinaries(long handle, String sharedLibraryPath,
             String abiToCopy, boolean extractNativeLibs, boolean debuggable);
 
-    private static native int nativeCheckAlignment(
-            long handle,
-            String sharedLibraryPath,
-            String abi,
-            boolean extractNativeLibs,
-            boolean debuggable);
-
     private static long sumNativeBinaries(Handle handle, String abi) {
         long sum = 0;
         for (long apkHandle : handle.apkHandles) {
@@ -440,51 +432,6 @@
         }
     }
 
-    /**
-     * Checks alignment of APK and native libraries for 16KB device
-     *
-     * @param handle APK file to scan for native libraries
-     * @param libraryRoot directory for libraries
-     * @param abiOverride abiOverride for package
-     * @return {@link Modes from ApplicationInfo.PageSizeAppCompat} if successful or error code
-     *     which suggests undefined mode
-     */
-    @ApplicationInfo.PageSizeAppCompatFlags
-    public static int checkAlignmentForCompatMode(
-            Handle handle,
-            String libraryRoot,
-            boolean nativeLibraryRootRequiresIsa,
-            String abiOverride) {
-        // Keep the code below in sync with copyNativeBinariesForSupportedAbi
-        int abi = findSupportedAbi(handle, Build.SUPPORTED_64_BIT_ABIS);
-        if (abi < 0) {
-            return ApplicationInfo.PAGE_SIZE_APP_COMPAT_FLAG_ERROR;
-        }
-
-        final String supportedAbi = Build.SUPPORTED_64_BIT_ABIS[abi];
-        final String instructionSet = VMRuntime.getInstructionSet(supportedAbi);
-        String subDir = libraryRoot;
-        if (nativeLibraryRootRequiresIsa) {
-            subDir += "/" + instructionSet;
-        }
-
-        int mode = ApplicationInfo.PAGE_SIZE_APP_COMPAT_FLAG_UNDEFINED;
-        for (long apkHandle : handle.apkHandles) {
-            int res =
-                    nativeCheckAlignment(
-                            apkHandle,
-                            subDir,
-                            Build.SUPPORTED_64_BIT_ABIS[abi],
-                            handle.extractNativeLibs,
-                            handle.debuggable);
-            if (res == ApplicationInfo.PAGE_SIZE_APP_COMPAT_FLAG_ERROR) {
-                return res;
-            }
-            mode |= res;
-        }
-        return mode;
-    }
-
     public static long sumNativeBinariesWithOverride(Handle handle, String abiOverride)
             throws IOException {
         long sum = 0;
diff --git a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
index b2eeff3..7ad18b8 100644
--- a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
+++ b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
@@ -21,7 +21,6 @@
 #include <androidfw/ApkParsing.h>
 #include <androidfw/ZipFileRO.h>
 #include <androidfw/ZipUtils.h>
-#include <elf.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <inttypes.h>
@@ -39,7 +38,6 @@
 
 #include <memory>
 #include <string>
-#include <vector>
 
 #include "com_android_internal_content_FileSystemUtils.h"
 #include "core_jni_helpers.h"
@@ -62,12 +60,6 @@
     NO_NATIVE_LIBRARIES = -114
 };
 
-// These code should match with PageSizeAppCompatFlags inside ApplicationInfo.java
-constexpr int PAGE_SIZE_APP_COMPAT_FLAG_ERROR = -1;
-constexpr int PAGE_SIZE_APP_COMPAT_FLAG_UNDEFINED = 0;
-constexpr int PAGE_SIZE_APP_COMPAT_FLAG_UNCOMPRESSED_LIBS_NOT_ALIGNED = 1 << 1;
-constexpr int PAGE_SIZE_APP_COMPAT_FLAG_ELF_NOT_ALIGNED = 1 << 2;
-
 typedef install_status_t (*iterFunc)(JNIEnv*, void*, ZipFileRO*, ZipEntryRO, const char*);
 
 static bool
@@ -532,7 +524,11 @@
     static const size_t kPageSize = getpagesize();
 
     // App compat is only applicable on 16kb-page-size devices.
-    return kPageSize == 0x4000;
+    if (kPageSize != 0x4000) {
+        return false;
+    }
+
+    return android::base::GetBoolProperty("bionic.linker.16kb.app_compat.enabled", false);
 }
 
 static jint
@@ -630,166 +626,6 @@
     return reinterpret_cast<jlong>(zipFile);
 }
 
-static jint checkLoadSegmentAlignment(const char* fileName, off64_t offset) {
-    std::vector<Elf64_Phdr> programHeaders;
-    if (!getLoadSegmentPhdrs(fileName, offset, programHeaders)) {
-        ALOGE("Failed to read program headers from ELF file.");
-        return PAGE_SIZE_APP_COMPAT_FLAG_ERROR;
-    }
-
-    int mode = PAGE_SIZE_APP_COMPAT_FLAG_UNDEFINED;
-    for (auto programHeader : programHeaders) {
-        if (programHeader.p_type != PT_LOAD) {
-            continue;
-        }
-
-        // Set ELF alignment bit if 4 KB aligned LOAD segment is found
-        if (programHeader.p_align == 0x1000) {
-            ALOGI("Setting page size compat mode PAGE_SIZE_APP_COMPAT_FLAG_ELF_NOT_ALIGNED");
-            mode |= PAGE_SIZE_APP_COMPAT_FLAG_ELF_NOT_ALIGNED;
-            break;
-        }
-    }
-
-    return mode;
-}
-
-static jint checkExtractedLibAlignment(ZipFileRO* zipFile, ZipEntryRO zipEntry,
-                                       const char* fileName, const std::string nativeLibPath) {
-    // Build local file path
-    const size_t fileNameLen = strlen(fileName);
-    char localFileName[nativeLibPath.size() + fileNameLen + 2];
-
-    if (strlcpy(localFileName, nativeLibPath.c_str(), sizeof(localFileName)) !=
-        nativeLibPath.size()) {
-        ALOGE("Couldn't allocate local file name for library");
-        return PAGE_SIZE_APP_COMPAT_FLAG_ERROR;
-    }
-
-    *(localFileName + nativeLibPath.size()) = '/';
-
-    if (strlcpy(localFileName + nativeLibPath.size() + 1, fileName,
-                sizeof(localFileName) - nativeLibPath.size() - 1) != fileNameLen) {
-        ALOGE("Couldn't allocate local file name for library");
-        return PAGE_SIZE_APP_COMPAT_FLAG_ERROR;
-    }
-
-    struct statfs64 fsInfo;
-    int result = statfs64(localFileName, &fsInfo);
-    if (result < 0) {
-        ALOGE("Failed to stat file :%s", localFileName);
-        return PAGE_SIZE_APP_COMPAT_FLAG_ERROR;
-    }
-
-    return checkLoadSegmentAlignment(localFileName, 0);
-}
-
-static jint checkAlignment(JNIEnv* env, jstring javaNativeLibPath, jboolean extractNativeLibs,
-                           ZipFileRO* zipFile, ZipEntryRO zipEntry, const char* fileName) {
-    int mode = PAGE_SIZE_APP_COMPAT_FLAG_UNDEFINED;
-    // Need two separate install status for APK and ELF alignment
-    static const size_t kPageSize = getpagesize();
-    jint ret = INSTALL_SUCCEEDED;
-
-    ScopedUtfChars nativeLibPath(env, javaNativeLibPath);
-    if (extractNativeLibs) {
-        ALOGI("extractNativeLibs specified, checking for extracted lib %s", fileName);
-        return checkExtractedLibAlignment(zipFile, zipEntry, fileName, nativeLibPath.c_str());
-    }
-
-    uint16_t method;
-    off64_t offset;
-    if (!zipFile->getEntryInfo(zipEntry, &method, nullptr, nullptr, &offset, nullptr, nullptr,
-                               nullptr)) {
-        ALOGE("Couldn't read zip entry info from zipFile %s", zipFile->getZipFileName());
-        return PAGE_SIZE_APP_COMPAT_FLAG_ERROR;
-    }
-
-    // check if library is uncompressed and page-aligned
-    if (method != ZipFileRO::kCompressStored) {
-        ALOGE("Library '%s' is compressed - will not be able to open it directly from apk.\n",
-              fileName);
-        return PAGE_SIZE_APP_COMPAT_FLAG_ERROR;
-    }
-
-    if (offset % kPageSize != 0) {
-        ALOGW("Library '%s' is not PAGE(%zu)-aligned - will not be able to open it directly "
-              "from apk.\n",
-              fileName, kPageSize);
-        mode |= PAGE_SIZE_APP_COMPAT_FLAG_UNCOMPRESSED_LIBS_NOT_ALIGNED;
-        ALOGI("Setting page size compat mode "
-              "PAGE_SIZE_APP_COMPAT_FLAG_UNCOMPRESSED_LIBS_NOT_ALIGNED for %s",
-              zipFile->getZipFileName());
-    }
-
-    int loadMode = checkLoadSegmentAlignment(zipFile->getZipFileName(), offset);
-    if (loadMode == PAGE_SIZE_APP_COMPAT_FLAG_ERROR) {
-        return PAGE_SIZE_APP_COMPAT_FLAG_ERROR;
-    }
-    mode |= loadMode;
-    return mode;
-}
-
-// TODO(b/371049373): This function is copy of iterateOverNativeFiles with different way of handling
-// and combining return values for all ELF and APKs. Find a way to consolidate two functions.
-static jint com_android_internal_content_NativeLibraryHelper_checkApkAlignment(
-        JNIEnv* env, jclass clazz, jlong apkHandle, jstring javaNativeLibPath, jstring javaCpuAbi,
-        jboolean extractNativeLibs, jboolean debuggable) {
-    int mode = PAGE_SIZE_APP_COMPAT_FLAG_UNDEFINED;
-    ZipFileRO* zipFile = reinterpret_cast<ZipFileRO*>(apkHandle);
-    if (zipFile == nullptr) {
-        ALOGE("zipfile handle is null");
-        return PAGE_SIZE_APP_COMPAT_FLAG_ERROR;
-    }
-
-    auto result = NativeLibrariesIterator::create(zipFile, debuggable);
-    if (!result.ok()) {
-        ALOGE("Can't iterate over native libs for file:%s", zipFile->getZipFileName());
-        return PAGE_SIZE_APP_COMPAT_FLAG_ERROR;
-    }
-    std::unique_ptr<NativeLibrariesIterator> it(std::move(result.value()));
-
-    const ScopedUtfChars cpuAbi(env, javaCpuAbi);
-    if (cpuAbi.c_str() == nullptr) {
-        ALOGE("cpuAbi is nullptr");
-        // This would've thrown, so this return code isn't observable by Java.
-        return PAGE_SIZE_APP_COMPAT_FLAG_ERROR;
-    }
-
-    while (true) {
-        auto next = it->next();
-        if (!next.ok()) {
-            ALOGE("next iterator not found Error:%d", next.error());
-            return PAGE_SIZE_APP_COMPAT_FLAG_ERROR;
-        }
-        auto entry = next.value();
-        if (entry == nullptr) {
-            break;
-        }
-
-        const char* fileName = it->currentEntry();
-        const char* lastSlash = it->lastSlash();
-
-        // Check to make sure the CPU ABI of this file is one we support.
-        const char* cpuAbiOffset = fileName + APK_LIB_LEN;
-        const size_t cpuAbiRegionSize = lastSlash - cpuAbiOffset;
-
-        if (cpuAbi.size() == cpuAbiRegionSize &&
-            !strncmp(cpuAbiOffset, cpuAbi.c_str(), cpuAbiRegionSize)) {
-            int ret = checkAlignment(env, javaNativeLibPath, extractNativeLibs, zipFile, entry,
-                                     lastSlash + 1);
-            if (ret == PAGE_SIZE_APP_COMPAT_FLAG_ERROR) {
-                ALOGE("Alignment check returned for zipfile: %s, entry:%s",
-                      zipFile->getZipFileName(), lastSlash + 1);
-                return PAGE_SIZE_APP_COMPAT_FLAG_ERROR;
-            }
-            mode |= ret;
-        }
-    }
-
-    return mode;
-}
-
 static void
 com_android_internal_content_NativeLibraryHelper_close(JNIEnv *env, jclass, jlong apkHandle)
 {
@@ -797,23 +633,29 @@
 }
 
 static const JNINativeMethod gMethods[] = {
-        {"nativeOpenApk", "(Ljava/lang/String;)J",
-         (void*)com_android_internal_content_NativeLibraryHelper_openApk},
-        {"nativeOpenApkFd", "(Ljava/io/FileDescriptor;Ljava/lang/String;)J",
-         (void*)com_android_internal_content_NativeLibraryHelper_openApkFd},
-        {"nativeClose", "(J)V", (void*)com_android_internal_content_NativeLibraryHelper_close},
-        {"nativeCopyNativeBinaries", "(JLjava/lang/String;Ljava/lang/String;ZZ)I",
-         (void*)com_android_internal_content_NativeLibraryHelper_copyNativeBinaries},
-        {"nativeSumNativeBinaries", "(JLjava/lang/String;Z)J",
-         (void*)com_android_internal_content_NativeLibraryHelper_sumNativeBinaries},
-        {"nativeFindSupportedAbi", "(J[Ljava/lang/String;Z)I",
-         (void*)com_android_internal_content_NativeLibraryHelper_findSupportedAbi},
-        {"hasRenderscriptBitcode", "(J)I",
-         (void*)com_android_internal_content_NativeLibraryHelper_hasRenderscriptBitcode},
-        {"nativeCheckAlignment", "(JLjava/lang/String;Ljava/lang/String;ZZ)I",
-         (void*)com_android_internal_content_NativeLibraryHelper_checkApkAlignment},
+    {"nativeOpenApk",
+            "(Ljava/lang/String;)J",
+            (void *)com_android_internal_content_NativeLibraryHelper_openApk},
+    {"nativeOpenApkFd",
+            "(Ljava/io/FileDescriptor;Ljava/lang/String;)J",
+            (void *)com_android_internal_content_NativeLibraryHelper_openApkFd},
+    {"nativeClose",
+            "(J)V",
+            (void *)com_android_internal_content_NativeLibraryHelper_close},
+    {"nativeCopyNativeBinaries",
+            "(JLjava/lang/String;Ljava/lang/String;ZZ)I",
+            (void *)com_android_internal_content_NativeLibraryHelper_copyNativeBinaries},
+    {"nativeSumNativeBinaries",
+            "(JLjava/lang/String;Z)J",
+            (void *)com_android_internal_content_NativeLibraryHelper_sumNativeBinaries},
+    {"nativeFindSupportedAbi",
+            "(J[Ljava/lang/String;Z)I",
+            (void *)com_android_internal_content_NativeLibraryHelper_findSupportedAbi},
+    {"hasRenderscriptBitcode", "(J)I",
+            (void *)com_android_internal_content_NativeLibraryHelper_hasRenderscriptBitcode},
 };
 
+
 int register_com_android_internal_content_NativeLibraryHelper(JNIEnv *env)
 {
     return RegisterMethodsOrDie(env,
diff --git a/services/core/java/com/android/server/pm/PackageAbiHelper.java b/services/core/java/com/android/server/pm/PackageAbiHelper.java
index 0930299..c66a9e9 100644
--- a/services/core/java/com/android/server/pm/PackageAbiHelper.java
+++ b/services/core/java/com/android/server/pm/PackageAbiHelper.java
@@ -18,7 +18,6 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.content.pm.ApplicationInfo;
 import android.util.ArraySet;
 import android.util.Pair;
 
@@ -29,6 +28,8 @@
 
 import java.io.File;
 
+
+
 // TODO: Move to .parsing sub-package
 @VisibleForTesting
 public interface PackageAbiHelper {
@@ -78,23 +79,6 @@
             AndroidPackage scannedPackage);
 
     /**
-     * Checks alignment of APK and native libraries for 16KB device
-     *
-     * @param pkg AndroidPackage for which alignment check is being done
-     * @param libraryRoot directory for libraries
-     * @param nativeLibraryRootRequiresIsa use isa
-     * @param cpuAbiOverride ABI override mentioned in package
-     * @return {ApplicationInfo.PageSizeAppCompat} if successful or error code
-     *     which suggests undefined mode
-     */
-    @ApplicationInfo.PageSizeAppCompatFlags
-    int checkPackageAlignment(
-            AndroidPackage pkg,
-            String libraryRoot,
-            boolean nativeLibraryRootRequiresIsa,
-            String cpuAbiOverride);
-
-    /**
      * The native library paths and related properties that should be set on a
      * {@link ParsedPackage}.
      */
diff --git a/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java b/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java
index 0f245b6..9db4d33 100644
--- a/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java
+++ b/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java
@@ -625,20 +625,4 @@
         }
         return adjustedAbi;
     }
-
-    @Override
-    public int checkPackageAlignment(
-            AndroidPackage pkg,
-            String libraryRoot,
-            boolean nativeLibraryRootRequiresIsa,
-            String abiOverride) {
-        NativeLibraryHelper.Handle handle = null;
-        try {
-            handle = AndroidPackageUtils.createNativeLibraryHandle(pkg);
-            return NativeLibraryHelper.checkAlignmentForCompatMode(
-                            handle, libraryRoot, nativeLibraryRootRequiresIsa, abiOverride);
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
 }
diff --git a/services/core/java/com/android/server/pm/ScanPackageUtils.java b/services/core/java/com/android/server/pm/ScanPackageUtils.java
index 2665196..0802e9e 100644
--- a/services/core/java/com/android/server/pm/ScanPackageUtils.java
+++ b/services/core/java/com/android/server/pm/ScanPackageUtils.java
@@ -52,7 +52,6 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.pm.ApplicationInfo;
-import android.content.pm.Flags;
 import android.content.pm.PackageManager;
 import android.content.pm.SharedLibraryInfo;
 import android.content.pm.SigningDetails;
@@ -64,8 +63,6 @@
 import android.os.SystemProperties;
 import android.os.Trace;
 import android.os.UserHandle;
-import android.system.Os;
-import android.system.OsConstants;
 import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.ArraySet;
@@ -108,9 +105,6 @@
  * Helper class that handles package scanning logic
  */
 final class ScanPackageUtils {
-
-    public static final int PAGE_SIZE_16KB = 16384;
-
     /**
      * Just scans the package without any side effects.
      *
@@ -424,32 +418,6 @@
                     + " abiOverride=" + pkgSetting.getCpuAbiOverride());
         }
 
-        boolean is16KbDevice = Os.sysconf(OsConstants._SC_PAGESIZE) == PAGE_SIZE_16KB;
-        if (Flags.appCompatOption16kb() && is16KbDevice) {
-            // Alignment checks are used decide whether this app should run in compat mode when
-            // nothing was specified in manifest. Manifest should always take precedence over
-            // something decided by platform.
-            if (parsedPackage.getPageSizeAppCompatFlags()
-                    > ApplicationInfo.PAGE_SIZE_APP_COMPAT_FLAG_UNDEFINED) {
-                pkgSetting.setPageSizeAppCompatFlags(parsedPackage.getPageSizeAppCompatFlags());
-            } else {
-                // 16 KB is only support for 64 bit ABIs and for apps which are being installed
-                // Check alignment. System, Apex and Platform packages should be page-agnostic now
-                if ((Build.SUPPORTED_64_BIT_ABIS.length > 0)
-                        && !isSystemApp
-                        && !isApex
-                        && !isPlatformPackage) {
-                    int mode =
-                            packageAbiHelper.checkPackageAlignment(
-                                    parsedPackage,
-                                    pkgSetting.getLegacyNativeLibraryPath(),
-                                    parsedPackage.isNativeLibraryRootRequiresIsa(),
-                                    pkgSetting.getCpuAbiOverride());
-                    pkgSetting.setPageSizeAppCompatFlags(mode);
-                }
-            }
-        }
-
         if ((scanFlags & SCAN_BOOTING) == 0 && oldSharedUserSetting != null) {
             // We don't do this here during boot because we can do it all
             // at once after scanning all existing packages.
