Unity 忽略 android 插件清单文件,导致其 android 清单中缺少 <service> 元素
Unity ignores android plugin manifest file leading to missing <service> element in its android manifest
我已经为 Unity3D 创建了一个 Android 插件。此插件通过调用 bindService() 启动后台服务。为声明此服务,我已将 <service>
元素作为 <application>
元素的子元素放入 AndroidManifest.xml 文件 我的 android 模块[=42] =].然后我从模块创建了一个 jar 文件并将其放在 Assets\Plugins\Android 文件夹中。
问题是 Unity 创建的 AndroidManifest 文件中缺少 <service>
元素。这是为什么?
Unity 应该从 jar 文件中提取我的清单,并根据 Unity documentation:
将其与自己的清单文件合并
You can drop pre-compiled Android library projects into the
Assets->Plugins->Android folder. Pre-compiled means all .java files
must have been compiled into jar files located in either the bin/ or
the libs/ folder of the project. AndroidManifest.xml from these
folders will get automatically merged with the main manifest file when
the project is built.
所以结果清单文件应该包含 <service>
元素(但它不像之前说的那样)。
以下是我的模块及其清单文件:
我使用以下 gradle 代码(来自 here)将模块转换为 jar 文件:
task createJar(type: Copy) {
from('build/intermediates/bundles/default/')
into('libs/jars/')
include('classes.jar')
rename('classes.jar', 'locationPlugin.jar')
}
注意:我的问题不是的重复问题。我没有制作自定义清单,也没有修改 Unity 制作的清单。 我的问题是为什么 unity 不将我编译的模块(.jar 文件)的清单合并到它自己的清单中。
我明白了。我创建的 Jar 文件不包含清单文件(我通过 7zip 打开 .jar 文件验证了这一点)。所以Unity首先看不到任何清单文件能够将其合并到自己的清单文件中。
为了解决这个问题,我创建了一个 Android 存档 (AAR) 文件 而不是 follows:
的 jar 文件
Open the build.gradle file for the existing app module. At the top,
you should see the following:
apply plugin: 'com.android.application'
Change the plugin assignment as shown here:
apply plugin: 'com.android.library'
Click Sync Project with Gradle Files.
现在通过进入 'Gradle Projects' 窗格(在右侧)构建模块并找到相关的 gradle 模块并转到 Tasks > build > build. 运行 双击它。 .aar 文件现已构建。
1) 找到该模块的.aar文件(位于mylibrary\build\outputs\aar文件夹中)。我选择了发行版。它被称为 mylibrary-release.aar
。您可以通过 7zip 打开它以验证 Android 清单文件是否存在。
2) 将 .aar 文件复制到 Assets\Plugins\Android
文件夹中。
就是这样! Unity 现在将模块的清单文件合并到它自己的清单中。您可以在 Unity 项目的 Temp\StagingArea 中找到生成的清单文件。
一件非常重要的事情是确保您的 <service>
元素包含服务的完全限定名称 class,这意味着包名称 + class 名称:
<service android:name="com.servicelocation.zerokey.mylibrary.MyLocationService"/>
对于此方法的示例,您可以在 Unity 中创建一个空项目并从资产商店安装 Google Cast Remote Display android plugin。您可以看到 google 已将其 .aar 文件放在 Assets > Plugins > Android 下,该文件包含:
下面是这个清单的内容:
我已经为 Unity3D 创建了一个 Android 插件。此插件通过调用 bindService() 启动后台服务。为声明此服务,我已将 <service>
元素作为 <application>
元素的子元素放入 AndroidManifest.xml 文件 我的 android 模块[=42] =].然后我从模块创建了一个 jar 文件并将其放在 Assets\Plugins\Android 文件夹中。
问题是 Unity 创建的 AndroidManifest 文件中缺少 <service>
元素。这是为什么?
Unity 应该从 jar 文件中提取我的清单,并根据 Unity documentation:
将其与自己的清单文件合并You can drop pre-compiled Android library projects into the Assets->Plugins->Android folder. Pre-compiled means all .java files must have been compiled into jar files located in either the bin/ or the libs/ folder of the project. AndroidManifest.xml from these folders will get automatically merged with the main manifest file when the project is built.
所以结果清单文件应该包含 <service>
元素(但它不像之前说的那样)。
以下是我的模块及其清单文件:
task createJar(type: Copy) {
from('build/intermediates/bundles/default/')
into('libs/jars/')
include('classes.jar')
rename('classes.jar', 'locationPlugin.jar')
}
注意:我的问题不是
我明白了。我创建的 Jar 文件不包含清单文件(我通过 7zip 打开 .jar 文件验证了这一点)。所以Unity首先看不到任何清单文件能够将其合并到自己的清单文件中。
为了解决这个问题,我创建了一个 Android 存档 (AAR) 文件 而不是 follows:
的 jar 文件
Open the build.gradle file for the existing app module. At the top, you should see the following:
apply plugin: 'com.android.application'
Change the plugin assignment as shown here:
apply plugin: 'com.android.library'
Click Sync Project with Gradle Files.
现在通过进入 'Gradle Projects' 窗格(在右侧)构建模块并找到相关的 gradle 模块并转到 Tasks > build > build. 运行 双击它。 .aar 文件现已构建。
1) 找到该模块的.aar文件(位于mylibrary\build\outputs\aar文件夹中)。我选择了发行版。它被称为 mylibrary-release.aar
。您可以通过 7zip 打开它以验证 Android 清单文件是否存在。
2) 将 .aar 文件复制到 Assets\Plugins\Android
文件夹中。
就是这样! Unity 现在将模块的清单文件合并到它自己的清单中。您可以在 Unity 项目的 Temp\StagingArea 中找到生成的清单文件。
一件非常重要的事情是确保您的 <service>
元素包含服务的完全限定名称 class,这意味着包名称 + class 名称:
<service android:name="com.servicelocation.zerokey.mylibrary.MyLocationService"/>
对于此方法的示例,您可以在 Unity 中创建一个空项目并从资产商店安装 Google Cast Remote Display android plugin。您可以看到 google 已将其 .aar 文件放在 Assets > Plugins > Android 下,该文件包含:
下面是这个清单的内容: