Предотвратить коллизии служб после aapt --rename-manifest-package

Я создаю приложение с белой меткой. Я запускаю проект через aapt с опцией --rename-manifest-package.

Это позволяет мне писать com.foobar

И отпустите

Версии com.foobar.demo и com.foobar.extended должны быть установлены на одном устройстве.

Однако, несмотря на то, что службы устанавливаются как через разрешение android:permission="@string/permission_name" (которое меняется при установке), так и через android:exported="false", каждое приложение хочет вызывать другие службы приложений!

т.е. когда я запускаю com.foobar.extended, я получаю исключение безопасности о том, что у него нет разрешения для службы com.foobar.demo!

Похоже, что -rename-manifest-package не изменяет фильтры намерений службы, поэтому они остаются com.foobar.services.X, что означает, что службы приложений имеют более высокий приоритет для обработки намерений.

Как я могу предотвратить эту проблему? (Возможно, startLocalService(), который не отправляет намерения за пределы приложения...)

Спасибо,

Джон


person johncc    schedule 05.03.2014    source источник


Ответы (1)


Вы не предоставили копию своего файла манифеста, но я предполагаю, что вы использовали там абсолютные имена, тогда как вы должны были использовать относительные имена.

Вместо

<service android:name="com.foobar.demo.service" />

вы должны использовать

<service android:name=".service" />

(Обратите внимание, что имя начинается с точки).

person zmarties    schedule 05.03.2014
comment
Я использую относительные имена служб в файле AndroidManifest.xml. Однако, когда я запускаю службу, я использую Intent с действием String. т.е. com.foobar.services.MyService. - person johncc; 06.03.2014
comment
-rename-manifest-package не будет знать, как изменить внутреннюю строку, которую вы используете для запуска службы. Причина использования относительного имени в манифесте заключается в том, что вы можете создать имя во время выполнения, используя context.packageName() + ".service" - person zmarties; 06.03.2014