购物商城网站的运营/企业网站设计思路
遇到一个特殊需求场景,一个第三方app需要预置到系统中,并且授予其写入短信数据库的权限。
代码修改位置:platform/frameworks/base / telephony/java/com/android/internal/telephony/SmsApplication.java
其中,默认授权的关键方法如下
private static void assignWriteSmsPermissionToSystemApp(Context context,PackageManager packageManager, AppOpsManager appOps, String packageName) {// First check package signature matches the caller's package signature.// Since this class is only used internally by the system, this check makes sure// the package signature matches system signature.final int result = packageManager.checkSignatures(context.getPackageName(), packageName);if (result != PackageManager.SIGNATURE_MATCH) {Rlog.e(LOG_TAG, packageName + " does not have system signature");return;}try {PackageInfo info = packageManager.getPackageInfo(packageName, 0);int mode = appOps.checkOp(AppOpsManager.OP_WRITE_SMS, info.applicationInfo.uid,packageName);if (mode != AppOpsManager.MODE_ALLOWED) {Rlog.w(LOG_TAG, packageName + " does not have OP_WRITE_SMS: (fixing)");appOps.setMode(AppOpsManager.OP_WRITE_SMS, info.applicationInfo.uid,packageName, AppOpsManager.MODE_ALLOWED);}} catch (NameNotFoundException e) {// No whitelisted system app on this deviceRlog.e(LOG_TAG, "Package not found: " + packageName);}}
可以看到此处关键逻辑:
// First check package signature matches the caller's package signature.// Since this class is only used internally by the system, this check makes sure// the package signature matches system signature.final int result = packageManager.checkSignatures(context.getPackageName(), packageName);if (result != PackageManager.SIGNATURE_MATCH) {Rlog.e(LOG_TAG, packageName + " does not have system signature");return;}
对于三方应用,授权的时候有一个校验签名的过程,原则上第三方应用都是不能有这个权限的。如果我们是以PRESIGNED形式预置到系统中,会导致签名不匹配而授权不成功。
解决方案:
1. 将三方应用预置时修改为系统签名;
2. 复写这个assignWriteSmsPermissionToSystemApp 方法,将其中校验签名的地方去掉再使用;