几个星期以来,我一直在努力找出为什么“LGE Nexus 5(锤头)、2048MB RAM、Android 5.0”设备不断报告崩溃并显示 java.lang.NoClassDefFoundError
。由 ClassNotFoundException
引起在 Google Play 中 beta app .
我的问题是找出缺少哪个类-
报告的函数名称(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);
}
}
我不知道如何修复这些崩溃以及如何识别应该丢失的类...
我测试版程序中的其他设备不会崩溃:
更新:添加 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/