Android: приложение загружает библиотеку во время выполнения на Lollipop, но не IceCreamSandwich
В настоящее время я разрабатываю приложение для Android с помощью Android Studio. В настоящее время приложение отлично запускается на устройствах Lollipop, но сбой при запуске из-за ClassNotFoundException
на предустановленных устройствах (я тестировал на ICS, и он не работает).
Пропущенный класс всегда из внешних librairies во время выполнения.
Здесь gradle файл:
buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
}
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
android {
compileSdkVersion 23
buildToolsVersion '23.0.0'
defaultConfig {
applicationId 'com.kappsports.kapp10'
minSdkVersion 18
targetSdkVersion 23
versionCode 1
versionName '1.0.0'
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
shrinkResources true
}
}
lintOptions {
abortOnError false
}
dexOptions {
incremental true
javaMaxHeapSize '4g'
}
}
repositories {
mavenCentral()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
maven { url 'https://maven.fabric.io/public' }
jcenter()
}
dependencies {
compile fileTree(dir: 'libs', exclude: 'android-support-v4.jar', include: '*.jar')
compile('com.crashlytics.sdk.android:crashlytics:[email protected]') {
transitive = true;
}
compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
compile 'com.github.johnpersano:supertoasts:[email protected]'
compile 'com.google.code.gson:gson:2.3'
compile 'com.squareup:otto:1.3.5'
compile 'com.makeramen:roundedimageview:1.3.0'
compile 'com.jakewharton:butterknife:6.0.0'
compile 'com.malinskiy:superrecyclerview:1.0.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.jpardogo.materialtabstrip:library:1.0.9'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'org.buraktamturk:loadingview:[email protected]'
compile 'com.facebook.android:facebook-android-sdk:4.1.0'
compile 'com.github.navasmdc:MaterialDesign:[email protected]'
compile 'net.danlew:android.joda:2.8.2'
//noinspection GradleCompatible
compile 'com.android.support:appcompat-v7:22.2.1'
compile 'com.google.android.gms:play-services:7.5.0'
//noinspection GradleCompatible
compile 'com.android.support:recyclerview-v7:22.2.1'
}
Ниже приведен файл вывода logcat:
> 09-06 23:25:58.414 27436-27436/? W/dalvikvm﹕ Link of class
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414
> 27436-27436/? E/dalvikvm﹕ Could not find class
> 'io.fabric.sdk.android.InitializationTask', referenced from method
> io.fabric.sdk.android.Kit.<init> 09-06 23:25:58.414 27436-27436/?
> W/dalvikvm﹕ VFY: unable to resolve new-instance 8228
> (Lio/fabric/sdk/android/InitializationTask;) in
> Lio/fabric/sdk/android/Kit; 09-06 23:25:58.414 27436-27436/?
> D/dalvikvm﹕ VFY: replacing opcode 0x22 at 0x0003 09-06 23:25:58.414
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414
> 27436-27436/? W/dalvikvm﹕ Link of class
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414
> 27436-27436/? W/dalvikvm﹕ Link of class
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414
> 27436-27436/? I/dalvikvm﹕ Could not find method
> io.fabric.sdk.android.InitializationTask.getDependencies, referenced
> from method io.fabric.sdk.android.Kit.getDependencies 09-06
> 23:25:58.414 27436-27436/? W/dalvikvm﹕ VFY: unable to resolve virtual
> method 57413:
> Lio/fabric/sdk/android/InitializationTask;.getDependencies
> ()Ljava/util/Collection; 09-06 23:25:58.414 27436-27436/? D/dalvikvm﹕
> VFY: replacing opcode 0x6e at 0x0002 09-06 23:25:58.414 27436-27436/?
> W/dalvikvm﹕ VFY: unable to find class referenced in signature
> (Lio/fabric/sdk/android/services/common/IdManager;) 09-06 23:25:58.414
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414
> 27436-27436/? W/dalvikvm﹕ Link of class
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414
> 27436-27436/? W/dalvikvm﹕ Link of class
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414
> 27436-27436/? I/dalvikvm﹕ Could not find method
> io.fabric.sdk.android.InitializationTask.executeOnExecutor, referenced
> from method io.fabric.sdk.android.Kit.initialize 09-06 23:25:58.414
> 27436-27436/? W/dalvikvm﹕ VFY: unable to resolve virtual method 57412:
> Lio/fabric/sdk/android/InitializationTask;.executeOnExecutor
> (Ljava/util/concurrent/ExecutorService;[Ljava/lang/Object;)V 09-06
> 23:25:58.414 27436-27436/? D/dalvikvm﹕ VFY: replacing opcode 0x6e at
> 0x0011 09-06 23:25:58.414 27436-27436/? W/dalvikvm﹕ VFY: unable to
> find class referenced in signature
> (Lio/fabric/sdk/android/services/common/IdManager;) 09-06 23:25:58.419
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.419
> 27436-27436/? W/dalvikvm﹕ Link of class
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.419
> 27436-27436/? D/dalvikvm﹕ DexOpt: unable to opt direct call 0xe03e at
> 0x05 in Lio/fabric/sdk/android/Kit;.<init> 09-06 23:25:58.419
> 27436-27436/? D/AndroidRuntime﹕ Shutting down VM 09-06 23:25:58.419
> 27436-27436/? W/dalvikvm﹕ threadid=1: thread exiting with uncaught
> exception (group=0x41bfb700) 09-06 23:25:58.419 27436-27436/?
> E/AndroidRuntime﹕ FATAL EXCEPTION: main
> java.lang.NoClassDefFoundError: io.fabric.sdk.android.services.common.ExecutorUtils
> at com.crashlytics.android.core.CrashlyticsCore.<init>(CrashlyticsCore.java:205)
> at com.crashlytics.android.core.CrashlyticsCore$Builder.build(CrashlyticsCore.java:189)
> at com.kappsports.kapp10.Kapp10Application.onCreate(Kapp10Application.java:53)
> at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024)
> at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4684)
> at android.app.ActivityThread.access$1400(ActivityThread.java:159)
> at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1376)
> at android.os.Handler.dispatchMessage(Handler.java:99)
> at android.os.Looper.loop(Looper.java:176)
> at android.app.ActivityThread.main(ActivityThread.java:5419)
> at java.lang.reflect.Method.invokeNative(Native Method)
> at java.lang.reflect.Method.invoke(Method.java:525)
> at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
> at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
> at dalvik.system.NativeStart.main(Native Method) 09-06 23:25:58.424 2346-2891/? I/ActivityManager﹕ Notify an
> ApplicationCrash
В настоящее время у меня нет решения. Любая подсказка об этом будет оценена.
Спасибо,
С наилучшими пожеланиями.
Ответы
Ответ 1
1) Добавьте поддержку multidex в ваше приложение:
compile 'com.android.support:multidex:1.0.1'
2) Установите приложение как MultiDexApplication
. Выберите один из следующих вариантов:
Это исходный код класса android MultiDexApplication
:
public class MultiDexApplication extends Application {
public MultiDexApplication() {
}
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
Вариант 1). Вы можете расширить свое пользовательское приложение с MultiDexApplication
:
public class MyApplication extends MultiDexApplication {
// Your application implementation here
}
Вариант 2). Вы можете расширить свое настраиваемое приложение из класса Application
по умолчанию, тогда вам нужно вызвать метод MultiDex.install
в attachBaseContext(Context base)
:
public class MyApplication extends Application {
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
// Your application implementation here
}
Вариант 3) Если у вас нет специального приложения, и вы его не хотите, просто установите имя вашего приложения (на AndroidManifest.xml) в 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>
Примечание.. Если вы используете собственный класс приложения (см. Option1 и Option2), тег Application
android:name
уже должен быть установлен в ваш собственный класс приложения.
3) Добавьте multiDexEnabled true
в свой файл build.gradle:
defaultConfig {
// Other settings here
multiDexEnabled true
}
Дополнительная информация.
Ответ 2
Я забыл добавить эту строку сразу после супервызов метода onCreate() моего собственного класса приложения:
MultiDex.install(getBaseContext());
Спасибо Кейну за решение!
Ответ 3
На некоторых устройствах младшего класса добавление MultiDex.install(getBaseContext());
в MyApplication onCreate()
не работает? вызывая java.lang.NoClassDefFoundError
:
Что работала с добавлением MultiDex.install(getBaseContext());
в MyApplication attachBaseContext(Context base)
public class MyApplication extends Application {
...
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
...
Ответ 4
Вы можете добавить это в тег приложения файла манифеста.
android:name="android.support.multidex.MultiDexApplication"