我有一个使用maven构建的jar。构建jar的项目没有本地依赖项。除了少数具有android 4.4.24.4.4的设备,它在所有设备上均可正常运行。有人可以帮我吗,现在我的选择是禁用5.0以下所有设备的功能

编辑1:

进一步调试时,我发现我的singleton类的LazyHolder实现失败,因为在运行时构造函数无法解析静态类。

Caused by java.lang.UnsatisfiedLinkError: <muted>
       at com.a.b.controller.Controller.getInstance + 31(Controller.java:31)
       at com.a.b.controller.Controller.k + 184(Controller.java:184)
       at com.a.b.core.parser.f.m + 53(ff.java:53)
       at com.a.b.core.parser.f.n + 67(f.java:67)
       at a.b.c.d.e$classify$$inlined$use$lambda$1.invokeSuspend(e.java:90)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith + 32(BaseContinuationImpl.java:32)
       at kotlinx.coroutines.DispatchedTask.run + 233(DispatchedTask.java:233)
       at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely + 594(CoroutineScheduler.java:594)
       at kotlinx.coroutines.scheduling.CoroutineScheduler.access$getSchedulerName$p + 60(CoroutineScheduler.java:60)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run + 742(CoroutineScheduler.java:742)



编辑2:

我通过将android版本传入jar来创建修复程序,然后对小于LazyHolder或更小的版本不使用4.4.*。随时提出更好的解决方案。

最佳答案

我已经等待了一段时间,以得到对该问题的适当答案。不幸的是,这不容易重现,并且可能是一个极端的情况,因为大多数android开发人员并不关心版本4或更低版本。因此,我决定将我所有的发现作为对这个问题的答案。

在我的场景中,我使用LazyHolder(https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom)实现来初始化我的中央对象。但是问题是当在Android 4.4。*设备上运行时,惰性持有者无法获取静态类。该类在运行时不可用。我在Android 4.4.2设备上以调试模式运行了该应用程序,并能够清楚地指出这一点。

进一步阅读,我发现静态类可能正在进入另一个dex文件,而我的构造函数却完全在另一个文件中(当在4.4。*中启用multiDex时,这很常见)。

最后,在android版本小于5的情况下,hack可以正常初始化;在高于5的情况下,可以使用lazy-holder进行初始化。

10-06 08:47