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)));
}
}