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

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 引發的翻車😭


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章