Android MultiDex ClassNotFoundException
Android MultiDex ClassNotFoundException
由于我的大型应用程序,我必须使用 MultiDex 为 pre 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.access00(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.access00(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)
为了完全避免使用 MultiDex,我建议您使用单独的 Google 播放服务模块,具体取决于您概述的具体要求 here。
将 minifyEnabled
设置为 true
并调整您的 ProGuard 条目。
使用 Instant 运行 目前也有问题。已在本 link.
中报道
@razzledazzle:非常感谢。这些提示非常有用。
在那之后,我遇到了下一个问题。在我的 apk 文件中分别缺少 classes class 定义。缺少一些 sugarmodels-classes(不是全部)。小工具classyshark和sugarlog帮帮我!
所以我比较了 classes 并找到了解决方案!
对于所有有 multiDex 问题的 Sugar-ORM 用户。我在我所有的 sugarclasses 中放置了调试变量的 "ignore"-注释,现在它们在 dex 文件中。
我不知道如何或为什么,但它有效...
@Ignore
public boolean multiDex;
也许有更好的解决方案,但我不知道...可能忽略注释的 RetentionPolicy
可以解决问题。
下一个可能的 Sugar-Orm 问题可能是 proguardtool。保留模型的 class 名称很重要。
-keep class com.package.example.models.* {*;}
这些规则为 proguard 保留了完整的 class。希望对你有帮助。
编码愉快...
由于我的大型应用程序,我必须使用 MultiDex 为 pre 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.access00(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.access00(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)
为了完全避免使用 MultiDex,我建议您使用单独的 Google 播放服务模块,具体取决于您概述的具体要求 here。
将 minifyEnabled
设置为 true
并调整您的 ProGuard 条目。
使用 Instant 运行 目前也有问题。已在本 link.
中报道@razzledazzle:非常感谢。这些提示非常有用。
在那之后,我遇到了下一个问题。在我的 apk 文件中分别缺少 classes class 定义。缺少一些 sugarmodels-classes(不是全部)。小工具classyshark和sugarlog帮帮我! 所以我比较了 classes 并找到了解决方案!
对于所有有 multiDex 问题的 Sugar-ORM 用户。我在我所有的 sugarclasses 中放置了调试变量的 "ignore"-注释,现在它们在 dex 文件中。 我不知道如何或为什么,但它有效...
@Ignore
public boolean multiDex;
也许有更好的解决方案,但我不知道...可能忽略注释的 RetentionPolicy
可以解决问题。
下一个可能的 Sugar-Orm 问题可能是 proguardtool。保留模型的 class 名称很重要。
-keep class com.package.example.models.* {*;}
这些规则为 proguard 保留了完整的 class。希望对你有帮助。
编码愉快...