Задать вопрос

Android — Не работает protectionLevel="signature" в случае сервиса?

Всем привет! Сегодня столкнулся со странной проблемой, а именно:

  • Есть сервис, выполненный в виде отдельного приложения (пакета)
  • Есть приложение клиент, желающее использовать сервис
  • Есть желание, оградить все это от посторонних



То есть, сервис должен отдаваться только своим, а чужих не пущать. Документация говорит, что это делается через пермишны со свойством android:protectionLevel=«signature». Пробуем:


На стороне сервиса:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="schemas.android.com/apk/res/android"
package="com.example.service"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" />

<permission android:description="@string/permDesc"
android:icon="@drawable/ic_launcher"
android:label="Access to service"
android:name="com.example.service.ACCESS_SERVICE"
android:protectionLevel="signature"/>

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<service android:enabled="true" android:name=".MyService" android:permission="com.example.service.ACCESS_SERVICE">
<intent-filter>
<action android:name="com.example.intent.action.CONNECT_SERVICE" />
</intent-filter>
</service>
</application>
</manifest>



Соответственно, на стороне клиента, все что нам надо — это описать объявленный пермишн:


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="schemas.android.com/apk/res/android"
package="com.example.application" android:versionCode="1" android:versionName="1.0"
android:installLocation="internalOnly">
<uses-sdk android:minSdkVersion="3" />

<uses-permission android:name="com.example.service.ACCESS_SERVICE"/>

...
</manifest>



Система должна обнаружить что данный пермишн требует совпадения подписей (а это так, если и приложение и сервис от одного разработчика) и заблокировать доступ в противном случае.


К сожалению, на практике это не работает. Система проверяет, что приложение должно явно запросить пермишн через uses-permission, однако подпись приложения может быть любой. На доступе это не сказывается. В чем собственно и проблема.


P.S.: Я действительно проверил вариант с двумя разными подписями. Они действительно разные, потому что андроид ругается, если попробовать переустановить приложение с другой подписью — требуется полная деинсталляция. Если подписи по ошибке были бы теми же, то подобного сообщения не возникло бы и приложение просто обновилось бы.
  • Вопрос задан
  • 3941 просмотр
Подписаться 3 Оценить 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы