ANR问题求助:art::DexFile::FindClassDef触发无业务代码关联报错
Firebase Crashlytics上报ANR问题排查建议(ArtDexFileLoader相关)
从调用栈来看,这是应用启动阶段发生的ANR,核心卡在Android Runtime的Dex文件校验流程中,由ArtDexFileLoader加载Zip包中的Dex文件时触发,未关联业务代码或第三方库,可从以下方向排查:
调用栈详情
main (native):tid=1 systid=10067 #00 pc 0x18de0 libdexfile.so (art::DexFile::FindClassDef(art::dex::TypeIndex) const + 30) #01 pc 0x2484d libdexfile.so (art::dex::DexFileVerifier::CheckInterClassDefItem() + 536) #02 pc 0x2594d libdexfile.so (art::dex::DexFileVerifier::CheckInterSectionIterate(unsigned int, unsigned int, art::DexFile::MapItemType) + 216) #03 pc 0x25b1f libdexfile.so (art::dex::DexFileVerifier::CheckInterSection() + 186) #04 pc 0x25c1f libdexfile.so (art::dex::DexFileVerifier::Verify() + 130) #05 pc 0x26219 libdexfile.so (art::dex::Verify(art::DexFile const*, unsigned char const*, unsigned int, char const*, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*) + 140) #06 pc 0x1c2db libdexfile.so (art::DexFileLoader::OpenCommon(unsigned char const*, unsigned int, unsigned char const*, unsigned int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int, art::OatDexFile const*, bool, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::unique_ptr<art::DexFileContainer, std::__1::default_delete<art::DexFileContainer> >, art::DexFileLoader::VerifyResult*) + 198) #07 pc 0x15ea7 libdexfile.so (art::ArtDexFileLoader::OpenOneDexFileFromZip(art::ZipArchive const&, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, art::DexFileLoaderErrorCode*) const + 686) #08 pc 0x159cf libdexfile.so (art::ArtDexFileLoader::OpenAllDexFilesFromZip(art::ZipArchive const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::vector<std::__1::unique_ptr<art::DexFile const, std::__1::default_delete<art::DexFile const> >, std::__1::allocator<std::__1::unique_ptr<art::DexFile const, std::__1::default_delete<art::DexFile const> > > >*) const + 298) #09 pc 0x157cb libdexfile.so (art::ArtDexFileLoader::OpenZip(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::vector<std::__1::unique_ptr<art::DexFile const, std::__1::default_delete<art::DexFile const> >, std::__1::allocator<std::__1::unique_ptr<art::DexFile const, std::__1::default_delete<art::DexFile const> > > >*) const + 154) #10 pc 0x15531 libdexfile.so (art::ArtDexFileLoader::OpenWithMagic(unsigned int, int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::vector<std::__1::unique_ptr<art::DexFile const, std::__1::default_delete<art::DexFile const> >, std::__1::allocator<std::__1::unique_ptr<art::DexFile const, std::__1::default_delete<art::DexFile const> > > >*) const + 208) #11 pc 0x1543d libdexfile.so (art::ArtDexFileLoader::Open(char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::vector<std::__1::unique_ptr<art::DexFile const, std::__1::default_delete<art::DexFile const> >, std::__1::allocator<std::__1::unique_ptr<art::DexFile const, std::__1::default_delete<art::DexFile const> > > >*) const + 96) #12 pc 0x3ac709 libart.so (art::OatFileManager::OpenDexFilesFromOat(char const*, _jobject*, _jobjectArray*, art::OatFile const**, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >*) + 3032) #13 pc 0x373a09 libart.so (art::DexFile_openDexFileNative(_JNIEnv*, _jclass*, _jstring*, _jstring*, int, _jobject*, _jobjectArray*) + 92) at dalvik.system.DexFile.openDexFileNative(Native method) at dalvik.system.DexFile.openDexFile(DexFile.java:367) at dalvik.system.DexFile.<init>(DexFile.java:109) at dalvik.system.DexFile.<init>(DexFile.java:82) at dalvik.system.DexPathList.loadDexFile(DexPathList.java:439) at dalvik.system.DexPathList.makeDexElements(DexPathList.java:398) at dalvik.system.DexPathList.<init>(DexPathList.java:166) at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:129) at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:104) at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:74) at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:87) at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:116) at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:114) at android.app.ApplicationLoaders.getClassLoaderWithSharedLibraries(ApplicationLoaders.java:60) at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:907) at android.app.LoadedApk.getClassLoader(LoadedApk.java:964) at android.app.LoadedApk.getResources(LoadedApk.java:1196) at android.app.ContextImpl.createAppContext(ContextImpl.java:2672) at android.app.ContextImpl.createAppContext(ContextImpl.java:2664) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6921) at android.app.ActivityThread.access$1700(ActivityThread.java:263) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2057) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:236) at android.app.ActivityThread.main(ActivityThread.java:8097) at java.lang.reflect.Method.invoke(Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:620) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1011)
排查方向
- 验证APK完整性:用户设备上的APK可能在下载或安装过程中损坏,导致Dex文件结构异常。可引导用户重新下载安装,或在测试环境中校验APK签名与哈希值。
- 排查系统版本兼容性:查看崩溃设备的Android版本分布,部分旧版本(如Android 8.x/9.x)的Art Runtime存在Dex校验的已知bug,可针对性在对应版本设备上复现测试。
- 检查打包配置:若应用开启了代码混淆(R8/ProGuard)、多Dex或自定义打包流程,可能导致Dex文件生成异常。尝试关闭混淆打包测试,或更新Gradle插件、R8版本至最新稳定版。
- 排查动态加载/插件化:即使调用栈未显示,若应用使用插件化或动态加载框架,加载插件Dex时可能触发该问题。暂时禁用插件化功能测试,或检查插件Dex的打包规范。
- 定制ROM适配问题:部分厂商定制ROM修改了Art Runtime逻辑,可能导致Dex校验卡住。查看崩溃设备的品牌型号,是否集中在特定厂商机型上,针对性适配。
- 启用Art调试日志:在测试设备上通过命令
adb shell setprop debug.art.dex.verify all开启详细Dex校验日志,获取具体报错的Dex文件或类信息,缩小排查范围。
内容的提问来源于stack exchange,提问作者Saman Sattari
相关产品推荐
相关产品推荐

