我按照Firebase指南添加了FCM,因此我将以下依赖项添加到我的应用程序gradle中:
compile 'com.google.android.gms:play-services:9.0.0'
apply plugin: 'com.google.gms.google-services'
这个项目对我的项目有所帮助:
classpath 'com.google.gms:google-services:3.0.0'
在此之后,我通过下载并将其添加到我的应用目录,从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)
我手机的Google Play服务是9.0.0+。 我已经更新到SDK管理器中的最新播放服务和存储库。
编辑:
我的应用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'
}
应用插件:&#39; com.google.gms.google-services&#39;
答案 0 :(得分:11)
避免64k Dex error
的一种可能方法是仅包含您的应用从Google Play服务中获得的那些API。
<强> Selectively compiling APIs into your executable 强>
从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'
<强>已更新强> 好吧,我读了文件,里面写着
依赖Play Services SDK的应用应始终在访问Google Play服务功能之前检查设备是否支持兼容的Google Play服务
因此,您只需查看Google Play服务是否可用。要做到这一点,您只需要 Google操作,基本客户端库API 。
compile 'com.google.android.gms:play-services-base:9.0.0'
答案 1 :(得分:8)
如documentation中所述,使用有选择地将API编译为可执行文件,这是最适合您的方法( 将其置于Multi Dex的第一优先级 ),因为Multi-dex在继续之前会进行一些limitations 检查。
避免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'
。 所以删除v7&amp;来自build.gradle文件的v4
答案 2 :(得分:0)
答案 3 :(得分:0)
首先检查multidex是否真的有效,你可以通过将apk文件重命名为zip并解压缩来实现。应该有2个多个classes.dex文件。
其次,如果早期减少必须使用proguard的方法,也会发生这种情况,所以只需评论proguard的使用,它应该有效。
否则请在此处粘贴您的例外。
答案 4 :(得分:0)
出了点问题。
检查the doc您只需要这种依赖
dependencies {
compile 'com.google.firebase:firebase-messaging:9.0.0'
}
所以你可以删除这种依赖
//compile 'com.google.android.gms:play-services:9.0.0'
如果不够并且您拥有 65536种方法,则可以使用multidex support。
只需在build.gradle
:
android {
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
同样在您的Manifest
中,将多索引支持库中的MultiDexApplication
类添加到应用程序元素
<?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="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
并覆盖attachBaseContext
方法:
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
MultiDex.install(this);
}
如果您使用的是自己的Application
课程,请将父课程从Application
更改为MultiDexApplication
。