Android

时间:2016-04-18 09:29:46

标签: java android permissions

我正在尝试了解原生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用户。但我想通过代码进行精确检查。

1 个答案:

答案 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日