diff options
-rw-r--r-- | libs/androidfw/ResourceTypes.cpp | 7 | ||||
-rw-r--r-- | services/core/java/com/android/server/pm/Installer.java | 4 | ||||
-rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 6 |
3 files changed, 15 insertions, 2 deletions
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 818e1c5..5fe0d66 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -5290,6 +5290,13 @@ bool ResTable::stringToValue(Res_value* outValue, String16* outString, identifierForName(name.string(), name.size(), type.string(), type.size(), package.string(), package.size(), &specFlags); +// HACK +// This allows themes to reference attributes that are app specific and +// normally private. Only applies to aapt running on device not host +// build systems. +#ifdef HAVE_ANDROID_OS + enforcePrivate = false; +#endif if (rid != 0) { if (enforcePrivate) { if ((specFlags&ResTable_typeSpec::SPEC_PUBLIC) == 0) { diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index 5f183a2..4be7e25 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -129,7 +129,7 @@ public final class Installer extends SystemService { } public int aapt(String themeApkPath, String internalPath, String resTablePath, int uid, - int pkgId, int minSdkVersion, String commonResourcesPath) { + int pkgId, int minSdkVersion, String appResourcesPath, String commonResourcesPath) { StringBuilder builder = new StringBuilder(); if (TextUtils.isEmpty(commonResourcesPath)) { @@ -149,6 +149,8 @@ public final class Installer extends SystemService { builder.append(pkgId); builder.append(' '); builder.append(minSdkVersion); + builder.append(' '); + builder.append(appResourcesPath); if (!TextUtils.isEmpty(commonResourcesPath)) { builder.append(' '); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 07a627b..c1fe38e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -8267,8 +8267,12 @@ public class PackageManagerService extends IPackageManager.Stub { } boolean hasCommonResources = (hasCommonResources(pkg) && !COMMON_OVERLAY.equals(target)); + PackageParser.Package targetPkg = mPackages.get(target); + String appPath = targetPkg != null ? targetPkg.baseCodePath : ""; + if (mInstaller.aapt(pkg.baseCodePath, internalPath, resPath, sharedGid, pkgId, pkg.applicationInfo.targetSdkVersion, + appPath, hasCommonResources ? ThemeUtils.getTargetCacheDir(COMMON_OVERLAY, pkg) + File.separator + "resources.apk" : "") != 0) { throw new AaptException("Failed to run aapt"); @@ -8282,7 +8286,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (mInstaller.aapt(pkg.baseCodePath, APK_PATH_TO_ICONS, resPath, sharedGid, Resources.THEME_ICON_PKG_ID, pkg.applicationInfo.targetSdkVersion, - "") != 0) { + "", "") != 0) { throw new AaptException("Failed to run aapt"); } } |