应用防劫持
防止使用云助理过程中,不可信的第三方应用自启动让用户误以为仍在操作云助理。
在Activity onStop()时获取系统当前前台进程,判断是否可信,若不可信则Toast提醒用户:
ActivityManager activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessInfos) {
if (appProcessInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
for (String trustedPackage : trustedPackages) {
if (trustedPackage.equalsIgnoreCase(appProcessInfo.processName)) {
trusted = true;
break;
}
}
break;
}
}
if (!trusted) { DialogUtil.toast(activity.getResources().getString(R.string.on_pause_tip));
} else {
trusted = false;
}
在应用使用过程中有时需要打开如相机、文件选择器等时,也不希望toast打扰用户,但这些应用报名因机而已,因此不去进行检查。
注:其中可信进程经过研究暂定以下几个:
异地登陆提醒
在账号已登陆的情况下,若同一账号在另一台设备登录时,通知前一台设备“账号在另一台设备登录”,以提醒用户注意。
APK签名校验
为防止APK被重签名,在应用启动时进行了签名校验步骤。
获取当前签名信息
private static Signature[] getSign(Context context) {
PackageManager pm = context.getPackageManager();
List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);
for (PackageInfo packageinfo : apps) {
String packageName = packageinfo.packageName;
if (packageName.equals(context.getPackageName())) {
return packageinfo.signatures;
}
}
return null;
}
获取签名MD5值
private static String getMD5(Signature sig) {
byte[] hexBytes = sig.toByteArray();
byte[] md5digest = DigestUtils.md5Digest(hexBytes);
StringBuilder sb = new StringBuilder();
for (byte aMd5digest : md5digest) {
sb.append((Integer.toHexString((aMd5digest & 0xFF) | 0x100)).substring(1, 3));
}
return sb.toString();
}
与合法值比较
若不同则Toast提示用户,并退出应用。