Разрешение 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
. После этого вы можете отправлять трансляцию этому приемнику в оболочку, но другое третье приложение не может.