【问题标题】:Unity3D and aar issueUnity3D和aar问题
【发布时间】:2017-06-28 13:11:19
【问题描述】:

我必须为 Unity3D 构建一个 aar 模块,但是这样做的问题太多了。

我的工作环境

Unity3D:5.6.f1
Android Studio:2.3.3
构建工具:25.0.2
SDK工具:24.4

我已经建立了一个aar文件并解压它以删除libs中的classes.jar,然后我将aar文件和AndroidManifest.xml复制到asset\Plugins\Android。 android项目和unity项目的包名是一样的。

之后构建 APK 文件,导致以下异常:

IOException: Failed to Move File / Directory from 'Temp/StagingArea/android-libraries/app-debug/classes.jar' to 'Temp/StagingArea/android-libraries/app-debug/libs/classes.jar'.
UnityEditor.Android.PostProcessor.Tasks.ProcessAAR.Execute (UnityEditor.Android.PostProcessor.PostProcessorContext context)
UnityEditor.Android.PostProcessor.PostProcessRunner.RunAllTasks (UnityEditor.Android.PostProcessor.PostProcessorContext context)
UnityEditor.Android.PostProcessAndroidPlayer.PostProcess (BuildTarget target, System.String stagingAreaData, System.String stagingArea, System.String playerPackage, System.String installPath, System.String companyName, System.String productName, BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry)
UnityEditor.Android.AndroidBuildPostprocessor.PostProcess (BuildPostProcessArgs args)
UnityEditor.PostprocessBuildPlayer.Postprocess (BuildTargetGroup targetGroup, BuildTarget target, System.String installPath, System.String companyName, System.String productName, Int32 width, Int32 height, System.String downloadWebplayerUrl, System.String manualDownloadWebplayerUrl, BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry, UnityEditor.BuildReporting.BuildReport report) (at /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPipeline/PostprocessBuildPlayer.cs:186)
UnityEditor.HostView:OnGUI()

我一直在寻找答案 3 天,我已经尝试了我在网上找到的所有内容,请帮助!

我很确定 aar 文件 libs 文件夹中没有任何内容

【问题讨论】:

  • 两个问题,1.为什么要从aar文件中删除libs中的classes.jar? 2.为什么Android项目和unity项目的包名是一样的?在您回复之前,请注意,如果插件是 .arr,您不需要提取 AndroidManifest 文件。仅当它是 .jar 插件时才需要。所以不要修改 .arr 文件。只需将其放入您的Assets/Plugins/Android 文件夹即可。
  • 1.几乎所有关于这个问题的文章都说Unity会自动将它的classes.jar添加到aar文件的libs文件夹中,所以如果你不删除它,它会导致一些问题。 2.我注意到aar中有一个AndroidManifest文件,但是很多文章说我必须复制它。我试过你的方法,建立一个aar文件并复制到Assets/Plugins/Android,问题仍然存在。
  • 2.如果它是一个arr插件,你不必这样做。注意到您在插件中使用了 Unity 的 classes.jar。您有什么理由将它包含在您的 Android 项目中吗?如果您不使用UnityPlayer.UnitySendMessage 函数,则不需要它。你也可以创建一个新项目,然后按照我提到的方式再试一次。
  • 另外,看看我的回答

标签: android unity3d


【解决方案1】:

从 Android Studio 中找到您的 Build.gradle 文件,查找捆绑 classes.jar 文件的任何命令。

根据您的 Android Studio 项目的生成方式,它应该如下所示:

compile files('libs/jars/classes.jar')

compile fileTree(dir: 'libs', include: ['*.jar'])

只需将“compile”替换为“provided”关键字

provided files('libs/jars/classes.jar')

或者

provided fileTree(dir: 'libs', include: ['*.jar'])

这将使 Android Studio 从最终的 arr 插件构建中排除 .jar 插件。您现在可以再次构建插件并将其传输到Assets/Plugins/Android 文件夹。我建议您在新项目中这样做,以确保任何地方都没有重复。

您也可以通过右键单击 classes.jar 插件进入 Module Settings 并将其设置为 Provided 依赖项选项卡。

注意:

您不需要手动将 AndroidManifest.xml 文件添加到 Unity 项目,因为如果这是一个 arr 插件,Unity 将自动完成此操作。如果这是一个 jar 插件,您只需要这样做。虽然,如果您仍然遇到权限问题,请手动执行此操作。

【讨论】:

  • 这工作完美而优雅。谢谢你。在较新的 gradle 版本中,我们现在可以使用 compileOnly 来避免 Configuration 'provided' is obsolete and has been replaced with 'compileOnly'. It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html 警告。
【解决方案2】:

您只需解压缩 Assets/Plugins/Android 中的 classes.jar 文件,然后通过 AndroidJavaClassAndroidJavaObject 的对象调用您需要的任何函数。

如果您想访问 android-module 中的类,只需要 .jar 文件。我已经多次使用这种技术了。

PS:Unity 会使用 Google 的清单合并工具自动合并清单

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多