【问题标题】:Unity ignores android plugin manifest file leading to missing <service> element in its android manifestUnity 忽略 android 插件清单文件,导致其 android 清单中缺少 <service> 元素
【发布时间】:2017-09-07 14:02:21
【问题描述】:

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

问题是 Unity 创建的 AndroidManifest 文件中缺少 &lt;service&gt; 元素。这是为什么?

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

您可以将预编译的 Android 库项目放入 资产-> 插件-> Android 文件夹。预编译意味着所有 .java 文件 必须已编译成位于 bin/ 或 项目的 libs/ 文件夹。 AndroidManifest.xml 来自这些 文件夹将自动与主清单文件合并 项目已建成。

所以结果清单文件应该包含&lt;service&gt; 元素(但它不像之前所说的那样)。

以下是我的模块及其清单文件:

我使用以下 gradle 代码(来自here)将模块转换为 jar 文件:

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

注意:我的问题与this question 不重复。我没有制作自定义清单,也没有修改 Unity 制作的清单。 我的问题是为什么 unity 没有将我编译的模块(.jar 文件)的清单合并到它自己的清单中。

【问题讨论】:

  • 将 Manifest 文件放入 Assets\Plugins\Android 看看会发生什么
  • @Programmer 根本不是重复的!我没有制作自定义清单,也没有修改 Unity 制作的清单。我的问题是为什么统一不将我的模块的清单合并到它自己的清单中。
  • @Programmer:将我的清单放入该文件夹会导致我的模块清单完全覆盖 Unity 清单。我不想要那个。我不想创建自定义清单。相反,我希望 Unity 将我的清单(来自压缩的 jar 模块)合并到它自己的清单中。
  • 来自 Unity 文档:“AndroidManifest.xml 文件也应该放在 Assets->Plugins->Android 文件夹中(放置自定义清单会完全覆盖默认的 Unity Android 清单)。”我不想那样。
  • 第三,如果您不想覆盖,您应该添加子文件夹并将您的清单放在那里。请参阅here 了解更多信息

标签: android unity3d plugins android-manifest android-unity-plugin


【解决方案1】:

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

为了解决这个问题,我创建了一个 Android 存档 (AAR) 文件,而不是作为 follows 的 jar 文件:

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

    apply plugin: 'com.android.application'

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

    apply plugin: 'com.android.library'

  3. 点击将项目与 Gradle 文件同步

现在通过进入“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 中找到生成的清单文件。

一个非常重要的事情是确保您的&lt;service&gt; 元素包含服务类的完全限定名,即包名+类名:

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

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

以下是此清单的内容:

【讨论】:

    猜你喜欢
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多