diff options
author | Danesh M <daneshm90@gmail.com> | 2016-01-04 08:40:54 -0800 |
---|---|---|
committer | Danesh M <daneshm90@gmail.com> | 2016-01-04 16:12:48 -0800 |
commit | 19b0d4165ae0158209152df8af82673dec5ad701 (patch) | |
tree | b6be25e5962567702771ca8881ca468cf8fc7752 | |
parent | f6f56f8f0ed39a4eb5d33300984b9cddf8f3a426 (diff) | |
download | frameworks_base-19b0d4165ae0158209152df8af82673dec5ad701.zip frameworks_base-19b0d4165ae0158209152df8af82673dec5ad701.tar.gz frameworks_base-19b0d4165ae0158209152df8af82673dec5ad701.tar.bz2 |
ThemeEngine : Use manifest.mf for hash calculation
Using just AndroidManifest xml is not sufficient since
the apk could have different resources yet same manifest.
issue-id: YU-922
Change-Id: I5ffa95733110b1c37b5f07ef29b457bb68b50cb2
(cherry picked from commit a22cfa769c591ff5443a750eefec00de27fc6c09)
-rw-r--r-- | core/java/android/content/pm/PackageParser.java | 3 | ||||
-rw-r--r-- | core/java/android/content/pm/ThemeUtils.java | 20 |
2 files changed, 21 insertions, 2 deletions
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index dba6d56..6a07b31 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1133,6 +1133,7 @@ public class PackageParser { */ public void collectManifestDigest(Package pkg) throws PackageParserException { pkg.manifestDigest = null; + pkg.manifestHashCode = 0; // TODO: extend to gather digest for split APKs try { @@ -1141,7 +1142,7 @@ public class PackageParser { final ZipEntry je = jarFile.findEntry(ANDROID_MANIFEST_FILENAME); if (je != null) { pkg.manifestDigest = ManifestDigest.fromInputStream(jarFile.getInputStream(je)); - pkg.manifestHashCode = ThemeUtils.getPackageHashCode(pkg); + pkg.manifestHashCode = ThemeUtils.getPackageHashCode(pkg, jarFile); } } finally { jarFile.close(); diff --git a/core/java/android/content/pm/ThemeUtils.java b/core/java/android/content/pm/ThemeUtils.java index 357b372..e41523c 100644 --- a/core/java/android/content/pm/ThemeUtils.java +++ b/core/java/android/content/pm/ThemeUtils.java @@ -50,6 +50,7 @@ import java.io.OutputStream; import java.io.InputStreamReader; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.jar.StrictJarFile; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -120,6 +121,7 @@ public class ThemeUtils { private static final String SETTINGS_DB = "/data/data/com.android.providers.settings/databases/settings.db"; private static final String SETTINGS_SECURE_TABLE = "secure"; + private static final String MANIFEST_NAME = "META-INF/MANIFEST.MF"; /** * IDMAP hash version code used to alter the resulting hash and force recreating @@ -727,8 +729,24 @@ public class ThemeUtils { * @param pkg * @return */ - public static int getPackageHashCode(PackageParser.Package pkg) { + public static int getPackageHashCode(PackageParser.Package pkg, StrictJarFile jarFile) { int hash = pkg.manifestDigest != null ? pkg.manifestDigest.hashCode() : 0; + final ZipEntry je = jarFile.findEntry(MANIFEST_NAME); + if (je != null) { + try { + try { + ManifestDigest digest = ManifestDigest.fromInputStream( + jarFile.getInputStream(je)); + if (digest != null) { + hash += digest.hashCode(); + } + } finally { + jarFile.close(); + } + } catch (IOException | RuntimeException e) { + // Failed to generate digest from manifest.mf + } + } hash = 31 * hash + IDMAP_HASH_VERSION; return hash; } |