【问题标题】:Android MultiDex ClassNotFoundExceptionAndroid MultiDex ClassNotFoundException
【发布时间】:2016-02-06 18:33:40
【问题描述】:

由于我的应用程序很大,我必须使用 MultiDex 将我的应用程序拆分为前 Lollipop 设备。 在我的 Nexus 4 (ICS 4.3) 上调试我的应用程序时,我收到以下错误。

为什么找不到我的课程?

defaultConfig {
  applicationId "de.itout.bring.handsoffme"
  minSdkVersion 17
  targetSdkVersion 23
  versionCode 6
  versionName "1.2"
  multiDexEnabled true
}
buildTypes {
  release {
      //signingConfig signingConfigs.debug
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      signingConfig signingConfigs.release
  }
  debug {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  }
} 
dexOptions {
        //javaMaxHeapSize "512m"
        //preDexLibraries = false
        javaMaxHeapSize "4g"
        incremental true
    }

dependencies {
    compile project(':emoji')
    provided fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.twitter.sdk.android:twitter:1.12.0'
    //compile 'com.google.android.gms:play-services-analytics:8.3.0'
    compile 'com.crashlytics.sdk.android:crashlytics:2.5.5'
    compile 'com.google.android.gms:play-services:8.3.0'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:support-v4:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'com.android.support:cardview-v7:23.1.1'
    compile 'com.android.support:recyclerview-v7:23.1.1'
    compile 'com.github.satyan:sugar:1.4'
    compile 'com.loopj.android:android-async-http:1.4.9'
    compile 'com.path:android-priority-jobqueue:1.1.2'
    compile 'com.anjlab.android.iab.v3:library:1.0.30'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.facebook.android:facebook-android-sdk:4.9.0'
}

  public class MyApplikation extends SugarApp {
     @Override
        protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
            //MultiDex.install(getApplicationContext());
            //MultiDex.install(getBaseContext());
            MultiDex.install(this);

        }

(编辑)

<application
        android:name=".MyApplikation"
        android:allowBackup="true"
        android:icon="@mipmap/my_icon"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="android:icon" >

Proguard-rules.pro

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-dontoptimize
-verbose

   FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication: java.lang.ClassNotFoundException: Didn't find class "com.android.tools.fd.runtime.BootstrapApplication" on path: DexPathList[[zip file "/data/app/de.itout.bring.handsoffme-2.apk"],nativeLibraryDirectories=[/data/app-lib/de.itout.bring.handsoffme-2, /vendor/lib, /system/lib]]
     at android.app.LoadedApk.makeApplication(LoadedApk.java:509)
     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4417)
     at android.app.ActivityThread.access$1300(ActivityThread.java:141)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
     at android.os.Handler.dispatchMessage(Handler.java:99)
     at android.os.Looper.loop(Looper.java:137)
     at android.app.ActivityThread.main(ActivityThread.java:5103)
     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:737)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
     at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.ClassNotFoundException: Didn't find class "com.android.tools.fd.runtime.BootstrapApplication" on path: DexPathList[[zip file "/data/app/de.itout.bring.handsoffme-2.apk"],nativeLibraryDirectories=[/data/app-lib/de.itout.bring.handsoffme-2, /vendor/lib, /system/lib]]
     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:53)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
     at android.app.Instrumentation.newApplication(Instrumentation.java:975)
     at android.app.LoadedApk.makeApplication(LoadedApk.java:504)
     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4417) 
     at android.app.ActivityThread.access$1300(ActivityThread.java:141) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:5103)

【问题讨论】:

  • prolly 因为MyApplikation 没有用作应用程序的应用程序类...
  • 您是否在 AndroidManifest 中引用了MyApplikation
  • 请同时向我们展示您的proguard-rules.pro 文件。可能是 proguard 简单地吃掉了它们(或其他东西),而你应该保留它们的类名而不是碰它们。
  • 是的。我在我的 Androidmanifestfile 中引用了该应用程序:

标签: java android android-multidex


【解决方案1】:

为完全避免使用 MultiDex,我建议您根据 here 概述的确切要求使用单独的 Google Play 服务模块。

minifyEnabled 设置为 true 并调整您的 ProGuard 条目。

目前使用 Instant Run 也有问题。已在此link报道。

【讨论】:

    【解决方案2】:

    @razzledazzle:非常感谢。这些提示非常有用。

    在那之后,我有下一个问题。在我的 apk 文件中分别缺少类定义。缺少一些糖模型类(不是全部)。小工具classyshark 和sugarlog 帮帮我! 所以我比较了类并找到了解决方案!

    适用于所有有 multiDex 问题的 Sugar-ORM-Users。我在所有的糖类中都为调试变量添加了“忽略”注释,现在它们位于 dexfile 中。 我不知道如何或为什么,但它有效...

     @Ignore
     public boolean multiDex;
    

    也许有更好的解决方案,但我不知道...可能忽略注释的 RetentionPolicy 可以解决问题。


    对于可能的 Sugar-Orm 问题,下一步可能是 proguardtool。保留模型的类名很重要。

    -keep class com.package.example.models.* {*;}
    

    这些规则保留了 proguard 的完整类。希望对你有帮助。

    编码愉快...

    【讨论】:

      猜你喜欢
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2016-02-08
      • 1970-01-01
      • 2017-10-16
      • 2016-08-25
      • 2015-02-05
      相关资源
      最近更新 更多