android - Google Play 测试版中的 LGE Nexus 5 不断崩溃并出现 NoClassDefFoundError - 但它是哪个类?

标签 android firebase google-play crash-reports beta-testing

几个星期以来,我一直在努力找出为什么“LGE Nexus 5(锤头)、2048MB RAM、Android 5.0”设备不断报告崩溃并显示 java.lang.NoClassDefFoundError。由 ClassNotFoundException 引起在 Google Play 中 beta app .

我的问题是找出缺少哪个类-

screenshot

报告的函数名称(SlovaApplication.onCreate())甚至没有任何代码(因为我的应用有 2 种风格——一种用于带有 FCM 的 Google Play,一种用于带有 ADM 的亚马逊)。

下面是我的 app/build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    buildToolsVersion '27.0.3'
    defaultConfig {
        versionCode 29
        applicationId "de.slova"
        minSdkVersion 16
        targetSdkVersion 27
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    signingConfigs {
        debug {
            keyAlias 'AndroidDebugKey'
            storeFile file('../../../../../.android/debug.keystore')
            keyPassword 'android'
            storePassword 'android'
        }
        release {
            keyAlias 'AndroidReleaseKey'
            storeFile file('../../../conf/release.keystore')
            keyPassword System.getenv('PASSPHRASE1')
            storePassword System.getenv('PASSPHRASE1')
        }
    }

    flavorDimensions "store"
    productFlavors {
        google {
            dimension "store"
            versionName "$defaultConfig.versionCode-google"
            resConfigs "ru"
        }
        amazon {
            dimension "store"
            versionName "$defaultConfig.versionCode-amazon"
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
            debuggable false
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    splits {
        density {
            enable true
            reset()
            include "mdpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
        }
    }
}

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
    implementation "com.android.support:appcompat-v7:$supportVersion"
    implementation "com.android.support:cardview-v7:$supportVersion"
    implementation "com.android.support:customtabs:$supportVersion"
    implementation "com.android.support:design:$supportVersion"
    implementation "com.android.support:support-compat:$supportVersion"
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    implementation 'com.squareup.picasso:picasso:2.5.2'
    implementation 'com.neovisionaries:nv-websocket-client:2.3'
    implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'
    implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
    implementation 'ru.ok:odnoklassniki-android-sdk:2.1.2'
    implementation 'com.vk:androidsdk:1.6.9'
    implementation 'com.facebook.android:facebook-login:4.28.0'
    googleImplementation "com.google.android.gms:play-services-auth:$firebaseVersion"
    googleImplementation "com.google.firebase:firebase-messaging:$firebaseVersion"
    googleImplementation 'com.android.billingclient:billing:1.0'
    amazonCompileOnly files('libs/amazon-device-messaging-1.0.1.jar')
    amazonImplementation files('libs/login-with-amazon-sdk.jar')
    implementation 'com.mikepenz:crossfader:1.5.2@aar'
    implementation('com.mikepenz:materialdrawer:6.0.6@aar') {
        transitive = true
    }
    androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testImplementation 'junit:junit:4.12'
}

if (!getGradle().getStartParameter().getTaskRequests().toString().contains("Amazon")) {
    apply plugin: 'com.google.gms.google-services'
}

我也试过从 Application 改变至 MultiDexApplication但这并没有帮助(下面是 google flavor 类,其 2 个任务是:如果需要更新 Play 服务并登录 Google 用户):

public class SlovaApplication extends MultiDexApplication implements Flavor, Keys {
    private static final int PLAY_SERVICES = 1972; // USED TO UPDATE PLAY SERVICES
    private static final int PLAY_LOGIN = 1979;    // USED FOR GOOGLE SIGN-IN

    @Override
    public void onCreate() {
        super.onCreate();
        MultiDex.install(this);            // HAS NOT HELPED WITH CRASHES
        FirebaseApp.initializeApp(this);
        VKSdk.initialize(this);
        Utils.init(this);
    }

    @Override
    public void onCreate(Activity activity) {
        // DO NOTHING IN google FLAVOR
    }

    @Override
    public void onResume() {
        // DO NOTHING IN google FLAVOR
    }

    @Override
    public boolean onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case PLAY_SERVICES: {
                if (resultCode != Activity.RESULT_OK) {
                    Toast.makeText(activity, getString(R.string.error_play_services), Toast.LENGTH_LONG).show();
                    activity.finish();
                }
                return true;
            }

            case PLAY_LOGIN: {
                User user = null;
                if (resultCode == Activity.RESULT_OK) {
                    try {
                        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
                        if (task.isSuccessful()) {
                            GoogleSignInAccount account = task.getResult();
                            String photoUrl = (account.getPhotoUrl() != null ? account.getPhotoUrl().toString() : null);
                            user = new User(
                                    account.getId(),
                                    User.GOOGLE,
                                    account.getGivenName(),
                                    account.getFamilyName(),
                                    (URLUtil.isNetworkUrl(photoUrl) ? photoUrl : null)
                            );
                            DatabaseService.updateUser(activity, user);
                        }
                    } catch (Exception ex) {
                        Log.w(TAG, "Adding Google user failed", ex);
                    }
                }

                if (user == null) {
                    Toast.makeText(activity, getString(R.string.error_play_login), Toast.LENGTH_LONG).show();
                    activity.finish();
                }
                return true;
            }

            default: return false;
        }
    }

    @Override
    public boolean doesExist() {
        return Users.getInstance().doesUserExist(GOOGLE);
    }

    @Override
    public void signin(final Activity activity) {
        GoogleApiAvailability api = GoogleApiAvailability.getInstance();
        int code = api.isGooglePlayServicesAvailable(activity);
        if (code == ConnectionResult.SUCCESS) {
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).build();
            GoogleSignInClient client = GoogleSignIn.getClient(activity, gso);
            Intent i = client.getSignInIntent();
            activity.startActivityForResult(i, PLAY_LOGIN);
        } else if (api.isUserResolvableError(code)) {
            api.showErrorDialogFragment(activity, code, PLAY_SERVICES, new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    Toast.makeText(activity, getString(R.string.error_play_services), Toast.LENGTH_LONG).show();
                    activity.finish();
                }
            });
        } else {
            Toast.makeText(activity, getString(R.string.error_play_services) + " " + api.getErrorString(code), Toast.LENGTH_LONG).show();
            activity.finish();
        }
    }

    @Override
    public void putToken(JSONObject obj, String ignore) throws JSONException {
        String token = FirebaseInstanceId.getInstance().getToken();
        obj.put(KEY_FCM, token);
    }
}

我不知道如何修复这些崩溃以及如何识别应该丢失的类...

我测试版程序中的其他设备不会崩溃:

other devices

更新:添加 multiDexEnabled true不幸的是没有帮助,这是我的 proguard-rules.pro:

-libraryjars libs
-dontwarn com.squareup.okhttp.**
-dontwarn com.amazon.device.messaging.**
-keep class com.amazon.device.messaging.** {*;}
-keep public class * extends com.amazon.device.messaging.ADMMessageReceiver
-keep public class * extends com.amazon.device.messaging.ADMMessageHandlerBase

-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
-dontwarn org.conscrypt.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase

最佳答案

根据 documentation ,您在 app/build.gradle 中缺少一行:

defaultConfig {
    ...
    multiDexEnabled true
    ...
}

关于android - Google Play 测试版中的 LGE Nexus 5 不断崩溃并出现 NoClassDefFoundError - 但它是哪个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49688582/

相关文章:

Android 无效的 map API key

Android依赖冲突错误

firebase - 找不到 com.google.firebase :firebase-crashlytics-gradle:17. 0.0-beta01

android - 由于branch.io,应用程序已从 Google Play 中删除

android - 我为免费和高级应用程序使用哪些软件包?

android - 从Android电子市场下载时,我的应用程序不会安装在设备上

javascript - 有没有办法从终端重新启动无效/缓存?

firebase - UI 卡在闪屏中

javascript - 如何在 Google Dialogflow Fullfilment 内联编辑器中安装 npm 包

java - Android 上的自定义 View 和窗口属性