2

通常,必须将其转换为库才能将其嵌入到另一个应用程序中。但是,现在我想将其转换为动态功能。

我把它放在了 Unity 项目的清单中:

<dist:module
    dist:onDemand="true"
    dist:title="@string/title_gamejam_as_dynamic_feature">
  <dist:fusing dist:include="true" />
</dist:module>

另外,我已经注释掉了bundle{}它的 Gradle 文件的一部分。如果我没有对此发表评论,我最终会收到以下错误:

Could not find method bundle() for arguments [build_9piysgasfu4pgl4v1ppx46cyn$_run_closure3$_closure12@44175a08] on object of type com.android.build.gradle.AppExtension.

我还确保UnityPlayerActivity那里扩展了我AppCompatActivity使用 的自定义SplitCompat.install(this)[虽然它扩展了Activity]。

现在我的问题是,由于某种原因Assets,Unity 项目没有在基础 APK 中注册,所以UnityPlayerActivity最终在启动时崩溃。

我究竟做错了什么?

编辑:错误堆栈跟踪如下:

01-15 03:48:18.343 15446-15522/? E/mono: The assembly mscorlib.dll was not found or could not be loaded.
01-15 03:48:18.343 15446-15522/? E/mono: It should have been installed in the `/data/app/test.com.ondemandtest-1/base.apk/assets/bin/Data/Managed/mono/4.5/mscorlib.dll' directory.
01-15 03:48:18.343 15446-15446/? E/CRASH: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
01-15 03:48:18.343 15446-15446/? E/CRASH: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-15 03:48:18.343 15446-15446/? E/CRASH: Build type 'Release', Scripting Backend 'mono', CPU 'armeabi-v7a'
01-15 03:48:18.343 15446-15446/? E/CRASH: Build fingerprint: 'Huawei/ALE-L21/hwALE-H:5.0.1/HuaweiALE-L21/C636B150:user/release-keys'
01-15 03:48:18.343 15446-15446/? E/CRASH: Revision: '0'
01-15 03:48:18.343 15446-15446/? E/CRASH: pid: 15446, tid: 15446, name: om.ondemandtest  >>> test.com.ondemandtest <<<
01-15 03:48:18.343 15446-15446/? E/CRASH:     r0 00000000  r1 ffc2fb10  r2 6f5aec60  r3 00000000
01-15 03:48:18.343 15446-15446/? E/CRASH:     r4 ffc2fb10  r5 e22c0250  r6 00000000  r7 6f5aec60
01-15 03:48:18.343 15446-15446/? E/CRASH:     r8 ffc2fad4  r9 ab3f7930  sl ffc2fa9f  fp ffc2fa50
01-15 03:48:18.343 15446-15446/? E/CRASH:     ip e1fafee8  sp ffc2fa40  lr e1fb0040  pc e1fafca8  cpsr 00003c56
01-15 03:48:18.343 15446-15446/? E/CRASH: backtrace:

编辑2:

经过进一步检查,我发现它mscorlib.dll不在mono.so 文件中,而是在 Assets 文件夹中。将 Unity 项目复制assets/bin/Data/...到基础项目中(复制到完全相同的路径中)是可行的……但这只是破坏了模块化的意义。

Unity 项目有什么方法可以使用它带来的 Assets 而无需在部署之前将其复制到 Base APK 中?

4

1 回答 1

0

Unity 正在.dllbase.apk 中搜索您,这不是您想要的,因为您使用的是动态功能

getPackageCodePath()我通过覆盖我的 UnityPlayerActivity 来解决它:

override fun getPackageCodePath(): String {
    return super.getPackageCodePath().replace("base.apk", "split_unity_module.apk")
}

PS:我的模块已命名unity_module,因此 .apk 的名称类似于split_{{your_module_name}}.apk

于 2021-01-22T10:32:24.283 回答