繁体   English   中英

如何使用 Unity 导出的 Android 库作为 AAR?

[英]How to use Unity exported Android library as an AAR?

我得到了一个 Unity 项目,这是一个在 android 上运行的 AR 游戏。 该应用程序运行良好,直接从 Unity 构建和运行,如果我将其导出为 android 库并使用 Android Studio 构建,它也运行良好。 不幸的是,导出库的格式不适用于我们的预期用例; 它创建了一个名为 unityLibrary 的模块,其中包含源代码和依赖项,但我想通过 artifactory 将 unityLibrary 提供为 package,因此我需要将 unityLibrary 模块转换为 AAR。 在对 unityLibrary Manifest 进行一些小的修改后,我可以使用通常的gradlew assemble来执行此操作,然后我可以通过将 AAR 拖放到项目的libs文件夹中,然后使用implementation(name: "unityLibrary-debug" ext: "aar")

该应用程序此时大部分工作正常,但游戏的 AR 部分不起作用,摄像头画面完全黑屏。 在 adb 日志中有以下错误:

2020-05-27 01:53:55.667 8661-8744/com.mokriya.aarapp E/Unity: DllNotFoundException: Unable to load DLL 'UnityARCore': The specified module could not be found.
      at UnityEngine.XR.ARCore.ARCoreSessionSubsystem+NativeApi.UnityARCore_session_construct (UnityEngine.XR.ARCore.ARCoreSessionSubsystem+NativeApi+CameraPermissionRequestProviderDelegate cameraPermissionRequestProvider) [0x00000] in <00000000000000000000000000000000>:0 
      at UnityEngine.XR.ARCore.ARCoreSessionSubsystem+Provider..ctor (UnityEngine.XR.ARCore.ARCoreSessionSubsystem subsystem) [0x00000] in <00000000000000000000000000000000>:0 
      at UnityEngine.XR.ARCore.ARCoreSessionSubsystem.CreateProvider () [0x00000] in <00000000000000000000000000000000>:0 
      at UnityEngine.XR.ARSubsystems.XRSessionSubsystem..ctor () [0x00000] in <00000000000000000000000000000000>:0 
      at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) [0x00000] in <00000000000000000000000000000000>:0 
      at System.Activator.CreateInstance (System.Type type, System.Boolean nonPublic) [0x00000] in <0000000
2020-05-27 01:53:55.685 8661-8744/com.mokriya.aarapp E/Unity: DllNotFoundException: Unable to load DLL 'UnityARCore': The specified module could not be found.
      at UnityEngine.XR.ARCore.ARCoreCameraSubsystem+NativeApi.UnityARCore_Camera_Construct (System.Int32 mainTexPropertyNameId) [0x00000] in <00000000000000000000000000000000>:0 
      at UnityEngine.XR.ARCore.ARCoreCameraSubsystem.CreateProvider () [0x00000] in <00000000000000000000000000000000>:0 
      at UnityEngine.XR.ARSubsystems.XRCameraSubsystem..ctor () [0x00000] in <00000000000000000000000000000000>:0 
      at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) [0x00000] in <00000000000000000000000000000000>:0 
      at System.Activator.CreateInstance (System.Type type, System.Boolean nonPublic) [0x00000] in <00000000000000000000000000000000>:0 
      at UnityEngine.SubsystemDescriptor`1[TSubsystem].Create () [0x00000] in <00000000000000000000000000000000>:0 
      at UnityEngine.XR.ARFoundation.SubsystemLifecycleManager`2[TSubsystem,TSubsystemDescriptor].CreateSubsystemIfNecessary () [0x
2020-05-27 01:53:55.759 8661-8744/com.mokriya.aarapp E/Unity: Unable to find FirebaseCppApp-6_12_0
2020-05-27 01:53:55.775 8661-8744/com.mokriya.aarapp E/Unity: DllNotFoundException: Unable to load DLL 'FirebaseCppApp-6_12_0': The specified module could not be found.
      at Firebase.AppUtilPINVOKE+SWIGExceptionHelper.SWIGRegisterExceptionCallbacks_AppUtil (Firebase.AppUtilPINVOKE+SWIGExceptionHelper+ExceptionDelegate applicationDelegate, Firebase.AppUtilPINVOKE+SWIGExceptionHelper+ExceptionDelegate arithmeticDelegate, Firebase.AppUtilPINVOKE+SWIGExceptionHelper+ExceptionDelegate divideByZeroDelegate, Firebase.AppUtilPINVOKE+SWIGExceptionHelper+ExceptionDelegate indexOutOfRangeDelegate, Firebase.AppUtilPINVOKE+SWIGExceptionHelper+ExceptionDelegate invalidCastDelegate, Firebase.AppUtilPINVOKE+SWIGExceptionHelper+ExceptionDelegate invalidOperationDelegate, Firebase.AppUtilPINVOKE+SWIGExceptionHelper+ExceptionDelegate ioDelegate, Firebase.AppUtilPINVOKE+SWIGExceptionHelper+ExceptionDelegate nullReferenceDelegate, Firebase.AppUtilPINVOKE+SWIGExceptionHelper+ExceptionDelegate outOfMemoryDelegate, Firebase.AppUtilPINVOKE+SWIGExceptionHelper+ExceptionDelegate overflowDelegate

所以,我不明白为什么在使用 AAR 时应该存在在运行时找不到的任何依赖项,当库作为具有源和依赖项的库模块给出时,这些依赖项在库中找到。 有没有人知道为什么会这样? 或者有没有人有关于如何进一步解决这个问题的提示?

我有完全相同的问题,我可以回答你的一些问题。

因此,我不明白为什么在使用 AAR 时应该存在在运行时找不到的任何依赖项,当库作为具有源和依赖项的库模块提供时,在库中找到这些相同的依赖项

发生的事情是,当您创建 aar 时,库的依赖项本身被排除在外。 由 aar 的用户确保提供 aar 所需的依赖项。

这实际上意味着使用 Unity aar(您的用户项目)的项目还需要添加对来自unityLibrary/libs的 jars 和 aars 的依赖项。

在您的用户项目中,例如:

// The unity game itself
implementation 'com.example:myunitygame:1.0.0'
// The dependencies for the unity game
implementation 'com.unity:unityarcore:1.0.0'
implementation 'com.example:whatever:1.0.0'
... // etc. Make sure you include all the jars and aars from `unityLibrary/libs`

另一种选择是使用“fat-aar” - 这是您的 aar 确实包含其所有依赖项的替代方案。 它与“胖罐”的想法相同,您可以在此处阅读: 什么是胖 JAR?

原生不支持胖 aars,但您可以尝试使用https 之类的插件://github.com/kezong/fat-aar-android

我使用这个 fat aar 插件取得了成功——我的用户项目仅依赖于导出的 Unity 项目的单个 fat aar。

当您构建 unityLibrary 以生成.aar 时,您会注意到如果单击它并且 go 看到文件的内容,它不包含依赖项。 因此,您需要将它们添加到您的项目 /libs 文件夹中。 您还需要在 gradle 文件中包含该文件夹。

implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])

这些是我所缺少的:

  • arcore_client.aar
  • ARPresto.aar
  • unitiandroidpermissions.aar
  • UnityARCore.aar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM