我正在尝试了解原生Android代码库。我想知道检查权限的代码部分。例如,如果我想发送短信,我需要功能: public void sendDataMessage(String destinationAddress,String scAddress,short destinationPort,byte [] data,PendingIntent sentIntent,PendingIntent deliveryIntent)与此一起需要在Android Manifest中声明权限 SEND_SMS 。如果我没有声明权限,我会得到一个安全例外。但是我没有在SmsManager.java的代码中找到这个部分。这是功能:
public void sendDataMessage(
String destinationAddress, String scAddress, short destinationPort,
byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) {
if (TextUtils.isEmpty(destinationAddress)) {
throw new IllegalArgumentException("Invalid destinationAddress");
}
if (data == null || data.length == 0) {
throw new IllegalArgumentException("Invalid message data");
}
try {
ISms iccISms = getISmsServiceOrThrow();
iccISms.sendDataForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(),
destinationAddress, scAddress, destinationPort & 0xFFFF,
data, sentIntent, deliveryIntent);
} catch (RemoteException ex) {
// ignore it
}
}
那么确切地检查了权限。我正在寻找代码的一部分,在发送SMS之前,Android会检查SEND_SMS权限。我期待在PackageManager中调用各种权限检查功能但事实并非如此。我发现了一些类似的问题here,他们讨论了如何将软件包链接到linux用户。但我想通过代码进行精确检查。
答案 0 :(得分:1)
sendTextMessage()方法实例化ISms对象。然后它调用接口中定义的sendText()方法。
ISms iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
if (iccISms != null) {
iccISms.sendText(destinationAddress, scAddress, text, sentIntent, deliveryIntent);
}
这里ISms是一个接口。所以getService()方法返回的对象必须实现这个接口。幸运的是,只有两个类扩展了这个接口。第一个是IccSmsInterfaceManager,另一个是IccSmsInterfaceManagerProxy(我忽略了这个)。
IccSmsInterfaceManager类可以在' /frameworks/base/telephony/java/com/android/internal/telephony/IccSmsInterfaceManager.java'中找到。此类的sendText()方法执行权限检查,这是我们感兴趣的点。
mPhone.getContext().enforceCallingPermission(
"android.permission.SEND_SMS",
"Sending SMS message");
此enforceCallingPermission调用最终通过以下类在
中出现在PackageManager中上下文> ActivityManager - > PackageManagerService
来源:Chasing Android System Calls Down The Rabbit Hole,上次访问时间:2016年7月20日