代码之家  ›  专栏  ›  技术社区  ›  Edouard Brèthes

Android:在运行时加载Lollipop上的应用程序库,但不加载IceCreamSandwich

  •  17
  • Edouard Brèthes  · 技术社区  · 9 年前

    我目前正在使用Android Studio开发Android应用程序。目前,该应用程序正在棒棒糖设备上完美启动,但由于 ClassNotFoundException 在棒棒糖前的设备上(我在ICS上测试过,但失败了)。

    缺少的类总是在运行时来自外部库。

    这是渐变文件:

        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:2.5.1@aar') {
            transitive = true;
        }
        compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
        compile 'com.github.johnpersano:supertoasts:1.3.4@aar'
        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:1.0.0@aar'
        compile 'com.facebook.android:facebook-android-sdk:4.1.0'
        compile 'com.github.navasmdc:MaterialDesign:1.5@aar'
        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
    

    我目前没有解决方案。任何有关这方面的线索都将不胜感激。

    谢谢 当做

    4 回复  |  直到 9 年前
        1
  •  28
  •   Devrim    8 年前

    1) 为您的应用程序添加multidex支持:

    compile 'com.android.support:multidex:1.0.1'
    

    2) 将应用程序设置为 MultiDexApplication 。选择以下选项之一:

    这是android的源代码 MultiDex应用程序 类别:

    public class MultiDexApplication extends Application {
        public MultiDexApplication() {
        }
    
        protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
            MultiDex.install(this);
        }
    }
    

    选项1) 您可以从扩展自定义应用程序 MultiDex应用程序 :

    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>
    

    注: 如果您正在使用自定义应用程序类(请参阅选项1和选项2), application 标签的 android:name 必须已设置为自定义应用程序类。

    3) 添加 multiDexEnabled true 设置为您的版本。放坡文件:

    defaultConfig {
        // Other settings here
        multiDexEnabled true
    }
    

    More information.

        2
  •  22
  •   Edouard Brèthes    9 年前

    我忘记在自定义应用程序类的onCreate()方法中的超级调用之后添加此行:

     MultiDex.install(getBaseContext());
    

    感谢凯恩的解决方案!

        3
  •  4
  •   TouchBoarder    9 年前

    在一些低端设备上添加 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
  •  0
  •   Pang firemonkey    7 年前

    您可以将其添加到清单文件的Application标记中。

    android:name="android.support.multidex.MultiDexApplication"