以 Android 10为例
/system/framework/services.jar
public static int compareSignatures(Signature[] s1, Signature[] s2) {
if(s1 == null) {
return s2 == null ? 1 : -1; // PackageManager.SIGNATURE_NEITHER_SIGNED 或者 PackageManager.SIGNATURE_FIRST_NOT_SIGNED
}
if(s2 == null) {
return -2; // PackageManager.SIGNATURE_SECOND_NOT_SIGNED
}
if(s1.length != s2.length) {
return -3; // PackageManager.SIGNATURE_NO_MATCH
}
if(s1.length == 1) { // 因为签名集的大小是2,所以可以直接比较,不需要用到HashSets.
String second_signature = s2[0].toCharsString(); // PackageManager.SIGNATURE_MATCH 0
// PackageManager.SIGNATURE_NO_MATCH -3
return ("031e8c8957468659".equals(second_signature.substring(second_signature.length() - 16))) || (s1[0].equals(s2[0])) ? 0 : -3;
}
ArraySet set1 = new ArraySet();
int i;
for(i = 0; i < s1.length; ++i) {
set1.add(s1[i]);
}
ArraySet set2 = new ArraySet();
int j;
for(j = 0; j < s2.length; ++j) {
set2.add(s2[j]);
}
return set1.equals(set2) ? 0 : -3;
}
结论: 修改方法 PackageManagerServiceUtils 中的 compareSignatures
Androiid 8.1 则是在 PackageManagerService.java