instant run 导致 ClassNotFoundException ,意外吧?

本文记录了一次解决ClassNotFoundException的问题经历,该问题仅出现在手动安装APK时。通过排查发现是由于Android Studio的Instant Run功能引起的,关闭该功能后问题得到解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Bug场景:

adb调试时 ,apk正常安装运行无问题。这个问题困扰了我1天。

然而我将apk移动到手机,手动安装运行时就会爆出ClassNotFoundException,异常日志如下:

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.wyb.arcgislocation1029.MapActivity" on path: DexPathList[[zip file "/data/app/com.example.wyb.arcgislocation1029-1/base.apk"],nativeLibraryDirectories=[/data/app/com.example.wyb.arcgislocation1029-1/lib/arm, /data/app/com.example.wyb.arcgislocation1029-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]


查到的原因和解决办法:

我查边所有资料,有很多说法:

1、 manifest中name路径书写不对的,但是这会在studio自动检查语法时就会报红,排除。

2、引用相同包,但版本不同。我没有引用包。

3、so包引用时,两个第三方库的 so包冲突:

成因第一部分:当项目里有arm-v7目录时,系统会严格遵循最优适配原则,当遇到arm-v7的cpu时,只去arm-v7目录查找so库。

成因第二部分:merge原则,当打包时,studio会把各个module进行合并,例如manifest文件。它也会合并arm-v7目录,可以想象——如果第三方依赖A和B,A指定了arm-v7里的so包,B没有指定arm-v7里的so包,那么合并的结果时最终的apk里的arm-v7目录里只有A的so包。

于是在遇到arm-v7的cup时,B就悲催的找不到自己的so包了——找不到类。


真实原因和解决办法:

但是我的问题都不是这些导致的。真正的原因很无奈,是studio的 Instant Run 功能导致的。

这个功能在我之前使用的studio版本里并没有,所以它里面具体做了什么,我并不清楚 ,我只是怀疑它坏了我的事。所以把它关了。

关闭流程:file——setting——build、execution、deployment——Instant Run

然后我的apk就可以正常手动安装运行了。


结语:

对工具和api的更新要有所了解,对新功能要选择性的使用。

"java.lang.ClassNotFoundException"异常通常是由于找不到所需的类而引起的。解决这个异常的方法有以下几种: 1. 检查类路径:确保所需的类在类路径中可用。可以通过在命令行中使用`java -classpath`选项或在IDE中配置项目的构建路径来设置类路径。 2. 检查类名拼写:确保类名的拼写是正确的,包括大小写。 3. 检查依赖项:如果异常是由于缺少依赖项引起的,可以通过将所需的依赖项添加到项目中来解决。这可以通过手动添加JAR文件或使用构建工具(如Maven或Gradle)来完成。 4. 检查类加载器:如果使用自定义类加载器加载类,确保类加载器能够找到所需的类。 5. 检查类的位置:如果类位于不同的包或模块中,确保正确地引用类的完整路径。 6. 检查运行环境:如果在特定的运行环境中出现异常,例如在Android应用程序中,确保所需的类在运行环境中可用。 7. 检查编译错误:如果在编译代码时出现错误,可能会导致类文件无法生成。解决编译错误并重新编译代码。 8. 检查类版本:如果使用的类版本与运行环境不兼容,可能会导致ClassNotFoundException异常。确保使用与运行环境兼容的类版本。 这些是解决"java.lang.ClassNotFoundException"异常的常见方法。根据具体情况选择适合的解决方案。如果问题仍然存在,请提供更多的上下文信息以便更好地帮助您解决问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值