我已将我的应用程序转换为MultiDex以承受64k dex限制.现在它看起来像这样:
public class App extends MultiDexApplication { private AppWrapper instance; @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(base); } @Override public void onCreate() { super.onCreate(); if (instance == null) { instance = new AppWrapper(this); } } }
我已经从App中删除了所有常用的逻辑来AppWidget
完成MultiDex
工作.它在其他队友的电脑上运行正常.但不是和我在一起.它不断抛出java.lang.NoClassDefFoundError
应用程序创建:
I/dalvikvm? Failed resolving Lcom/playday/app/core/AppWrapper; interface 8940 'Lretrofit/ErrorHandler;' W/dalvikvm? Link of class 'Lcom/playday/app/core/AppWrapper;' failed I/dalvikvm? Failed resolving Lcom/playday/app/core/AppWrapper; interface 8940 'Lretrofit/ErrorHandler;' W/dalvikvm? Link of class 'Lcom/playday/app/core/AppWrapper;' failed E/dalvikvm? Could not find class 'com.playday.app.core.AppWrapper', referenced from method com.playday.app.core.App.onCreate W/dalvikvm? VFY: unable to resolve new-instance 7076 (Lcom/playday/app/core/AppWrapper;) in Lcom/playday/app/core/App; D/dalvikvm? VFY: replacing opcode 0x22 at 0x0007 I/dalvikvm? Failed resolving Lcom/playday/app/core/AppWrapper; interface 8940 'Lretrofit/ErrorHandler;' W/dalvikvm? Link of class 'Lcom/playday/app/core/AppWrapper;' failed D/dalvikvm? DexOpt: unable to opt direct call 0xc21b at 0x09 in Lcom/playday/app/core/App;.onCreate I/MultiDex? VM with version 1.6.0 does not have multidex support I/MultiDex? install I/MultiDex? MultiDexExtractor.load( /data/app/com.playdayteam.playday.debug-1.apk, false) I/MultiDex? Detected that extraction must be performed. I/MultiDex? Trying to delete old file /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday. debug-2.apk.classes2.dex of size 1484912 I/MultiDex? Deleted old file /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday.debug-2 .apk.classes2.dex I/MultiDex? Trying to delete old file /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday. debug-2.apk.classes2.zip of size 540964 I/MultiDex? Deleted old file /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday.debug-2 .apk.classes2.zip D/dalvikvm? GC_CONCURRENT freed 186K, 11% free 3245K/3640K, paused 2ms+4ms, total 28ms D/dalvikvm? WAIT_FOR_CONCURRENT_GC blocked 5ms D/dalvikvm? GC_CONCURRENT freed 156K, 8% free 3593K/3904K, paused 3ms+2ms, total 22ms I/MultiDex? Extraction is needed for file /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam. playday.debug-1.apk.classes2.zip I/MultiDex? Extracting /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday.debug-1 .apk.classes576886388.zip I/MultiDex? Renaming to /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday.debug-1 .apk.classes2.zip I/MultiDex? Extraction success - length /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday. debug-1.apk.classes2.zip: 540964 I/MultiDex? load found 1 secondary dex files D/dalvikvm? DexOpt: --- BEGIN 'com. playdayteam.playday.debug-1.apk.classes2.zip' (bootstrap=0) --- D/dalvikvm? DexOpt: --- END 'com. playdayteam.playday.debug-1.apk.classes2.zip' (success) --- D/dalvikvm? DEX prep '/data/data/com .playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday.debug-1.apk.classes2. zip': unzip in 28ms, rewrite 387ms I/MultiDex? install done I/MultiDex? install D/AndroidRuntime? Shutting down VM W/dalvikvm? threadid=1: thread exiting with uncaught exception (group=0x41c1d930) E/AndroidRuntime? FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.playday.app.core.AppWrapper at com.playday.app.core.App.onCreate(App.java:22) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1006) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4457) at android.app.ActivityThread.access$1300(ActivityThread.java:142) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1332) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5105) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method)
我有相同的Android Studio,gradle,sdk,jdk版本,相同的代码.我甚至尝试格式化硬盘并重新安装操作系统以确保环境相同.这个奇怪问题的原因是什么?
这是我的build.gradle
:
apply plugin: 'com.android.application' repositories { maven { url 'http://dl.bintray.com/populov/maven' } mavenCentral() maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } } android { compileSdkVersion project.api_level buildToolsVersion project.build_tools_version defaultConfig { minSdkVersion 14 targetSdkVersion project.api_level } sourceSets { instrumentTest.setRoot('src/test') } packagingOptions { exclude 'META-INF/LICENSE.txt' exclude 'META-INF/LICENSE' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/NOTICE' exclude 'META-INF/ASL2.0' exclude 'AndroidManifest.xml' } defaultConfig { versionName "0.3.2" versionCode 23 } buildTypes { debug { debuggable true applicationIdSuffix ".debug" } beta { debuggable true signingConfig signingConfigs.release applicationIdSuffix ".beta" } release { signingConfig signingConfigs.release runProguard false proguardFile file('proguard-rules.txt') proguardFile getDefaultProguardFile('proguard-android-optimize.txt') } } dexOptions { incremental false preDexLibraries false } } dependencies { compile "com.android.support:support-v13:$project.support_lib_version" compile "com.android.support:support-v4:$project.support_lib_version" compile "com.android.support:appcompat-v7:$project.support_lib_version" compile 'com.google.android.gms:play-services:6.1.11' compile('de.keyboardsurfer.android.widget:crouton:1.8.5@aar') { exclude group: 'com.google.android', module: 'support-v4' } compile('com.octo.android.robospice:robospice:1.4.14'){ exclude group: 'commons-io', module: 'commons-io' } compile('com.octo.android.robospice:robospice-retrofit:1.4.14'){ exclude group: 'commons-io', module: 'commons-io' } compile 'com.squareup.retrofit:retrofit:1.6.1' compile 'com.google.code.gson:gson:2.3' compile 'com.viewpagerindicator:library:2.4.1@aar' compile 'com.squareup.picasso:picasso:2.3.3' compile 'com.squareup.okhttp:okhttp:2.0.0' compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0' compile 'com.etsy.android.grid:library:1.0.5' compile 'com.squareup:otto:1.3.4' compile 'com.darwinsys:hirondelle-date4j:1.5.1' compile 'com.github.chrisbanes.photoview:library:1.2.3' compile 'me.grantland:autofittextview:0.2.0' compile 'it.sephiroth.android.library.horizontallistview:library:1.2.1' compile 'org.ocpsoft.prettytime:prettytime:3.2.4.Final' compile 'com.google.guava:guava:18.0' compile 'com.github.castorflex.smoothprogressbar:library:0.5.2' compile 'com.makeramen:roundedimageview:1.3.0' compile 'org.lucasr.twowayview:twowayview:0.1.1' compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT' compile project(':libs:LoopingViewPager') compile project(':libs:PhotoView-2.2.1') compile files('libs/localytics.jar') compile files('libs/android-support-multidex.jar') compile 'net.hockeyapp.android:HockeySDK:3.0.2' } afterEvaluate { tasks.matching { it.name.startsWith('dex') }.each { dx -> if (dx.additionalParameters == null) { dx.additionalParameters = [] } dx.additionalParameters += '--multi-dex' // enable multidex dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString() } }
更新.我的multidex.keep
档案:
android/support/multidex/BuildConfig.class android/support/multidex/MultiDex$V14.class android/support/multidex/MultiDex$V19.class android/support/multidex/MultiDex$V4.class android/support/multidex/MultiDex.class android/support/multidex/MultiDexApplication.class android/support/multidex/MultiDexExtractor$1.class android/support/multidex/MultiDexExtractor.class android/support/multidex/ZipUtil$CentralDirectory.class android/support/multidex/ZipUtil.class com/playday/app/models/notification/Badge.class com/playday/app/models/User.class com/playday/app/core/AppWrapper.class com/playday/app/core/App.class
Alex Lipov.. 12
你AppWrapper类加载失败,因为retrofit.ErrorHandler接口不是主要DEX文件包括在内.
如何计算要放在main-dex-list文件中的类?
有一个脚本可以为您生成它.我写了一篇博客文章,展示了如何使用它.
更新(
2014年10月31日):Gradle插件v0.14.0现在自动完成.在这里看到我的答案.
更新(24/04/2017) :
该开发人员指南解释了如何选择具体的班级,选择的gradle如果它不自动拾取所有正确的.
如果有人因为他们的应用程序类没有在前Lollipop设备上找到,但是应用程序在Lollipop及以上版本上运行正常,那么这似乎是Jack和Multidex的已知问题.
参考:杰克问题213484
参考:杰克问题224026
如果一切正常,但出现此错误,
尝试禁用即时运行!
当我禁用它时,所有类都正确加载.
如果您正在扩展MultiDexApplication,则不需要进行MultiDex.install(context)调用,因为它已经发生(请参阅源链接).如果您需要使用attachBaseContext,那么只需确保调用super.attachBaseContext(context).
https://android.googlesource.com/platform/frameworks/multidex/+/1bb1ab007f6b9405227ea4ce07d2061e4dbb6fe0/library/src/android/support/multidex/MultiDexApplication.java
我们刚刚更新了developers.android.com,其中包含有关如何将支持库与Android gradle插件一起使用的说明,其中包括用于快速开发构建周期时间的开发优化.
https://developer.android.com/tools/building/multidex.html
你AppWrapper类加载失败,因为retrofit.ErrorHandler接口不是主要DEX文件包括在内.
如何计算要放在main-dex-list文件中的类?
有一个脚本可以为您生成它.我写了一篇博客文章,展示了如何使用它.
更新(
2014年10月31日):Gradle插件v0.14.0现在自动完成.在这里看到我的答案.
更新(24/04/2017) :
该开发人员指南解释了如何选择具体的班级,选择的gradle如果它不自动拾取所有正确的.