Unity игнорирует файл манифеста плагина Android, что приводит к отсутствию элемента <service> в его манифесте Android

Я создал плагин Android для Unity3D. Этот плагин запускает фоновый сервис, вызывая bindService(). Чтобы объявить эту услугу, я поставил <service> элемент как дитя <application> элемент в файле AndroidManifest.xml моего модуля Android. Затем я создал файл jar из модуля и поместил его в папку Assets\Plugins\Android.

Проблема в том, что <service> элемент отсутствует в файле AndroidManifest, созданном Unity. это почему?

Unity должен был извлечь мой манифест из файла jar и объединить его со своим собственным файлом манифеста в соответствии с документацией Unity:

Вы можете поместить предварительно скомпилированные проекты библиотеки Android в папку Assets->Plugins->Android. Предварительно скомпилированный означает, что все файлы.java должны быть скомпилированы в файлы jar, расположенные в папке bin/ или libs/ проекта. AndroidManifest.xml из этих папок будет автоматически объединен с основным файлом манифеста при сборке проекта.

Таким образом, файл манифеста результата должен содержать <service> элемент (но это не так, как было сказано ранее).

Ниже приведен мой модуль и его файл манифеста:

Я использовал следующий код gradle( отсюда) для преобразования модуля в файл jar:

task createJar(type: Copy) {
    from('build/intermediates/bundles/default/')
    into('libs/jars/')
    include('classes.jar')
    rename('classes.jar', 'locationPlugin.jar')
}

Примечание: мой вопрос не является дубликатом этого вопроса. Я не делаю пользовательский манифест и не изменяю манифест, созданный Unity. Мой вопрос о том, почему Unity не объединяет манифест моего скомпилированного модуля (файл.jar) с собственным манифестом.

1 ответ

Решение

Я понял. Файл Jar, который я создал, не содержит файл манифеста (я проверил это, открыв файл.jar с помощью 7zip). Таким образом, Unity не видит ни одного файла манифеста, чтобы иметь возможность объединить его с собственным файлом манифеста.

Чтобы решить эту проблему, я создал файл архива Android (AAR) вместо файла JAR следующим образом:

  1. Откройте файл build.gradle для существующего модуля приложения. В верхней части вы должны увидеть следующее:

    apply plugin: 'com.android.application'

  2. Измените назначение плагина, как показано здесь:

    apply plugin: 'com.android.library'

  3. Нажмите " Синхронизировать проект с файлами Gradle".

Теперь соберите модуль, перейдя на панель "Gradle Projects" (справа), найдите соответствующий модуль gradle и перейдите к Задачам > build> build. Запустите его, дважды щелкнув по нему. Файл.aar теперь собран.

1) найдите файл.aar этого модуля (он находится в папке mylibrary \ build \ output \aar). Я выбрал релиз один. Он назывался mylibrary-release.aar, Вы можете открыть его с помощью 7zip, чтобы убедиться, что файл манифеста Android находится там.

2) Скопируйте файл.aar в Assets\Plugins\Android папка.

Это оно! Теперь Unity объединяет файл манифеста модуля в свой собственный манифест. Вы можете найти полученный файл манифеста в Temp\StagingArea вашего проекта Unity.

Очень важно, чтобы ваш <service> Элемент содержит полное имя класса обслуживания, что означает имя пакета + имя класса:

<service android:name="com.servicelocation.zerokey.mylibrary.MyLocationService"/>

В качестве примера такого подхода вы можете создать пустой проект в Unity и установить плагин Google Cast Remote Display для Android из хранилища ресурсов. Вы можете видеть, что Google поместил свой файл.aar в Assets > Plugins > Android, и этот файл содержит:

и следующее содержание этого манифеста:

Другие вопросы по тегам