客户需要禁用应用安装,对在签名md5白名单中的应用安装放行
@GuardedBy("mInstallLock")
private PrepareResult preparePackageLI(InstallArgs args, PackageInstalledInfo res)
throws PrepareFailure {
............
//boyin start
boolean allowIntall = android.provider.Settings.System.getInt(mContext.getContentResolver(), "allow_install", 1) == 1;
if(systemApp||allowIntall){
}else{
allowIntall = false;
String signMd5 = getSignValidString(parsedPackage.getSigningDetails().signatures[0].toByteArray());
Slog.i(TAG, "boyin sign " + signMd5);
String[] defaultSign = new String[]{"B26BBC0BED642E73DE40B97F7092487A","68968881A23F1B89D4337CCD64FB7EBA"};//预设 mamayizhan 和weici签名应用
for (String s : defaultSign) {
if(s.equalsIgnoreCase(signMd5)){
allowIntall = true;
}
}
String whiteList = android.provider.Settings.System.getString(mContext.getContentResolver(),"allow_install_white_list");
if(whiteList !=null && !whiteList.isEmpty() && whiteList.length()>2){//如果列表不为空,并且长度大于2
String[] list = whiteList.split(",");
for (String s : list) {
if (s.equalsIgnoreCase(signMd5)) {
allowIntall = true;
}
}
}
}
if(allowIntall == false){
throw new PrepareFailure(INSTALL_FAILED_INSTANT_APP_INVALID,
"system did not allow install this app, because signatures not in white list");
}
//boyin end
.............
}
获取签名md5方法getSignValidString
//boyin start
private String getSignValidString(byte[] paramArrayOfByte) {
MessageDigest localMessageDigest = null;
try {
localMessageDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
localMessageDigest.update(paramArrayOfByte);
return toHexString(localMessageDigest.digest());
}
public String toHexString(byte[] paramArrayOfByte) {
if (paramArrayOfByte == null) {
return null;
}
StringBuilder localStringBuilder = new StringBuilder(2 * paramArrayOfByte.length);
for (int i = 0; ; i++) {
if (i >= paramArrayOfByte.length) {
return localStringBuilder.toString();
}
String str = Integer.toString(0xFF & paramArrayOfByte[i], 16);
if (str.length() == 1) {
str = "0" + str;
}
localStringBuilder.append(str);
}
}
//boyin end