android - Unity 忽略 android 插件 list 文件,导致其 android list 中缺少 <service> 元素

标签 android unity-game-engine plugins android-manifest android-unity-plugin

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

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

Unity 应该从 jar 文件中提取我的 list ,并根据 Unity documentation 将其与自己的 list 文件合并。 :

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.

因此结果 list 文件应包含 <service>元素(但它不像之前所说的那样)。

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

enter image description here 我使用以下 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 的重复问题.我没有制作自定义 list ,也没有修改 Unity 制作的 list 。 我的问题是为什么 unity 不将我编译的模块(.jar 文件)的 list 合并到它自己的 list 中。

最佳答案

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

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

  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” Pane (在右侧)构建模块并找到相关的 gradle 模块并转到Tasks > build > build。双击运行它。 .aar 文件现已构建。

1) 找到该模块的.aar 文件(位于mylibrary\build\outputs\aar 文件夹)。我选择了发行版。它被称为mylibrary-release.aar .您可以通过 7zip 打开它以验证 Android list 文件是否存在。

2) 将.aar 文件复制到 Assets\Plugins\Android 文件夹。

就是这样! Unity 现在将模块的 list 文件合并到它自己的 list 中。您可以在 Unity 项目的 Temp\StagingArea 中找到生成的 list 文件。

一件非常重要的事情是确保您的 <service>元素包含服务类的完全限定名称,即包名 + 类名:

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

有关此方法的示例,您可以在 Unity 中创建一个空项目并安装 Google Cast Remote Display android plugin来自 Assets 商店。你可以看到 google 已经把它的 .aar 文件放在 Assets > Plugins > Android 下,这个文件包含:

enter image description here

下面是这个 list 的内容:

enter image description here

关于android - Unity 忽略 android 插件 list 文件,导致其 android list 中缺少 <service> 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43358536/

相关文章:

android - 如何在不单击按钮的情况下执行任何功能,只需在 edittext 中输入值?

android - 滚动时GridView的列不是直线

unity-game-engine - Unity3D 大场景中的点光源

c# - 如何使用网络客户端计算和显示下载速度?

ruby-on-rails-3 - 社交网络插件 + Rails 3

android - GridLayout 不显示

android - 在 "Always"对话框中选择 "Complete action using"选项时,应用程序强制关闭

java - Unity3D如何为android插件添加权限到AndroidManifest.xml

ios - Xcode - clang 失败,退出代码为 1。插件原因?

c# - ASP.NET MVC 中单独程序集中的 View