From f5b3a01e54d9b2e496f865e05b18f9455b0b8038 Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Tue, 18 Feb 2014 15:21:13 -0800 Subject: [PATCH] Add fastpath for single signature comparison PackageManager does not need to create a hash set when comparing two sets of signatures, where each set contains one signature. This is the common case for most applications. Bug:13029313 Change-Id: I61883d85960db7b376e234d7abae6149c4d20245 --- .../server/pm/PackageManagerService.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index df83fd70c5ce7..da0c38d5152a8 100755 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2546,15 +2546,41 @@ public class PackageManagerService extends IPackageManager.Stub { } } + /** + * Compares two sets of signatures. Returns: + *
+ * {@link PackageManager#SIGNATURE_NEITHER_SIGNED}: if both signature sets are null, + *
+ * {@link PackageManager#SIGNATURE_FIRST_NOT_SIGNED}: if the first signature set is null, + *
+ * {@link PackageManager#SIGNATURE_SECOND_NOT_SIGNED}: if the second signature set is null, + *
+ * {@link PackageManager#SIGNATURE_MATCH}: if the two signature sets are identical, + *
+ * {@link PackageManager#SIGNATURE_NO_MATCH}: if the two signature sets differ. + */ static int compareSignatures(Signature[] s1, Signature[] s2) { if (s1 == null) { return s2 == null ? PackageManager.SIGNATURE_NEITHER_SIGNED : PackageManager.SIGNATURE_FIRST_NOT_SIGNED; } + if (s2 == null) { return PackageManager.SIGNATURE_SECOND_NOT_SIGNED; } + + if (s1.length != s2.length) { + return PackageManager.SIGNATURE_NO_MATCH; + } + + // Since both signature sets are of size 1, we can compare without HashSets. + if (s1.length == 1) { + return s1[0].equals(s2[0]) ? + PackageManager.SIGNATURE_MATCH : + PackageManager.SIGNATURE_NO_MATCH; + } + HashSet set1 = new HashSet(); for (Signature sig : s1) { set1.add(sig);