我在Android 4.4中运行时生成的jar中的java.lang.UnsatisfiedLinkError`

时间:2019-07-09 08:10:18

标签: java android android-4.4-kitkat

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

以下的所有设备禁用该功能

编辑1:

进一步调试,我发现我的单例类的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.*来创建了修复程序。随时提出更好的解决方案。

1 个答案:

答案 0 :(得分:0)

我已经等待了一段时间,以获取对该问题的适当答案。不幸的是,这不容易重现,并且可能是一个极端的情况,因为大多数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的情况下,黑客通常会进行初始化,而在高于5的情况下,则使用lazy-holder进行初始化