Jenkins构建的APK在真实Android TV设备启动崩溃问题求助
Jenkins构建APK在Android TV设备启动崩溃问题解决(Jacoco相关)
Jenkins构建任务执行成功,但将生成的APK安装到真实Android TV设备后启动即崩溃,错误日志核心内容为:
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/jacoco/agent/rt/internal_773e439/Offline;
完整崩溃日志如下:
2023-08-17 16:29:16.608 29114-29114/tv.airtel.xstream.tvapp.debug E/AndroidRuntime: FATAL EXCEPTION: main Process: tv.airtel.xstream.tvapp.debug, PID: 29114 java.lang.NoClassDefFoundError: Failed resolution of: Lorg/jacoco/agent/rt/internal_773e439/Offline; at com.airtel.vision.AtvSdk.$jacocoInit(Unknown Source:13) at com.airtel.vision.AtvSdk.(Unknown Source:0) at tv.airtel.xstream.config.di.AppModuleKt$appModule$1$2.invoke(AppModule.kt:20) at tv.airtel.xstream.config.di.AppModuleKt$appModule$1$2.invoke(Unknown Source:2) at org.kodein.di.bindings.Singleton$getFactory$1$1$1.invoke(standardBindings.kt:134) at org.kodein.di.bindings.SingletonReference.make(references.kt:34) at org.kodein.di.bindings.Singleton$getFactory$1$1.invoke(standardBindings.kt:134) at org.kodein.di.bindings.Singleton$getFactory$1$1.invoke(standardBindings.kt:99) at org.kodein.di.bindings.MultiItemScopeRegistry.getOrCreate(scopes.kt:62) at org.kodein.di.bindings.Singleton$getFactory$1.invoke(standardBindings.kt:134) at org.kodein.di.bindings.Singleton$getFactory$1.invoke(standardBindings.kt:99) at org.kodein.di.KodeinContainer$provider$$inlined$toProvider$1.invoke(curry.kt:14) at org.kodein.di.KodeinAwareKt$Instance$1.invoke(KodeinAware.kt:152) at org.kodein.di.KodeinProperty$provideDelegate$1.invoke(properties.kt:39) at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74) at tv.airtel.xstream.PlayApplication.getAtvSdk(Unknown Source:7) at tv.airtel.xstream.PlayApplication.initAtv(PlayApplication.kt:56) at tv.airtel.xstream.PlayApplication.onCreate(PlayApplication.kt:48) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1154) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5882) at android.app.ActivityThread.access$1100(ActivityThread.java:200) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1651) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6680) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: java.lang.ClassNotFoundException: Didn't find class "org.jacoco.agent.rt.internal_773e439.Offline" on path: DexPathList[[zip file "/system/framework/android.test.mock.jar", zip file "/system/framework/android.test.runner.jar", zip file "/data/app/tv.airtel.xstream.tvapp.debug--k_aipq4ftZEc1641nrz7w==/base.apk"],nativeLibraryDirectories=[/data/app/tv.airtel.xstream.tvapp.debug--k_aipq4ftZEc1641nrz7w==/lib/arm, /system/lib, /product/lib]]
问题分析
这个错误源于Jacoco代码覆盖率工具的插桩代码在运行时找不到对应依赖类。Jacoco插桩会在类中注入$jacocoInit方法,但如果APK未包含Jacoco的agent运行时依赖,就会触发NoClassDefFoundError。
责任区分与解决方案
1. Jenkins构建配置问题(优先排查)
- 检查Jenkins构建命令是否误触发Jacoco插桩任务:比如构建debug包时是否额外执行了
jacocoTestReport,或启用了测试覆盖率收集参数,但对应构建变体未配置Jacoco依赖。 - 确认Jenkins构建的是正确变体:避免将用于本地测试、带Jacoco插桩的debug包直接用于真机测试,应构建不含测试插桩的测试包或正式包。
2. Gradle配置调整(需开发者修改)
若需在真机测试的构建变体中保留Jacoco功能,需调整模块级build.gradle配置:
- 限制Jacoco仅在测试阶段启用:
jacoco { toolVersion = "0.8.7" // 匹配项目使用的Jacoco版本 } android { buildTypes { debug { testCoverageEnabled = true // 仅在单元/UI测试时启用覆盖率收集 } release { testCoverageEnabled = false } } }
- 添加Jacoco运行时依赖(仅针对需要插桩的变体):
dependencies { debugImplementation 'org.jacoco:org.jacoco.agent:0.8.7:runtime' }
- 排除第三方SDK的Jacoco插桩:如果日志中的
AtvSdk是第三方预编译库,避免对其插桩导致依赖缺失:
android { buildTypes { debug { jacoco { excludes = ['com.airtel.vision.**'] } } } }
总结
该问题属于构建配置问题,无需修改业务代码,只需调整Jenkins构建命令或项目Gradle中的Jacoco配置,确保插桩代码能找到对应的运行时依赖即可。
内容的提问来源于stack exchange,提问作者tahreem anwar
相关产品推荐
相关产品推荐

