版权声明:本文为博主原创文章,未经博主允许不得转载、不得商业用途。 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