添加Google Play Services 9.0.0后,Dex文件超过64k

Cyo*_*nos 8 android firebase google-play-services

我按照Firebase指南添加FCM,因此我将以下依赖项添加到我的应用程序gradle:

compile 'com.google.android.gms:play-services:9.0.0'
apply plugin: 'com.google.gms.google-services'
Run Code Online (Sandbox Code Playgroud)

这个项目对我的项目有所帮助:

classpath 'com.google.gms:google-services:3.0.0'
Run Code Online (Sandbox Code Playgroud)

在此之后,我通过下载并将其添加到我的app目录,从Firebase控制台设置添加了google-services.json.

现在我收到这个错误:

错误:.dex文件中的方法引用数不能超过64K.请访问https://developer.android.com/tools/building/multidex.html,了解如何解决此问题

如果我按照说明操作并让我的应用程序支持multidex,我的应用程序会在启动后立即崩溃.

将multidex添加到我的应用程序后出现以下错误:

    05-20 01:25:32.253 19812-19812/com.cryogenos.pearsonvisionlimousine W/dalvikvm: VFY: unable to resolve static field 8723 (common_google_play_services_unknown_issue) in Lcom/google/android/gms/R$string;05-20 01:25:32.253 19812-19812/com.cryogenos.pearsonvisionlimousine W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x416b5e30)05-20 01:25:32.253 19812-19812/com.cryogenos.pearsonvisionlimousine E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.cryogenos.pearsonvisionlimousine, PID: 19812java.lang.NoClassDefFoundError: com.google.android.gms.R$stringat com.google.android.gms.common.internal.zzah.<init>
(Unknown Source)
at com.google.firebase.FirebaseOptions.fromResource(Unknown Source)
at com.google.firebase.FirebaseApp.zzbu(Unknown Source)
at com.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1609)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1574)
at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source)
at android.app.ActivityThread.installProvider(ActivityThread.java:5643)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:5206)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5143)
at android.app.ActivityThread.access$1500(ActivityThread.java:156)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1418)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5883)
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:872)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:688)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

我手机的谷歌播放服务是9.0.0+.我已经更新到SDK管理器中的最新播放服务和存储库.

编辑:

我的app build.gradle:

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "22.0.1"

defaultConfig {
    applicationId "com.cryogenos.pearsonvisionlimousine"
    minSdkVersion 19
    targetSdkVersion 23
    versionCode 3
    versionName "2.1"
    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled true
        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.google.android.gms:play-services:9.0.0'
compile 'com.mcxiaoke.volley:library:1.0.19'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:multidex:1.0.0'
compile 'com.google.firebase:firebase-messaging:9.0.0'
}
Run Code Online (Sandbox Code Playgroud)

申请插件:'com.google.gms.google-services'

Bha*_*esh 11

一种可能的避免方法64k Dex error是仅在Google Play服务中包含您的应用所需的API.

有选择地将API编译到可执行文件中

从6.5版开始,您可以选择性地将Google Play服务API编译到您的应用程序中.例如,要仅包含Google Fit和Android Wear API,请替换build.gradle文件中的以下行:



使用以下行编译'com.google.android.gms:play-services:9.0.0' :

编译'com.google.android.gms:play-services-fitness:9.0.0'
编译'com.google.android.gms:play-services-wearable:9.0.0'

更新 好我读了文档,其中说

在访问Google Play服务功能之前,依赖Play Services SDK的应用应始终检查设备是否支持兼容的Google Play服务

因此,您只需检查Google Play服务是否可用.要做到这一点,您只需要Google Actions,Base Client Library API.

compile 'com.google.android.gms:play-services-base:9.0.0'


Dha*_*mar 8

正如文档中所解释的那样使用选择性地将API编译到您的可执行文件中这是最好的方法(将其置于Multi Dex的第一优先级中),因为Multi-dex 在继续之前有一些限制 检查.

避免64K限制 - Proguard将帮助您

在配置应用程序以启用64K或更多方法引用之前,您应该采取措施减少应用程序代码调用的引用总数,包括应用程序代码或包含的库定义的方法.以下策略可以帮助您避免达到dex参考限制:

检查应用程序的直接和传递依赖关系 - 确保您在应用程序中包含的任何大型库依赖关系的使用方式超过了添加到应用程序的代码量.一个常见的反模式是包含一个非常大的库,因为一些实用方法是有用的.减少应用程序代码依赖性通常可以帮助您避免dex引用限制.

使用ProGuard删除未使用的代码 - 为应用程序配置ProGuard设置以运行ProGuard,并确保为发布版本启用了收缩功能.启用缩小功能可确保您不会使用APK发送未使用的代码.

使用这些技术可以帮助您避免在应用程序中启用更多方法引用所需的构建配置更改.这些步骤还可以减小APK的大小,这对于带宽成本较高的市场尤为重要.

所以,尽量避免使用Multi-Dex


当你使用时还有一件事,你compile 'com.android.support:design:23.1.1'不需要使用compile 'com.android.support:appcompat-v7:23.1.1'compile 'com.android.support:support-v4:23.1.1'.所以从build.gradle文件中删除v7和v4