【问题标题】:BroadcastReceiver permission for adb shelladb shell 的 BroadcastReceiver 权限
【发布时间】:2016-05-01 05:01:46
【问题描述】:

考虑一个使用BroadcastReceiver 的简单工具来实现一个简单的目标。因为这不应该被其他应用程序使用,所以它定义了一个 protectionLevel 为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 和其他应用程序工作。

【问题讨论】:

  • 我不明白这句话:“......不工作......只要设置了权限。没有它一切都很好......”你是说它工作没有许可,你想让它不工作?
  • 这是我的答案*.com/questions/35603856/…

标签: android permissions broadcastreceiver android-permissions


【解决方案1】:

我不想更改权限。相反,我创建了一个 Activity 作为代理:https://*.com/a/70110207/1651697

【讨论】:

    【解决方案2】:

    root shell 可以发送任何受任何权限保护的广播。
    一个普通的shell也被授予了很多权限,在AOSP源代码中查看这个文件:frameworks\base\packages\Shell\AndroidManifest.xml

    将您的any.test.PERMISSION 替换为此文件中保护级别为signatureOrSystem 的一个权限,例如android.permission.REAL_GET_TASKS。之后,您可以在 shell 中向此接收器发送广播,但其他 3rd 应用程序不能。

    【讨论】:

    • 将您的any.test.PERMISSION 替换为此文件中保护级别为signatureOrSystem 的一个权限,例如android.permission.REAL_GET_TASKS。之后,您可以在 shell 中向此接收器发送广播,但其他 3rd 应用程序不能。
    • Shell 包是在 Android 4.3 中引入的。
    • @tynn:能否请您提供解决问题的确切 shell 命令?
    • @srv_sud 没有涉及解决我的问题的 shell 命令。只为接收者使用不同的android:permission
    • @tynn:我发布了一个问题How to send broadcast with permission from command line。有人建议我检查您对此的回答。