You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tinylog 2.5.x在Android 4.4 API19上抛出VerifyError异常咨询

tinylog 2.5.x在Android 4.4(API 19)触发VerifyError的解决方法

问题表现

  • 升级tinylog至2.5.0-M1.1、2.5.0-M2版本后,在*Android 4.4(API 19)*设备上调用ThreadContext.put()或org.tinylog.Logger.tag()方法时直接抛出VerifyError崩溃,更高版本Android设备运行无异常。
  • 降级到2.4.1版本异常消失,但该版本不支持业务需要的DynamicPolicy特性,无法通过降级规避。
  • 官方文档未标注2.5版本的最低Android API要求,应用侧无直接绕过异常的手段。

异常堆栈

E/AndroidRuntime: FATAL EXCEPTION: main
Process: ru.wsoft.push.sample, PID: 6609
java.lang.VerifyError: org/tinylog/configuration/JndiValueResolver
    at org.tinylog.configuration.Configuration.<clinit>(Configuration.java:64)
    at org.tinylog.provider.ProviderRegistry.loadLoggingProvider(ProviderRegistry.java:87)
    at org.tinylog.provider.ProviderRegistry.<clinit>(ProviderRegistry.java:39)
    at org.tinylog.ThreadContext.<clinit>(ThreadContext.java:32)
    at ru.wings.push.sdk.logging.b.a(Unknown Source)
    at ru.wings.push.sdk.logging.b.a(Unknown Source)
    at ru.wings.push.sdk.logging.b.a(Unknown Source)
    at e.a.a(Unknown Source)
    at e.a.$r8$lambda$a3WCZYd0yZju55XeNNLHv5MIHVY(Unknown Source)
    at e.a$$ExternalSyntheticLambda0.onComplete(Unknown Source)
    at com.google.android.gms.tasks.zzj.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    at dalvik.system.NativeStart.main(Native Method)

根因分析

崩溃触发点是类加载阶段校验org.tinylog.configuration.JndiValueResolver失败:

  1. 该类依赖Java SE标准的JNDI接口,Android 4.4(API 19)的运行环境不存在JNDI相关类定义,Dalvik虚拟机在类校验阶段直接抛出VerifyError。
  2. tinylog 2.5的里程碑版本未对旧版Android做兼容处理,JNDI解析器作为默认加载的组件被提前初始化,直接触发崩溃。
  3. 2.5版本并未正式放弃Android 4.4支持,该问题属于里程碑版本的兼容性疏漏。

解决方法

直接在项目的ProGuard/R8混淆配置中添加以下规则,剔除Android环境下完全无用的JndiValueResolver类即可:

-dontwarn org.tinylog.configuration.JndiValueResolver
-assumenosideeffects class org.tinylog.configuration.JndiValueResolver {
    <init>(...);
    *;
}

添加规则后重新打包即可正常运行,DynamicPolicy等2.5版本新增特性不受任何影响——JndiValueResolver仅用于解析JNDI形式的配置值,Android环境下不存在JNDI服务,该类本身就是冗余代码。

如果不想配置混淆规则,也可以等2.5正式版发布,官方后续提交已经修复了该兼容问题:会将JNDI解析器改为可选加载,类不存在或校验失败时自动跳过,不会触发全局崩溃。


内容的提问来源于stack exchange,提问作者Gorbachew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:27:32