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 следующим образом:
Откройте файл build.gradle для существующего модуля приложения. В верхней части вы должны увидеть следующее:
apply plugin: 'com.android.application'
Измените назначение плагина, как показано здесь:
apply plugin: 'com.android.library'
Нажмите " Синхронизировать проект с файлами 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, и этот файл содержит:
и следующее содержание этого манифеста: