androidfw: Squash of declare and load omnirom sdk resource package w/ id

Author: Adnan Begovic <adnan@cyngn.com>
Date:   Mon Jul 6 20:06:36 2015 -0700
    androidfw: Declare and load cmsdk resource package w/ id.
    Change-Id: I63b8f3e4a938896dd21999c5b4470573a1da2e52

Author: Steve Kondik <steve@cyngn.com>
Date:   Wed Aug 31 01:32:13 2016 -0700
    androidfw: Fix CMSDK resource handling on N
     * Consider the CMSDK package identifier in the new dynamic resource
       conditions.
    Change-Id: I3e84d12ac86a6eb1d3407aa64234f80a0e945e70

Author: Sam Mortimer <sam@mortimer.me.uk>
Date:   Wed Aug 15 21:58:12 2018 -0700
    fw/b AssetManager: Load lineage resources in constructor
    *) AssetManager was refactored here:
    https://android.googlesource.com/platform/frameworks/base/+/bebfcc46a249a70af04bc18490a897888a142fb8
    *) Lineage resources are no longer accessible as a result.  For example, LineageParts crashes from:
       08-15 16:22:04.850  2599  2599 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity
       ComponentInfo{org.lineageos.lineageparts/org.lineageos.lineageparts.PartsActivity}:
       android.content.res.Resources$NotFoundException: Resource ID #0x3f080008
    *) When framework-res.apk is loaded, load org.linageos.platform-res.apk too.  Fixes resource loading.
    Change-Id: I8e3408a1031c0b8e000d78ab59cbcabc860d8b57

Copied system resources apk loading order from lineage-15.1 commit:

Author: Ethan Chen <intervigil@gmail.com>
Date:   Sun Oct 15 23:09:36 2017 -0700
    androidfw: Load SDK resources after initial system resources
    * The existing AssetManager logic assumes a single system resource,
      as the RRO resource codepath expects to have the system AssetManager
      discover RRO overlay resources while the system resource is being
      added to the AssetManager's mAssetPaths. Having multiple system
      resources already present in the AssetManager's mAssetPaths breaks
      the expected ordering between the system AssetManager and the
      non-system AssetManager, as non-system AssetManagers will not need
      to discover system RRO overlay resources, and already have them
      in the it's mAssetPaths immediately following the system resource
      it is supposed to overlay.
    * Resolve this issue by loading the SDK resources after the system
      RRO overlay resource is loaded to guarantee consistent ordering
      between the system AssetManager and non-system AssetManager instances.
    Change-Id: I274cf9100fbb6215b840617993a7a6d9b7ff336d

Author: Luca Stefani <luca.stefani.ge1@gmail.com>
Date:   Fri Oct 8 16:40:09 2021 +0200
    AssetManager: Mark lineage res as system
    Another case of "How did it ever work before?"
    Change-Id: I06e800170c51afd1e5575cc0b3b381e5fbceee3d

Change-Id: I383ff3eb35cd8d94bd1aebc5b811948d63da621d

Add omnirom sdk resource APK to Zygote FD whitelist

Change-Id: Ica91b23e467db61f142b183316db4afee2a2a283

services: Keep sdk classes

Change-Id: Ic22d58a8c791905e5943f9ed8bc0322f0187ea65

androidfw: Add OmniRom res to default assets

Change-Id: I815a78e645a2eaf65667fea3789d0a68149ee075

idmap2: Cache OmniRom resources

Change-Id: I212e029be783657fec738031db44fdf2aa5f3cdd

Allow omnirom resources package to be overlayed by RRO packages

Change-Id: I152ef9a87b16338e14af508e0f1f42830688c5ea
diff --git a/Android.bp b/Android.bp
index fb1fa3b..e731096 100644
--- a/Android.bp
+++ b/Android.bp
@@ -150,6 +150,7 @@
         ":framework-javastream-protos",
         ":statslog-framework-java-gen", // FrameworkStatsLog.java
         ":audio_policy_configuration_V7_0",
+        "//packages/apps/OmniLib:omnirom-internal",
     ],
 }
 
@@ -288,6 +289,7 @@
         ":framework-non-updatable-sources",
         "core/java/**/*.logtags",
         ":apex-info-list",
+        "//packages/apps/OmniLib:omnirom-internal",
     ],
     aidl: {
         generate_get_transaction_name: true,
diff --git a/cmds/idmap2/idmap2d/Idmap2Service.cpp b/cmds/idmap2/idmap2d/Idmap2Service.cpp
index f264125..769b3bf 100644
--- a/cmds/idmap2/idmap2d/Idmap2Service.cpp
+++ b/cmds/idmap2/idmap2d/Idmap2Service.cpp
@@ -60,6 +60,7 @@
 namespace {
 
 constexpr std::string_view kFrameworkPath = "/system/framework/framework-res.apk";
+constexpr std::string_view kOmniRomPath = "/system/framework/omnirom-res.apk";
 
 Status ok() {
   return Status::ok();
@@ -208,9 +209,10 @@
 idmap2::Result<Idmap2Service::TargetResourceContainerPtr> Idmap2Service::GetTargetContainer(
     const std::string& target_path) {
   const bool is_framework = target_path == kFrameworkPath;
+  const bool is_OmniRomPath = target_path == kOmniRomPath;
   bool use_cache;
   struct stat st = {};
-  if (is_framework || !::stat(target_path.c_str(), &st)) {
+  if (is_framework || is_OmniRomPath || !::stat(target_path.c_str(), &st)) {
     use_cache = true;
   } else {
     LOG(WARNING) << "failed to stat target path '" << target_path << "' for the cache";
@@ -221,7 +223,7 @@
     std::lock_guard lock(container_cache_mutex_);
     if (auto cache_it = container_cache_.find(target_path); cache_it != container_cache_.end()) {
       const auto& item = cache_it->second;
-      if (is_framework ||
+      if (is_framework || is_OmniRomPath ||
         (item.dev == st.st_dev && item.inode == st.st_ino && item.size == st.st_size
           && item.mtime.tv_sec == st.st_mtim.tv_sec && item.mtime.tv_nsec == st.st_mtim.tv_nsec)) {
         return {item.apk.get()};
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 1df8f63..651c9dc 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -1457,7 +1457,7 @@
                         false, false);
                 for (int i = 0, n = packageIdentifiers.size(); i < n; i++) {
                     final int id = packageIdentifiers.keyAt(i);
-                    if (id == 0x01 || id == 0x7f) {
+                    if (id == 0x01 || id == 0x7f || id == 0x3f) {
                         continue;
                     }
 
diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java
index fd9361d..8d27289 100644
--- a/core/java/android/content/res/AssetManager.java
+++ b/core/java/android/content/res/AssetManager.java
@@ -71,6 +71,7 @@
     private static final boolean DEBUG_REFS = false;
 
     private static final String FRAMEWORK_APK_PATH = "/system/framework/framework-res.apk";
+    private static final String OMNIROM_APK_PATH = "/system/framework/omnirom-res.apk";
 
     private static final Object sSync = new Object();
 
@@ -265,6 +266,7 @@
             for (String idmapPath : systemIdmapPaths) {
                 apkAssets.add(ApkAssets.loadOverlayFromPath(idmapPath, ApkAssets.PROPERTY_SYSTEM));
             }
+            apkAssets.add(ApkAssets.loadFromPath(OMNIROM_APK_PATH, ApkAssets.PROPERTY_SYSTEM));
 
             sSystemApkAssetsSet = new ArraySet<>(apkAssets);
             sSystemApkAssets = apkAssets.toArray(new ApkAssets[0]);
diff --git a/core/java/com/android/internal/content/om/OverlayConfig.java b/core/java/com/android/internal/content/om/OverlayConfig.java
index 07e178c..6c0a69a 100644
--- a/core/java/com/android/internal/content/om/OverlayConfig.java
+++ b/core/java/com/android/internal/content/om/OverlayConfig.java
@@ -488,13 +488,14 @@
      * precedence.
      */
     @VisibleForTesting
-    public ArrayList<IdmapInvocation> getImmutableFrameworkOverlayIdmapInvocations() {
+    public ArrayList<IdmapInvocation> getImmutableFrameworkOverlayIdmapInvocations(
+            String packageName) {
         final ArrayList<IdmapInvocation> idmapInvocations = new ArrayList<>();
         final ArrayList<Configuration> sortedConfigs = getSortedOverlays();
         for (int i = 0, n = sortedConfigs.size(); i < n; i++) {
             final Configuration overlay = sortedConfigs.get(i);
             if (overlay.parsedConfig.mutable || !overlay.parsedConfig.enabled
-                    || !"android".equals(overlay.parsedConfig.parsedInfo.targetPackageName)) {
+                    || !packageName.equals(overlay.parsedConfig.parsedInfo.targetPackageName)) {
                 continue;
             }
 
@@ -533,26 +534,32 @@
      */
     @NonNull
     public String[] createImmutableFrameworkIdmapsInZygote() {
-        final String targetPath = "/system/framework/framework-res.apk";
         final ArrayList<String> idmapPaths = new ArrayList<>();
-        final ArrayList<IdmapInvocation> idmapInvocations =
-                getImmutableFrameworkOverlayIdmapInvocations();
 
-        for (int i = 0, n = idmapInvocations.size(); i < n; i++) {
-            final IdmapInvocation invocation = idmapInvocations.get(i);
-            final String[] idmaps = createIdmap(targetPath,
-                    invocation.overlayPaths.toArray(new String[0]),
-                    new String[]{OverlayConfigParser.OverlayPartition.POLICY_PUBLIC,
-                            invocation.policy},
-                    invocation.enforceOverlayable);
+        for (Map.Entry<String, String> target : new HashMap<String, String>() {{
+                put("/system/framework/framework-res.apk", "android");
+                put("/system/framework/omnirom-res.apk", "omnirom.platform");
+        }}.entrySet()) {
+            final String targetPath = target.getKey();
+            final String targetPackageName = target.getValue();
+            final ArrayList<IdmapInvocation> idmapInvocations =
+                    getImmutableFrameworkOverlayIdmapInvocations(targetPackageName);
+            for (int i = 0, n = idmapInvocations.size(); i < n; i++) {
+                final IdmapInvocation invocation = idmapInvocations.get(i);
+                final String[] idmaps = createIdmap(targetPath,
+                        invocation.overlayPaths.toArray(new String[0]),
+                        new String[]{OverlayConfigParser.OverlayPartition.POLICY_PUBLIC,
+                                invocation.policy},
+                        invocation.enforceOverlayable);
 
-            if (idmaps == null) {
-                Log.w(TAG, "'idmap2 create-multiple' failed: no mutable=\"false\" overlays"
-                        + " targeting \"android\" will be loaded");
-                return new String[0];
+                if (idmaps == null) {
+                    Log.w(TAG, "'idmap2 create-multiple' failed: no mutable=\"false\" overlays"
+                            + " targeting \"android\" will be loaded");
+                    return new String[0];
+                }
+
+                idmapPaths.addAll(Arrays.asList(idmaps));
             }
-
-            idmapPaths.addAll(Arrays.asList(idmaps));
         }
 
         return idmapPaths.toArray(new String[0]);
diff --git a/core/jni/fd_utils.cpp b/core/jni/fd_utils.cpp
index 0eb7c4a..5a21291 100644
--- a/core/jni/fd_utils.cpp
+++ b/core/jni/fd_utils.cpp
@@ -44,6 +44,7 @@
         "/sys/kernel/debug/tracing/trace_marker",
         "/sys/kernel/tracing/trace_marker",
         "/system/framework/framework-res.apk",
+        "/system/framework/omnirom-res.apk",
         "/dev/urandom",
         "/dev/ion",
         "/dev/dri/renderD129", // Fixes b/31172436
diff --git a/core/tests/coretests/src/com/android/internal/content/res/OverlayConfigTest.java b/core/tests/coretests/src/com/android/internal/content/res/OverlayConfigTest.java
index a0e9947..6b805d1 100644
--- a/core/tests/coretests/src/com/android/internal/content/res/OverlayConfigTest.java
+++ b/core/tests/coretests/src/com/android/internal/content/res/OverlayConfigTest.java
@@ -471,7 +471,7 @@
         final OverlayConfig overlayConfig = createConfigImpl();
         if (mScannerRule.getIteration() == OverlayConfigIterationRule.Iteration.ZYGOTE) {
             final ArrayList<IdmapInvocation> idmapInvocations =
-                    overlayConfig.getImmutableFrameworkOverlayIdmapInvocations();
+                    overlayConfig.getImmutableFrameworkOverlayIdmapInvocations("android");
             assertEquals(2, idmapInvocations.size());
 
             final IdmapInvocation i0 = idmapInvocations.get(0);
@@ -508,7 +508,7 @@
 
         if (mScannerRule.getIteration() == OverlayConfigIterationRule.Iteration.ZYGOTE) {
             final ArrayList<IdmapInvocation> idmapInvocations =
-                    overlayConfig.getImmutableFrameworkOverlayIdmapInvocations();
+                    overlayConfig.getImmutableFrameworkOverlayIdmapInvocations("android");
             assertEquals(3, idmapInvocations.size());
 
             final IdmapInvocation i0 = idmapInvocations.get(0);
diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp
index e618245..f4a77ec 100644
--- a/libs/androidfw/AssetManager.cpp
+++ b/libs/androidfw/AssetManager.cpp
@@ -63,6 +63,7 @@
 static const char* kAssetsRoot = "assets";
 static const char* kAppZipName = NULL; //"classes.jar";
 static const char* kSystemAssets = "framework/framework-res.apk";
+static const char* kOmniRomAssets = "framework/omnirom-res.apk";
 static const char* kResourceCache = "resource-cache";
 
 static const char* kExcludeExtension = ".EXCLUDE";
@@ -367,10 +368,19 @@
     const char* root = getenv("ANDROID_ROOT");
     LOG_ALWAYS_FATAL_IF(root == NULL, "ANDROID_ROOT not set");
 
-    String8 path(root);
-    appendPath(path, kSystemAssets);
+    bool success = true;
+    {
+       String8 path(root);
+       appendPath(path, kSystemAssets);
+       success &= addAssetPath(path, NULL, false /* appAsLib */, true /* isSystemAsset */);
+    }
+    {
+       String8 path(root);
+       appendPath(path, kOmniRomAssets);
+       success &= addAssetPath(path, NULL, false /* appAsLib */, true /* isSystemAsset */);
+    }
 
-    return addAssetPath(path, NULL, false /* appAsLib */, true /* isSystemAsset */);
+    return success;
 }
 
 int32_t AssetManager::nextAssetPath(const int32_t cookie) const
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index de9991a..311f3fe 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -70,6 +70,7 @@
 #define IDMAP_MAGIC             0x504D4449
 
 #define APP_PACKAGE_ID      0x7f
+#define OMNIROMSDK_PACKAGE_ID    0x3f
 #define SYS_PACKAGE_ID      0x01
 
 static const bool kDebugStringPoolNoisy = false;
@@ -5802,7 +5803,8 @@
                 }
 
                 uint32_t packageId = Res_GETPACKAGE(rid) + 1;
-                if (packageId != APP_PACKAGE_ID && packageId != SYS_PACKAGE_ID) {
+                if (packageId != APP_PACKAGE_ID && packageId != SYS_PACKAGE_ID &&
+                        packageId != OMNIROMSDK_PACKAGE_ID) {
                     outValue->dataType = Res_value::TYPE_DYNAMIC_REFERENCE;
                 }
                 outValue->data = rid;
@@ -5823,7 +5825,8 @@
                         outValue->data = rid;
                         outValue->dataType = Res_value::TYPE_DYNAMIC_REFERENCE;
                         return true;
-                    } else if (packageId == APP_PACKAGE_ID || packageId == SYS_PACKAGE_ID) {
+                    } else if (packageId == APP_PACKAGE_ID || packageId == SYS_PACKAGE_ID ||
+                            packageId == OMNIROMSDK_PACKAGE_ID) {
                         // We accept packageId's generated as 0x01 in order to support
                         // building the android system resources
                         outValue->data = rid;
@@ -5969,7 +5972,8 @@
             }
 
             uint32_t packageId = Res_GETPACKAGE(rid) + 1;
-            if (packageId != APP_PACKAGE_ID && packageId != SYS_PACKAGE_ID) {
+            if (packageId != APP_PACKAGE_ID && packageId != SYS_PACKAGE_ID &&
+                    packageId != OMNIROMSDK_PACKAGE_ID) {
                 outValue->dataType = Res_value::TYPE_DYNAMIC_ATTRIBUTE;
             }
             outValue->data = rid;
@@ -5984,7 +5988,8 @@
                     outValue->data = rid;
                     outValue->dataType = Res_value::TYPE_DYNAMIC_ATTRIBUTE;
                     return true;
-                } else if (packageId == APP_PACKAGE_ID || packageId == SYS_PACKAGE_ID) {
+                } else if (packageId == APP_PACKAGE_ID || packageId == SYS_PACKAGE_ID ||
+                        packageId == OMNIROMSDK_PACKAGE_ID) {
                     // We accept packageId's generated as 0x01 in order to support
                     // building the android system resources
                     outValue->data = rid;
@@ -7159,6 +7164,7 @@
     // Reserved package ids
     mLookupTable[APP_PACKAGE_ID] = APP_PACKAGE_ID;
     mLookupTable[SYS_PACKAGE_ID] = SYS_PACKAGE_ID;
+    mLookupTable[OMNIROMSDK_PACKAGE_ID] = OMNIROMSDK_PACKAGE_ID;
 }
 
 status_t DynamicRefTable::load(const ResTable_lib_header* const header)
diff --git a/libs/androidfw/include/androidfw/AttributeFinder.h b/libs/androidfw/include/androidfw/AttributeFinder.h
index 03fad49..f12a964 100644
--- a/libs/androidfw/include/androidfw/AttributeFinder.h
+++ b/libs/androidfw/include/androidfw/AttributeFinder.h
@@ -74,6 +74,7 @@
 
   // Package offsets (best-case, fast look-up).
   Iterator framework_start_;
+  Iterator omnirom_framework_start_;
   Iterator app_start_;
 
   // Worst case, we have shared-library resources.
@@ -100,6 +101,9 @@
     case 0x01u:
       current_ = framework_start_;
       break;
+    case 0x3fu:
+      current_ = omnirom_framework_start_;
+      break;
     case 0x7fu:
       current_ = app_start_;
       break;
@@ -134,6 +138,9 @@
     case 0x01u:
       framework_start_ = current_;
       break;
+    case 0x3fu:
+      omnirom_framework_start_ = current_;
+      break;
     case 0x7fu:
       app_start_ = current_;
       break;
diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
index 0e9ec4d..3028977 100644
--- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
+++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
@@ -822,7 +822,8 @@
 
         // Idmaps for immutable RROs targeting "android", i.e. framework-res.apk, are created at
         // boot time in OverlayConfig.createImmutableFrameworkIdmapsInZygote().
-        if (targetPackage != null && !("android".equals(info.getTargetPackageName())
+        if (targetPackage != null && !(("android".equals(info.getTargetPackageName()) ||
+                                        "omnirom.platform".equals(info.getTargetPackageName()))
                 && !isPackageConfiguredMutable(overlayPackage))) {
             idmapStatus = mIdmapManager.createIdmap(targetPackage, overlayPackageState,
                     overlayPackage, updatedOverlayInfo.baseCodePath, overlay.getOverlayName(),
diff --git a/services/proguard.flags b/services/proguard.flags
index bf30781..0f99416 100644
--- a/services/proguard.flags
+++ b/services/proguard.flags
@@ -113,3 +113,7 @@
 # CoverageService guards optional jacoco class references with a runtime guard, so we can safely
 # suppress build-time warnings.
 -dontwarn org.jacoco.agent.rt.*
+
+# SDK
+-keep,allowoptimization,allowaccessmodification class omnirom.** { *; }
+-keep,allowoptimization,allowaccessmodification class org.omnirom.** { *; }
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index 9fb7319..713f8a1 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -2894,8 +2894,9 @@
     for (size_t i = 0; i < basePackageCount; i++) {
         size_t packageId = table.getBasePackageId(i);
         String16 packageName(table.getBasePackageName(i));
-        if (packageId > 0x01 && packageId != 0x7f &&
-                packageName != String16("android")) {
+        if (packageId > 0x01 && packageId != 0x7f && packageId != 0x3f &&
+                packageName != String16("android") &&
+                packageName != String16("omnirom.platform")) {
             libraryPackages.add(sp<Package>(new Package(packageName, packageId)));
         }
     }