Android 解决华为上运行出现java.lang.VerifyError

版权声明:本文为博主原创文章,未经博主允许不得转载、不得商业用途。 https://blog.csdn.net/chenlove1/article/details/79894261

这个问题只发现在一台华为平板上的问题,启动Application就直接闪退了,试过了其他手机都没有问题,估计是系统运行机制的问题

先看看错误Log  Could not find class 'com.google.gson.JsonParser'

16:34:13.316 E/dalvikvm: Could not find class 'com.google.gson.JsonParser', referenced from method com.xxxxx.framework.util.DefaultShared.toList
16:34:13.336 E/textview: initAddtionalStyle default
16:34:13.336 E/AndroidRuntime: FATAL EXCEPTION: main
               Process: com.xxxxx, PID: 28273
               ava.lang.VerifyError: com/xxxxx/framework/util/DefaultShared
                    at com.xxxxx.framework.base.BaseApplication.onCreate(BaseApplication.java:98)
                    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1009)
                    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4638)
                    at android.app.ActivityThread.access$1800(ActivityThread.java:141)
                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1301)
                    at android.os.Handler.dispatchMessage(Handler.java:102)
                    at android.os.Looper.loop(Looper.java:136)
                    at android.app.ActivityThread.main(ActivityThread.java:5342)
                    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:871)
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
                    at dalvik.system.NativeStart.main(Native Method)

再看看 DefaultShared类import了没有:

package com.xxxxx.framework.util;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException;

既然只出来在一台机器上,那gson一定在apk里面了,想了一想那应该是app 方法超过了64K,所以build.gradle的defaultConfig里面添加了:multiDexEnabled true

这样打包出来就会多个.dex文件,一个dex不能超过64k方法数的,明显是这个问题,然后根据网上说法,去引用官方的一个库:

compile 'com.android.support:multidex:1.0.3'

使用dependencies后,继承Application后初始化一点就好:

public class BaseApp extends Application{
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

问题解决,但根本原因呢?

   出现这个错误是机子运行时不能同时加载二个dex,第一个dex里的代码包含了第二个dex代码就会出现这个问题,所以下面介绍一下网友的高级办法,:把打包顺序改一下可解决

在build.gradle中开启multiDex,并指定配置文件,(注意multiDexKeep.pro和multiDexKeep.txt文件需要自己创建,放在项目的app文件夹下)

multiDexEnabled true  
multiDexKeepProguard file('multiDexKeep.pro') // keep specific classes using proguard syntax  
multiDexKeepFile file('multiDexKeep.txt') // keep specific classes  

配置multiDexKeep.pro文件(混淆作用)

-keep class android.support.multidex.** {
*;
}

配置multiDexKeep.txt文件,指定类即可,这个是保留在MainDex里的类

com.google.gson.JsonParser.class  
other.class  

猜你喜欢

转载自blog.csdn.net/chenlove1/article/details/79894261