【问题标题】:MultiDex SupportMultiDex 支持
【发布时间】:2015-12-23 12:35:46
【问题描述】:

我的应用由于 multidex 而崩溃。以下是崩溃日志信息:

12-23 16:43:12.437 6823-6823/com.rogers.tsc I/MultiDex:2.1.0 版本的 VM 支持 multidex 12-23 16:43:12.438 6823-6823/com.rogers.tsc I/MultiDex: 安装 12-23 16:43:12.438 6823-6823/com.rogers.tsc I/MultiDex:VM 支持 multidex,MultiDex 支持库被禁用。 12-23 16:43:12.462 6823-6823/com.rogers.tsc D/AndroidRuntime: 关闭虚拟机 12-23 16:43:12.463 6823-6823/com.rogers.tsc E/AndroidRuntime: 致命异常: main 进程:com.rogers.tsc,PID:6823 java.lang.RuntimeException:无法获取提供程序 com.google.android.gms.measurement.AppMeasurementContentProvider:java.lang.NullPointerException:空引用 在 android.app.ActivityThread.installProvider(ActivityThread.java:5156) 在 android.app.ActivityThread.installContentProviders(ActivityThread.java:4748) 在 android.app.ActivityThread.handleBindApplication(ActivityThread.java:4688) 在 android.app.ActivityThread.-wrap1(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 引起:java.lang.NullPointerException:空引用 在 com.google.android.gms.common.internal.zzx.zzz(未知来源) 在 com.google.android.gms.measurement.internal.zzw.zzaT(未知来源) 在 com.google.android.gms.measurement.AppMeasurementContentProvider.onCreate(未知来源) 在 android.content.ContentProvider.attachInfo(ContentProvider.java:1748) 在 android.content.ContentProvider.attachInfo(ContentProvider.java:1723) 在 android.app.ActivityThread.installProvider(ActivityThread.java:5153) 在 android.app.ActivityThread.installContentProviders(ActivityThread.java:4748) 在 android.app.ActivityThread.handleBindApplication(ActivityThread.java:4688) 在 android.app.ActivityThread.-wrap1(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

导致问题的 multidex 似乎存在一些问题。我已经在我的应用程序中添加了 multidex 支持。我还在我的应用程序 gradle 中添加了 compile 'com.android.support:multidex:1.0.0'

这是我的应用程序类

 public class MyApplication extends Application {

private static TscApplication mApplication;
public static TscApplication getApplication()
{
    return mApplication;
}

public Context getApplicationContext(){

    return mApplication;
}
@Override
public void onCreate() {
    super.onCreate();
    mApplication = this;

}
@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

}

每当我在 AndroidManifest 中添加应用程序类引用时,只会发生崩溃,否则如果我删除它就不会发生。

下面是我的app.graddle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.app.ysc"
        minSdkVersion 15
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'com.android.support:cardview-v7:23.1.1'
    compile 'com.android.support:recyclerview-v7:23.1.1'
    compile 'com.mcxiaoke.volley:library:1.0.19'
    compile 'com.google.android.gms:play-services-gcm:8.4.0'
    compile 'com.android.support:multidex:1.0.0'
}
apply plugin: 'com.google.gms.google-services'

【问题讨论】:

  • 随便public class MyApplication extends MultiDexApplication {
  • 你不需要用 Application 类扩展任何类。只需在应用程序 gradle 中启用 multidex。 multiDexEnabled = true

标签: android proguard android-proguard android-multidex


【解决方案1】:

这基本上是因为你超出了方法的限制。你有两个选项来解决这个错误。

1) 减少项目中方法的数量。基本上,您在项目方法中添加的库也计入您的项目方法中。所以不要使用该库的整个包使用您在项目中使用的模块:例如,您添加整个包的 Google Play 服务添加您想要使用的模块,如地图等。

2)第二个 Enable the multidex for enable multidex : 现在,你需要做的就是在你的 Application 类中重写它

public class YouApplication extends MultiDexApplication {

@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}

}

在你的渐变中添加多索引支持库

  android {
  compileSdkVersion 22
  buildToolsVersion "23.0.0"

 defaultConfig {
     minSdkVersion 14 //lower than 14 doesn't support multidex
     targetSdkVersion 22

     // Enabling multidex support.
     multiDexEnabled true
    }
    }

dependencies {
compile 'com.android.support:multidex:1.0.1'
}

在您的清单中,将 MultiDexApplication 类从 multidex 支持库添加到应用程序元素,如下所示

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="YouApplication">
...
</application>

希望对你有所帮助....

【讨论】:

  • 你要么在 attachBaseContext 方法中使用 multidex 安装,要么使用两者扩展 MultidexApplication 都是没有意义的,因为两者都做同样的事情
猜你喜欢
  • 1970-01-01
  • 2018-04-21
  • 2015-02-05
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多