1

我为 Unity3D 创建了一个 Android 插件。该插件通过调用bindService()启动后台服务。为了声明此服务,我已将该<service>元素作为元素的子元素放在我的 android 模块<application>的 AndroidManifest.xml 文件中。然后我从模块创建了一个 jar 文件并将其放在Assets\Plugins\Android文件夹中。

问题是<service>Unity 创建的 AndroidManifest 文件中缺少该元素。这是为什么?

Unity 应该从 jar 文件中提取我的清单,并根据Unity 文档将其与自己的清单文件合并:

您可以将预编译的 Android 库项目放入 Assets->Plugins->Android 文件夹中。预编译意味着所有 .java 文件必须已编译为位于项目的 bin/ 或 libs/ 文件夹中的 jar 文件。构建项目时,这些文件夹中的 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 制作的清单。我的问题是为什么统一不会将我编译的模块(.jar 文件)的清单合并到它自己的清单中。

4

1 回答 1

4

我想到了。我创建的 Jar 文件不包含清单文件(我通过 7zip 打开 .jar 文件验证了这一点)。因此,Unity 首先看不到任何清单文件,以便能够将其合并到自己的清单文件中。

为了解决这个问题,我创建了一个Android Archive (AAR) 文件而不是 jar 文件,如下所示

  1. 打开现有应用程序模块的 build.gradle 文件。在顶部,您应该看到以下内容:

    apply plugin: 'com.android.application'

  2. 更改插件分配,如下所示:

    apply plugin: 'com.android.library'

  3. 单击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>元素包含服务类的完全限定名称,这意味着包名 + 类名:

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

对于这种方法的示例,您可以在 Unity 中创建一个空项目并从资产商店安装Google Cast Remote Display android 插件。您可以看到 google 已将其 .aar 文件放在 Assets > Plugins > Android 下,该文件包含:

在此处输入图像描述

以下是此清单的内容:

在此处输入图像描述

于 2017-04-12T23:44:34.430 回答