美文网首页Android
Multidex拆包异常java.lang.NoClassDef

Multidex拆包异常java.lang.NoClassDef

作者: SMSM | 来源:发表于2017-10-27 22:12 被阅读655次

    Multidex的过程分两步,拆包和dex加载。
    https://www.jianshu.com/p/9f02add8431f

    拆包

    拆分为多个dex是在编译构建Dex过程中完成的,通过如下配置即可,同时在main-dex-rule文件中指定哪些类要放在主dex中。dex的命名规则是classes.dex、classes2.dex、classes3.dex等。

    dexOptions {
        javaMaxHeapSize "1g"
        preDexLibraries = false
        additionalParameters = [//配置multidex参数
                                '--multi-dex',//多dex分包
                                '--set-max-idx-number=24000',//每个包内方法数上限
                                '--main-dex-list=' + projectDir + '/main-dex-rule', //打包到主classes.dex的文件列表
                                '--minimal-main-dex'
        ]
    }
    
        -----main-dex-rule文件格式----
       com/pitaya/buckettool/BucketApplication.class
       android/support/multidex/MultiDexExtractor.class
       android/support/multidex/MultiDex.class
       android/support/multidex/MultiDexExtractor$1.class
       android/support/multidex/MultiDex$V19.class
       android/support/multidex/MultiDex$V14.class
       android/support/multidex/MultiDexApplication.class
       android/support/multidex/ZipUtil$CentralDirectory.class
       android/support/multidex/MultiDex$V4.class
       android/support/multidex/ZipUtil.class
    

    混淆语法https://www.diycode.cc/topics/380

    加载

    加载过程涉及多个目录文件、ClassLoader机制。

    每个目录文件的作用

    ——/data/app/com.pitaya.buckettool-1.apk——applicationInfo.sourceDir sourceApk——系统用于存放APK原始安装文件
    
    ——/data/data/com.pitaya.buckettool——applicationInfo.dataDir——系统给每个应用创建的私有专用目录,存放SP、数据库等文件
    
    ——/data/data/com.pitaya.buckettool/code_cache/secondary-dexes——dexDir———Multidex工作过程中创建的目录,用于存放apk原始文件中的子dex,不包含主dex。
    
    ——/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.zip——extractedFile——Multidex工作过程中,
    提取APK中的子dex,并生成包含子dex的压缩文件com.pitaya.buckettool-1.apk.classes2.zip,注意:每个子dex对应一个压缩文件。压缩文件内的dex名字被替换为了classes.dex,
    为什么要这样做?因DexPathList.java底层是根据"classes.dex"字符串来匹配文件的,不符合的不处理。
    
    ——/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.dex——被dexOpt优化后生成的odex文件,可提高Dalvik执行效率,文件对比如下:
                    -rw-r--r-- u0_a52   u0_a52     440576 2017-10-26 10:53 com.pitaya.buckettool-1.apk.classes2.dex
                    -rw------- u0_a52   u0_a52     158841 2017-10-26 10:53 com.pitaya.buckettool-1.apk.classes2.zip
    
    ——/data/dalvik-cache/data@app@com.pitaya.buckettool-1.apk@classes.dex——系统用于存放主Dex
    
    ——/data/system/packages.xml——已安装应用的权限信息列表
    

    ClassLoader机制

    15865-15865/D/TagAppPath: ---------------------------
    15865-15865/D/TagAppPath: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.pitaya.buckettool-2.apk", zip file "/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes2.zip", zip file "/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes3.zip", zip file "/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes4.zip"],nativeLibraryDirectories=[/data/app-lib/com.pitaya.buckettool-2, /system/lib]]]
    15865-15865/D/TagAppPath: Activity java.lang.BootClassLoader@acd54d78
    15865-15865/D/TagAppPath: ArrayList java.lang.BootClassLoader@acd54d78
    15865-15865/D/TagAppPath: ContextImpl java.lang.BootClassLoader@acd54d78
    15865-15865/D/TagAppPath: ActivityThread java.lang.BootClassLoader@acd54d78
    15865-15865/D/TagAppPath: ---------------------------
    2321-2321/D/TagAppPath: loaderName dalvik.system.PathClassLoader
    2321-2321/D/TagAppPath: loaderName java.lang.BootClassLoader
    2321-2321/D/TagAppPath: ---------------------------
    
    W/System.err: java.lang.RuntimeException: my RuntimeException
    W/System.err:     at com.pitaya.buckettool.BucketApplication.onCreate(BucketApplication.java:54)
    W/System.err:     at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
    W/System.err:     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4344)
    W/System.err:     at android.app.ActivityThread.access$1500(ActivityThread.java:135)
    W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
    W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
    W/System.err:     at android.os.Looper.loop(Looper.java:136)
    W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5017)
    W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
    W/System.err:     at java.lang.reflect.Method.invoke(Method.java:515)
    W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    W/System.err:     at dalvik.system.NativeStart.main(Native Method)
    

    遵循ClassLoader的双亲委派机制,并且判定是同一个Class的条件 = 相同的 ClassName + PackageName + ClassLoader。
    PathClassLoader和DexClassLoader的区别在于,DexClassLoader可以指定odex路径。
    关于ClassLoader的双亲委派、compile和provided两种依赖方式带来的异常ClassNotFoundException、ClassCastException、IllegalAccessError: Class ref in pre-verified class等异常,参见拓展阅读

    摘抄:通过以上三种情况,主要是为了更加深刻的理解类加载器的知识,同时得出我们在开发插件时,尽量避免出现插件和宿主中都compile依赖,只保证compile一次,其他provided即可,此外在自定义DexClassLoader的parent时要特别注意,不能随意设置,一般设置成应用默认的classLoader,而非系统默认的classLoader。

    dexopt过程,对加载的Class做预校验,包含该Class内所有的被引用的类是否存在,若不存在则对不存在的类做标记;该Class内所有引用类均在当前dex中,则该Class被标记为CLASS_ISPREVERIFIED。

    BootClassLoader在哪里被实例化的呢?

    Activity、ArrayList、ContextImpl、ActivityThread等系统的类都是由BootClassLoader加载的,BootClassLoader的实例化时机是在ZygoteInit的preload()方法中。BootClassLoader的parent是null,并且没有设置路径,可以理解为BootClassLoader是对底层loadclass能力的代理。
    然后代码里和堆栈对不上,要看下老罗了。。。。

    BootClassLoader.class本身又是由谁来加载的呢?奇怪

    ---------ZygoteInit.preload()-------
    static void preload() {
        preloadClasses();
        preloadResources();
        preloadOpenGL();
    }
    ---------ZygoteInit.preloadClasses()-------
    Class.forName(line);
    ---------Class.forName()----------------------
    if (loader == null) {
            loader = BootClassLoader.getInstance();
    }
    
    用于加载自定义Application的PathClassLoader在哪里实例化的呢?
    AcitivityThread.java内部调用核心流程
    -handleBindApplication(){Application app = data.info.makeApplication(data.restrictedBackupMode, null);}
        -LoadedApk.makeApplication()
            -java.lang.ClassLoader cl = getClassLoader();
                -createOrUpdateClassLoaderLocked()
                    -mClassLoader = ApplicationLoaders.getDefault().getClassLoader(zip,
                            mApplicationInfo.targetSdkVersion, isBundledApp, librarySearchPath,
                            libraryPermittedPath, mBaseClassLoader);//设置outZipPaths.add(appDir);用于加载主Dex
    
    ------PathClassLoader实例化完毕,parent为BootClassLoader,并加载appDir路径下的主classes.dex文件,
    自己定义的Application要放在主classes.dex中,在***自定义拆包的时候要注意***否则makeApplication()失败,
    因为ClassNotFoundException-----
    

    然后有NoClassDefFoundError

    在BucketApplication的onCreate()方法中调用initBugly(),发生如下错误:

    private void initBugly() {
        Beta.autoCheckUpgrade = false;
        CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(getApplicationContext());
        Bugly.init(getApplicationContext(), "1111", BuildConfig.ENV_OFFLINE, strategy);
    }
    
    public class CrashReport {
        public CrashReport() {
        }
    
        public static class UserStrategy extends BuglyStrategy {
            public UserStrategy(Context context) {
            }
        }
    }
    
     java.lang.NoClassDefFoundError: com.tencent.bugly.beta.Beta
      at com.pitaya.buckettool.BucketApplication.initBugly(BucketApplication.java:118)
      at com.pitaya.buckettool.BucketApplication.onCreate(BucketApplication.java:45)
      at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4344)
    

    仔细看dalvikvm加载class的日志还有如下提示

    W/dalvikvm: Unable to resolve superclass of Lcom/tencent/bugly/beta/Beta; (68)
    W/dalvikvm: Link of class 'Lcom/tencent/bugly/beta/Beta;' failed
    W/dalvikvm: VFY: unable to resolve static field 154 (autoCheckUpgrade) in Lcom/tencent/bugly/beta/Beta;
    D/dalvikvm: VFY: replacing opcode 0x6a at 0x0002
    W/dalvikvm: Unable to resolve superclass of Lcom/tencent/bugly/crashreport/CrashReport$UserStrategy; (66)
    W/dalvikvm: Link of class 'Lcom/tencent/bugly/crashreport/CrashReport$UserStrategy;' failed
    D/dalvikvm: DexOpt: unable to opt direct call 0x0165 at 0x12 in Lcom/pitaya/buckettool/BucketApplication;.initBugly
    
    
    关键词
    1、superclass  
    2、unable to resolve static field
    3、unable to resolve static method
    4、unable to resolve new-instance
    

    爽歪歪,后续的调试工作全是在为消灭这几句话做斗争。

    解释下NoClassDefFoundError 和 ClassNotFoundException的区别:

    • ClassNotFoundException是Dex中真的没有、也找不到时发生的;
    • NoClassDefFoundError是Dex中有、但是该类被提前标记为无效类、在实例化的时候发生的;

    为什么该类被提前标记为无效类呢?因为多Dex情况下,dexopt会扫描被该类A引用的所有的其他类是否存在,如果不存在,则其他类会被标记未无效类。
    在加载Class到内存并初始化static、实例化Class时,发生NoClassDefFoundError异常。
    如果初始化A的static块存在new B()并且类B的字节码还未被加载,则会产生ClassNotFoundException。
    如果初始化A的static块存在new B()并且类B的字节码已被加载,但是new B()内构造函数抛出Exception导致类B实例化错误,同样导致类A字节码加载错误,后续有引用类A的地方也会发生ClassNotFoundException。看个腾讯Bugly的案例

     D/dalvikvm: DexOpt: unable to opt direct call 0x0071 at 0x1b in Lcom/pitaya/buckettool/BucketApplication;.onCreate
    

    案例中BucketApplication 引用类有Beta.autoCheckUpgrade 、Bugly.init()、 CrashReport.UserStrategy.class。在main-dex-rule文件中新增如下配置,顺利看到了MainActivity页面。

    com/tencent/bugly/a.class
    com/tencent/bugly/beta/Beta.class
    
    com/tencent/bugly/Bugly.class
    com/tencent/bugly/BuglyStrategy.class
    com/tencent/bugly/crashreport/CrashReport$UserStrategy.class
    

    JVM类加载过程

    类的加载分清楚如下两点:

    • 类的初始化是指为类中各个类成员(被static修饰的成员变量)赋初始值的过程,是类生命周期中的一个阶段。
    • 类的实例化是指创建一个类的实例(对象)的过程;

    摘要:一个类的生命周期包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using) 和 卸载(Unloading)七个阶段。

    运行附件

    10-28 23:00:02.060 11481-11481/? D/dalvikvm: Not late-enabling CheckJNI (already on)
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool I/dalvikvm: Could not find method com.xiaomi.mistatistic.sdk.MiStatInterface.initialize, referenced from method com.pitaya.buckettool.BucketApplication.initXiaomi
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool W/dalvikvm: VFY: unable to resolve static method 382: Lcom/xiaomi/mistatistic/sdk/MiStatInterface;.initialize (Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool D/dalvikvm: VFY: replacing opcode 0x71 at 0x0006
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool E/dalvikvm: Could not find class 'com.pitaya.buckettool.bind.BindPoiPresenter', referenced from method com.pitaya.buckettool.BucketApplication.onCreate
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool W/dalvikvm: VFY: unable to resolve new-instance 47 (Lcom/pitaya/buckettool/bind/BindPoiPresenter;) in Lcom/pitaya/buckettool/BucketApplication;
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool D/dalvikvm: VFY: replacing opcode 0x22 at 0x000c
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool I/dalvikvm: Failed resolving Lcom/pitaya/buckettool/BucketApplication$1; interface 115 'Lcom/xiaomi/mistatistic/sdk/controller/HttpEventFilter;'
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool W/dalvikvm: Link of class 'Lcom/pitaya/buckettool/BucketApplication$1;' failed
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: unable to opt direct call 0x006b at 0x1b in Lcom/pitaya/buckettool/BucketApplication;.initXiaomi
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: unable to opt direct call 0x0081 at 0x13 in Lcom/pitaya/buckettool/BucketApplication;.onCreate
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: unable to opt direct call 0x0071 at 0x1b in Lcom/pitaya/buckettool/BucketApplication;.onCreate
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool E/smarking: attachBaseContext  begin
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool I/MultiDex: VM with version 1.6.0 does not have multidex support
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool I/MultiDex: install
    10-28 23:00:02.110 11481-11481/com.pitaya.buckettool I/MultiDex: MultiDexExtractor.load(/data/app/com.pitaya.buckettool-1.apk, false)
    10-28 23:00:02.120 11481-11481/com.pitaya.buckettool I/MultiDex: Detected that extraction must be performed.
    10-28 23:00:02.120 11481-11481/com.pitaya.buckettool I/MultiDex: Trying to delete old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes2.dex of size 3741880
    10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Deleted old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes2.dex
    10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Trying to delete old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes2.zip of size 1423256
    10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Deleted old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes2.zip
    10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Trying to delete old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes3.zip of size 1431792
    10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Deleted old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes3.zip
    10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Trying to delete old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes4.zip of size 1191948
    10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Deleted old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes4.zip
    10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Trying to delete old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes3.dex of size 4050264
    10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Deleted old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes3.dex
    10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Trying to delete old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes4.dex of size 3272272
    10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Deleted old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes4.dex
    10-28 23:00:02.140 11481-11481/com.pitaya.buckettool I/MultiDex: Extraction is needed for file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.zip
    10-28 23:00:02.150 11481-11481/com.pitaya.buckettool I/MultiDex: Extracting /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes-1608520623.zip
    10-28 23:00:02.510 11481-11481/com.pitaya.buckettool I/MultiDex: Renaming to /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.zip
    10-28 23:00:02.510 11481-11481/com.pitaya.buckettool I/MultiDex: Extraction success - length /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.zip: 1423256
    10-28 23:00:02.510 11481-11481/com.pitaya.buckettool I/MultiDex: Extraction is needed for file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes3.zip
    10-28 23:00:02.510 11481-11481/com.pitaya.buckettool I/MultiDex: Extracting /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes974557053.zip
    10-28 23:00:02.820 11481-11481/com.pitaya.buckettool I/MultiDex: Renaming to /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes3.zip
    10-28 23:00:02.820 11481-11481/com.pitaya.buckettool I/MultiDex: Extraction success - length /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes3.zip: 1431792
    10-28 23:00:02.820 11481-11481/com.pitaya.buckettool I/MultiDex: Extraction is needed for file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes4.zip
    10-28 23:00:02.820 11481-11481/com.pitaya.buckettool I/MultiDex: Extracting /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes-633036696.zip
    10-28 23:00:03.040 11481-11481/com.pitaya.buckettool I/MultiDex: Renaming to /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes4.zip
    10-28 23:00:03.040 11481-11481/com.pitaya.buckettool I/MultiDex: Extraction success - length /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes4.zip: 1191948
    10-28 23:00:03.050 11481-11481/com.pitaya.buckettool I/MultiDex: load found 3 secondary dex files
    10-28 23:00:03.050 11481-11514/com.pitaya.buckettool D/dalvikvm: GC_FOR_ALLOC freed 341K, 11% free 3273K/3676K, paused 5ms, total 5ms
    10-28 23:00:03.080 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: --- BEGIN 'com.pitaya.buckettool-1.apk.classes2.zip' (bootstrap=0) ---
    10-28 23:00:03.340 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: --- END 'com.pitaya.buckettool-1.apk.classes2.zip' (success) ---
    10-28 23:00:03.340 11481-11481/com.pitaya.buckettool D/dalvikvm: DEX prep '/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.zip': unzip in 28ms, rewrite 259ms
    10-28 23:00:03.370 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: --- BEGIN 'com.pitaya.buckettool-1.apk.classes3.zip' (bootstrap=0) ---
    10-28 23:00:03.550 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: --- END 'com.pitaya.buckettool-1.apk.classes3.zip' (success) ---
    10-28 23:00:03.550 11481-11481/com.pitaya.buckettool D/dalvikvm: DEX prep '/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes3.zip': unzip in 26ms, rewrite 186ms
    10-28 23:00:03.580 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: --- BEGIN 'com.pitaya.buckettool-1.apk.classes4.zip' (bootstrap=0) ---
    10-28 23:00:03.790 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: --- END 'com.pitaya.buckettool-1.apk.classes4.zip' (success) ---
    10-28 23:00:03.790 11481-11481/com.pitaya.buckettool D/dalvikvm: DEX prep '/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes4.zip': unzip in 22ms, rewrite 209ms
    10-28 23:00:03.790 11481-11481/com.pitaya.buckettool I/MultiDex: install done
    10-28 23:00:03.790 11481-11481/com.pitaya.buckettool E/smarking: attachBaseContext finish
    10-28 23:00:03.790 11481-11481/com.pitaya.buckettool E/smarking: onCreate begin
    10-28 23:00:03.790 11481-11481/com.pitaya.buckettool D/AndroidRuntime: Shutting down VM
    10-28 23:00:03.790 11481-11481/com.pitaya.buckettool W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xaccaab20)
    10-28 23:00:03.790 11481-11481/com.pitaya.buckettool E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: com.pitaya.buckettool, PID: 11481
                                                                           java.lang.NoClassDefFoundError: com.pitaya.buckettool.bind.BindPoiPresenter
                                                                               at com.pitaya.buckettool.BucketApplication.onCreate(BucketApplication.java:51)
                                                                               at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
                                                                               at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4344)
                                                                               at android.app.ActivityThread.access$1500(ActivityThread.java:135)
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                               at android.os.Looper.loop(Looper.java:136)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5017)
                                                                               at java.lang.reflect.Method.invokeNative(Native Method)
                                                                               at java.lang.reflect.Method.invoke(Method.java:515)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
                                                                               at dalvik.system.NativeStart.main(Native Method)
    10-28 23:05:04.110 11481-11481/? I/Process: Sending signal. PID: 11481 SIG: 9

    相关文章

      网友评论

        本文标题:Multidex拆包异常java.lang.NoClassDef

        本文链接:https://www.haomeiwen.com/subject/btddpxtx.html