关于dalvik.system.BaseDexClassLoader.findClass引发ClassNotFoundException崩溃的求助
偶发ClassNotFoundException:androidx.profileinstaller.ProfileInstallerInitializer 问题排查
我查阅过若干关于dalvik.system.BaseDexClassLoader.findClass的相关帖子,但它们的堆栈跟踪信息差异明显。该崩溃情况十分罕见但仍会偶发,且堆栈跟踪中未出现任何应用自身代码,因此似乎与应用代码无关。本次崩溃发生在Skyworth Metz 2K电视设备上,崩溃详情如下:
Crash details dalvik.system.BaseDexClassLoader.findClass java.lang.ClassNotFoundException Exception java.lang.RuntimeException: at android.app.ActivityThread.installProvider (ActivityThread.java:6445) at android.app.ActivityThread.installContentProviders (ActivityThread.java:5987) at android.app.ActivityThread.handleBindApplication (ActivityThread.java:5902) at android.app.ActivityThread.access$1100 (ActivityThread.java:200) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1656) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loop (Looper.java:193) at android.app.ActivityThread.main (ActivityThread.java:6718) at java.lang.reflect.Method.invoke at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858) Caused by y0.c: java.lang.ClassNotFoundException: androidx.profileinstaller.ProfileInstallerInitializer at androidx.startup.AppInitializer.discoverAndInitialize (AppInitializer.java:242) at androidx.startup.AppInitializer.discoverAndInitialize (AppInitializer.java:206) at androidx.startup.InitializationProvider.onCreate (InitializationProvider.java:45) at android.content.ContentProvider.attachInfo (ContentProvider.java:1920) at android.content.ContentProvider.attachInfo (ContentProvider.java:1895) at android.app.ActivityThread.installProvider (ActivityThread.java:6440) Caused by java.lang.ClassNotFoundException: androidx.profileinstaller.ProfileInstallerInitializer at java.lang.Class.classForName at java.lang.Class.forName (Class.java:453) at java.lang.Class.forName (Class.java:378) at androidx.startup.AppInitializer.discoverAndInitialize (AppInitializer.java:224) Caused by java.lang.ClassNotFoundException: at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:134) at java.lang.ClassLoader.loadClass (ClassLoader.java:379) at java.lang.ClassLoader.loadClass (ClassLoader.java:312)
排查方向与解决方案
1. 确认Profile Installer依赖与混淆规则
- 检查项目中是否引入了
androidx.profileinstaller:profileinstaller依赖,确保版本与AndroidX Startup依赖兼容。若依赖缺失,在build.gradle中添加对应版本的依赖:implementation "androidx.profileinstaller:profileinstaller:1.3.1" // 使用适配项目的版本 - 若启用了R8/ProGuard,添加规则避免类被混淆或删除:
-keep class androidx.profileinstaller.ProfileInstallerInitializer { *; } -keep class androidx.profileinstaller.** { *; }
2. 禁用ProfileInstaller的自动初始化
如果不需要ProfileInstaller的性能分析功能,可直接禁用其自动初始化,绕过类加载步骤:
在AndroidManifest.xml中添加以下配置,移除默认的Initializer注册:
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <meta-data android:name="androidx.profileinstaller.ProfileInstallerInitializer" tools:node="remove" /> </provider>
3. 排查设备端Dex异常
由于崩溃仅发生在特定电视设备上,可能是设备Dex优化或存储问题:
- 引导用户清除应用缓存与数据后重新安装,修复可能损坏的Dex文件。
- 检查设备系统版本,确认是否存在已知的Dex类加载bug,建议用户升级至最新系统版本。
4. 配置MultiDex确保类加载(若启用MultiDex)
若应用开启了MultiDex,需将ProfileInstallerInitializer纳入主Dex,避免启动时无法加载:
- 在
build.gradle中配置multiDexKeepFile:
创建android { defaultConfig { multiDexEnabled true } buildTypes { release { multiDexKeepFile file('multidex-config.txt') } } }multidex-config.txt文件,添加内容:androidx/profileinstaller/ProfileInstallerInitializer.class
内容的提问来源于stack exchange,提问作者Hong
相关产品推荐
相关产品推荐

