安卓神坑:java.lang.RuntimeException: Unable to instantiate application

本文详细解析了一个因不当使用TryCatch导致的Android应用崩溃案例。问题源于自定义注解的处理过程中,TryCatch的错误使用使得应用无法正常启动。通过对比新旧版本代码,最终定位并解决了问题。

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

2020-05-14 15:55:49.560 16983-16983/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: chat.yee.android, PID: 16983
    java.lang.RuntimeException: Unable to instantiate application chat.yee.android.base.CCApplication: java.lang.ClassNotFoundException: Didn't find class "chat.yee.android.base.CCApplication" on path: DexPathList[[zip file "/data/app/chat.yee.android-BlBBBkg9WqZ9dn-uMPftsg==/base.apk"],nativeLibraryDirectories=[/data/app/chat.yee.android-BlBBBkg9WqZ9dn-uMPftsg==/lib/arm64, /data/app/chat.yee.android-BlBBBkg9WqZ9dn-uMPftsg==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]]
        at android.app.LoadedApk.makeApplication(LoadedApk.java:979)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6036)
        at android.app.ActivityThread.-wrap1(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1764)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6942)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "chat.yee.android.base.CCApplication" on path: DexPathList[[zip file "/data/app/chat.yee.android-BlBBBkg9WqZ9dn-uMPftsg==/base.apk"],nativeLibraryDirectories=[/data/app/chat.yee.android-BlBBBkg9WqZ9dn-uMPftsg==/lib/arm64, /data/app/chat.yee.android-BlBBBkg9WqZ9dn-uMPftsg==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at android.app.Instrumentation.newApplication(Instrumentation.java:1094)
        at android.app.LoadedApk.makeApplication(LoadedApk.java:973)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6036) 
        at android.app.ActivityThread.-wrap1(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1764) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6942) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

遇到了一个神坑,坑了一天 ,特此记录下

遇到这个坑 各种Google:java.lang.RuntimeException: Unable to instantiate application 

网上各种说法都有,各种尝试都测试了  其中一种解释有些道理 就是说项目 分包错误 应该使用multidex,但是项目中也确实使用了multidex,全部都配置好了,而且还升级到了最新版本    感觉怀疑人生了。

既然网上的方法不行,就从自身代码找问题,仔细排查代码,发现切换到老版本可以,新的版本不行,那就逐渐缩小排查范围,最后竟然发现是一个自定义注解的问题,之前发现一个自定义注解存在崩溃的情况,于是乎加了一个Try catch,正是这个小小的Try Catch 造成整个项目组delay了一天  

之前Work 的情况:

package chat.yee.android.mvp.widget.annotation;

import android.view.View;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;

import java.lang.reflect.Method;

@Aspect
public class SingleClickAspect {
    private static final long DEFAULT_TIME_INTERVAL = 5000;

    /**
     * 定义切点,标记切点为所有被@SingleClick注解的方法
     * 注意:这里me.baron.test.annotation.SingleClick需要替换成
     * 你自己项目中SingleClick这个类的全路径哦
     */
    @Pointcut("execution(@chat.yee.android.mvp.widget.annotation.SingleClick * *(..))")
    public void methodAnnotated() {}

    /**
     * 定义一个切面方法,包裹切点方法
     */
    @Around("methodAnnotated()")
    public void aroundJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
        // 取出方法的参数
        View view = null;
        for (Object arg : joinPoint.getArgs()) {
            if (arg instanceof View) {
                view = (View) arg;
                break;
            }
        }
        if (view == null) {
            return;
        }
        // 取出方法的注解
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        if (!method.isAnnotationPresent(SingleClick.class)) {
            return;
        }
        SingleClick singleClick = method.getAnnotation(SingleClick.class);
        // 判断是否快速点击
        if (!XClickUtil.isFastDoubleClick(view, singleClick.value())) {
            // 不是快速点击,执行原方法
            joinPoint.proceed();
        }
    }
}

 

出问题后的代码:

package chat.yee.android.mvp.widget.annotation;

import android.view.View;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;

import java.lang.reflect.Method;

@Aspect
public class SingleClickAspect {
    private static final long DEFAULT_TIME_INTERVAL = 5000;

    /**
     * 定义切点,标记切点为所有被@SingleClick注解的方法
     * 你自己项目中SingleClick这个类的全路径哦
     */
    @Pointcut("execution(@chat.yee.android.mvp.widget.annotation.SingleClick * *(..))")
    public void methodAnnotated() {}

    /**
     * 定义一个切面方法,包裹切点方法
     */
    @Around("methodAnnotated()")
    public void aroundJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
        // 取出方法的参数
        try {
            View view = null;
            for (Object arg : joinPoint.getArgs()) {
                if (arg instanceof View) {
                    view = (View) arg;
                    break;
                }
            }
            if (view == null) {
                return;
            }
            // 取出方法的注解
            MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
            Method method = methodSignature.getMethod();
            if (method == null) {
                return;
            }
            if (!method.isAnnotationPresent(SingleClick.class)) {
                return;
            }
            SingleClick singleClick = method.getAnnotation(SingleClick.class);
            // 判断是否快速点击
            if (!XClickUtil.isFastDoubleClick(view, singleClick.value())) {
                // 不是快速点击,执行原方法
                joinPoint.proceed();
            }
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}

一个Try Catch 引发的翻车😭


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张海龙_China

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值