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 文件
  1. Open the build.gradle file for the existing app module. At the top, you should see the following:

    apply plugin: 'com.android.application'

  2. Change the plugin assignment as shown here:

    apply plugin: 'com.android.library'

  3. 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 下,该文件包含:

下面是这个清单的内容: