adb shell的BroadcastReceiver权限

15

考虑使用 BroadcastReceiver 实现一个简单目标的简单工具。由于这不应该被其他应用程序使用,因此它定义了一个权限,保护级别为 signaturesignatureOrSystem:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="any.test">

    <permission
        android:name="any.test.PERMISSION"
        android:protectionLevel="signatureOrSystem" />

    <application android:label="AnyTest">
        <receiver
            android:name=".Receiver"
            android:exported="true"
            android:permission="any.test.PERMISSION" />
    </application>
</manifest>

现在,我想通过广播来测试这个功能。

adb shell am broadcast -n any.test/.Receiver

从我的电脑上运行这段代码没有问题,但在设置了权限后,在真机上测试时就会出现问题。如果不设置权限,则一切正常。

那么我该如何定义或授予权限,以便我可以使用 ADB 在真机上进行测试呢?

我希望在调试模式下可以让这个导出的广播更加安全,因此,如果有一个特殊的权限可以用于 ADB 的使用或者一个运行时测试可以仅允许从 ADB 中调用,我可以在 Receiver.onReceive(Context, Intent) 中实现它,这也会很有帮助。该接收器不需要同时适用于 ADB 和其他应用程序。


1
我不理解这个语句:“只要权限设置正确,它就能正常工作。没有权限则一切都无法正常工作。”你是说如果没有权限它就能正常工作,而你希望它不能正常工作吗? - muratgu
这是我的答案 https://dev59.com/w5Tfa4cB1Zd3GeqPQWvE#55824554 - y4n9b0
2个回答

6
一种根shell可以发送任何受任何权限保护的广播。
一个普通的shell也被授予了许多权限,检查AOSP源代码中的此文件:frameworks\base\packages\Shell\AndroidManifest.xml
any.test.PERMISSION替换为此文件中保护级别为signatureOrSystem的一个权限,例如android.permission.REAL_GET_TASKS。之后,您可以在shell中向此接收器发送广播,但其他第三方应用程序无法发送该广播。

请将您的 any.test.PERMISSION 替换为此文件中保护级别为 signatureOrSystem 的一个权限,例如 android.permission.REAL_GET_TASKS。之后,您可以在 shell 中向此接收器发送广播,但其他第三方应用程序无法这样做。 - Swing
Shell包是在Android 4.3中引入的。 - tynn
@tynn:你能否提供你使用的确切shell命令,以解决你的问题? - srv_sud
@srv_sud,解决我的问题并没有涉及到任何shell命令。只是为接收器使用了不同的“android:permission”。 - tynn
@tynn:我发了一个问题 如何从命令行发送带有权限的广播?。有人建议我查看您的答案。 - srv_sud

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接