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

How to use Unity exported Android library as an AAR?

我得到了一个 Unity 项目,这是一个在 android 上为 运行 制作的 AR 游戏。该应用程序 运行 与 Build 和 运行 直接来自 Unity,如果我将其导出为 android 库并使用 Android Studio 构建,它也 运行胀。不幸的是,导出库的格式不适用于我们的预期用例;它创建了一个名为 unityLibrary 的模块,其中包含源代码和依赖项,但我想通过 artifactory 将 unityLibrary 作为一个包提供,因此我需要将 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 时应该有任何在 运行 时找不到的依赖项,而当库作为具有源和依赖项的库模块。有没有人知道为什么会这样?或者有没有人提供有关如何进一步解决此问题的提示?

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

So, I don't understand why there should be any dependencies that aren't found at runtime when using an AAR, when those same dependencies are found with the library when it is given as a library module with source and dependencies

发生的事情是,当你制作 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 确实包含了它自己的所有依赖项。它与 'fat jar' 的想法相同,您可以在此处阅读:What is a fat JAR?

Fat aars 本身不支持,但你可以试试 https://github.com/kezong/fat-aar-android

这样的插件

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

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

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

这些是我所缺少的:

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