Разрешение BroadcastReceiver для оболочки adb

Рассмотрим простой инструмент, использующий BroadcastReceiver для достижения простой цели. Поскольку это не должно использоваться другими приложениями, оно определяет разрешение с уровнем защиты signature или signatureOrSystem:

<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

Корневая оболочка может отправлять любую широковещательную рассылку, защищенную любыми разрешениями.
Нормальной оболочке также было предоставлено много разрешений, проверьте этот файл в коде доступа AOSP: frameworks\base\packages\Shell\AndroidManifest.xml.

Замените свой any.test.PERMISSION одним разрешением в этом файле, чтобы securityLevel был signatureOrSystem, например android.permission.REAL_GET_TASKS. После этого вы можете отправлять трансляцию этому приемнику в оболочку, но другое третье приложение не может.