Instant Run导致ClassNotFoundException

本文记录了一个项目中出现的ClassNotFoundException问题,分析表明此问题是由于InstantRun导致。关闭InstantRun并重新打包后,问题得到解决。

最近一个项目运行时出现了ClassNotFoundException,感觉有点像是64k问题,但很快排除了。

而此处这个问题是apk文件在经过某种签名后才有,没有这种签名就不会出现。

最后关闭了AS中的Instant Run,重新打包才解决了这个问题。

Instant Run虽好,使用需谨慎。

这个issue在AOSP上也有很多问答:https://code.google.com/p/android/issues/detail?id=199327

2025-07-28 17:17:24.640 4997-4997/? E/LoadedApk: Unable to instantiate appComponentFactory java.lang.ClassNotFoundException: Didn't find class "androidx.core.app.CoreComponentFactory" on path: DexPathList[[zip file "/data/app/~~oocBzTKzJzrykXxwo2pUUw==/com.tencent.nba2kol-EEy-nw9eiTduuLYyKIP8qw==/base.apk"],nativeLibraryDirectories=[/data/app/~~oocBzTKzJzrykXxwo2pUUw==/com.tencent.nba2kol-EEy-nw9eiTduuLYyKIP8qw==/lib/arm64, /data/app/~~oocBzTKzJzrykXxwo2pUUw==/com.tencent.nba2kol-EEy-nw9eiTduuLYyKIP8qw==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:218) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at android.app.LoadedApk.createAppFactory(LoadedApk.java:282) at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:995) at android.app.LoadedApk.getClassLoader(LoadedApk.java:1082) at android.app.LoadedApk.getResources(LoadedApk.java:1330) at android.app.ContextImpl.createAppContext(ContextImpl.java:3068) at android.app.ContextImpl.createAppContext(ContextImpl.java:3060) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7057) at android.app.ActivityThread.access$1800(ActivityThread.java:284) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2277) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:233) at android.os.Looper.loop(Looper.java:334) at android.app.ActivityThread.main(ActivityThread.java:8344) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1065) --------- beginning of crash
最新发布
07-30
在 Android 应用中,出现 `ClassNotFoundException` 抛出的崩溃问题,例如 `Unable to instantiate appComponentFactory: androidx.core.app.CoreComponentFactory`,通常是由于类路径配置错误、依赖项缺失或构建配置异常导致的。 ### 原因分析 1. **依赖库未正确引入** `androidx.core.app.CoreComponentFactory` 是 AndroidX 库的一部分。如果项目未正确引入 `androidx.core:core` 相关依赖,运行时会无法找到该类,从而抛出 `ClassNotFoundException` [^1]。 2. **Gradle 构建缓存问题** 在某些情况下,构建缓存可能未正确更新,导致最终的 APK 中未包含所需的类文件。这类问题通常出现在构建过程中依赖版本变更或模块结构发生调整时 [^4]。 3. **Instant Run 或 Build Cache 导致的问题** Android Studio 的 Instant Run 功能在某些设备(例如 OPPO 手机)上可能引发类加载异常,因为生成的 APK 并未包含完整的类路径 [^4]。 4. **混淆配置错误** 如果启用了 ProGuard 或 R8 混淆工具,并且未正确配置保留 `CoreComponentFactory` 相关类,可能在发布版本中导致类被错误移除 [^1]。 ### 解决方案 1. **检查并添加依赖** 确保 `build.gradle` 文件中包含必要的 AndroidX 依赖项。例如: ```gradle implementation 'androidx.core:core:1.9.0' ``` 确保使用最新版本或与项目兼容的版本号 。 2. **清理项目并重建** 使用以下命令清理项目并重新构建: ```bash ./gradlew clean ./gradlew build ``` 这有助于解决由于构建缓存导致的类缺失问题 [^4]。 3. **禁用 Instant Run** 如果使用的是较旧版本的 Android Studio,建议禁用 Instant Run: - 打开 Settings(`File > Settings`)。 - 进入 `Build, Execution, Deployment > Instant Run`。 - 取消勾选 `Enable Instant Run` [^4]。 4. **检查 ProGuard/R8 配置** 如果启用了代码混淆,确保在 `proguard-rules.pro` 中添加了以下规则以防止类被移除: ```proguard -keep class androidx.core.app.CoreComponentFactory { *; } ``` 5. **检查 Gradle 插件版本** 确保使用的 Gradle 插件版本与 AndroidX 兼容。例如: ```gradle classpath 'com.android.tools.build:gradle:7.4.2' ``` 同时确认 `gradle-wrapper.properties` 中的 Gradle 版本也与插件兼容 。 6. **迁移至 AndroidX(如未完成)** 如果项目未完全迁移到 AndroidX,可能会导致类加载异常。运行以下命令以确保迁移完成: ```bash ./gradlew android.useAndroidX=true ./gradlew android.enableJetifier=true ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值