API 19上的Android Gradle Multidex Build问题

时间:2015-09-28 06:36:23

标签: android android-multidex

我有一个项目,我已启用multidex以避免65k limit以及productFlavors(dev API 21和prod API 19)进行自定义。 在API 21上构建我的项目,即dev风格是成功的但是在API 19即prod风格,它在app任务shrink{component}MultiDexComponents中不断给我异常

完整错误日志:

:app:shrinkProdDebugMultiDexComponents FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:shrinkProdDebugMultiDexComponents'.
> java.io.IOException: Can't read [{Project Path}/app/build/intermediates/multi-dex/prod/debug/allclasses.jar] (Can't process class [com/olivephone/office/a/b/e/p.class] (Unknown verification type [17] in stack map frame))

的build.gradle

apply plugin: 'com.android.application'

android {  
    compileSdkVersion 23  
    buildToolsVersion '23.0.0'  
    defaultConfig {  
        applicationId '{Project Name}'  
        minSdkVersion 15  
        targetSdkVersion 23  
        versionCode 1  
        versionName "1.0"  
        multiDexEnabled true  
    }  
    productFlavors {  
        dev {  
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin  
            // to pre-dex each module and produce an APK that can be tested on  
            // Android Lollipop without time consuming dex merging processes.  
            minSdkVersion 21  
        }  
        prod {  
            // The actual minSdkVersion for the application.  
            minSdkVersion 19  
        }  
    }  
    buildTypes {  
        release {  
            minifyEnabled false  
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
        }  
    }  
}  

dependencies {  
    compile fileTree(include: ['*.jar'], dir: 'libs')  
    compile 'com.android.support:appcompat-v7:23.0.1'  
    compile 'com.android.support:recyclerview-v7:23.0.1'  
    compile 'com.android.support:cardview-v7:23.0.1'  
    compile 'com.oguzdev:CircularFloatingActionMenu:1.0.2'  
    compile 'com.google.code.gson:gson:2.3.1'  
    compile 'com.google.android.gms:play-services:8.1.0'  
    compile 'com.android.support:multidex:1.0.1'  
    compile files('libs/linkedin-j-android.jar')  
    compile files('libs/itsrts-pptviewer.jar')  
    compile files('libs/signpost-core-1.2.1.1.jar')  
    compile 'org.twitter4j:twitter4j-core:4.0.2'  
    compile files('libs/universal-image-loader-1.9.2-SNAPSHOT-with-sources.jar')
    compile files('libs/dropbox-android-sdk-1.6.3.jar')  
    compile files('libs/json_simple-1.1.jar')  
    compile 'com.joanzapata.pdfview:android-pdfview:1.0.1@jar'  
    compile 'com.facebook.android:facebook-android-sdk:4.1.0'  
}

任何人都可以帮忙吗?

6 个答案:

答案 0 :(得分:9)

针对Android 5.0及更高版本的Multidex支持

  

Android 5.0及更高版本本身使用名为ART的运行时   支持从应用程序APK文件加载多个dex文件。艺术   在扫描的应用程序安装时执行预编译   classes(.. N).dex文件并将它们编译成单个.oat文件   由Android设备执行。有关Android的更多信息   5.0运行时,请参阅ART简介。

这就是为什么您的应用在API级别21上正常运行的原因。

Android 5.0之前的Multidex支持

  

Android 5.0之前的平台版本使用Dalvik运行时   用于执行应用程序代码默认情况下,Dalvik将应用程序限制为单个   每个APK的classes.dex字节码文件。为了解决这个问题   限制,你可以使用multidex支持库,它成为   应用程序的主要DEX文件的一部分,然后管理对其的访问   附加的DEX文件及其包含的代码。

所以,首先要确保你已经导入了正确的依赖,这似乎是你做的。

dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

在清单中,将multidex支持库中的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>

替代方案,如果您的应用扩展了Application课程,则可以覆盖attachBaseContext()方法并致电MultiDex.install(this)以启用multidex

public void onCreate(Bundle arguments) {
    MultiDex.install(getTargetContext());
    super.onCreate(arguments);
    ...
}

我希望它会帮助你。

答案 1 :(得分:1)

在API 21中,未调用:app:shrinkProdDebugMultiDexComponents命令,因为API 21已使用ART而不是Dalvik。因此,本机支持multidex。

对于低于21的API,则执行命令:app:shrinkProdDebugMultiDexComponents。 检查你的build.gradle一切看起来都很好,这让我得到以下结论。

您是否正确设置了多索支持?

您是否设置了清单以支持Multidex?

<?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>

如果您实际扩展了应用程序类,则可以执行此操作:

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

或使用此“预建”版本

public class MyApplication extends MultiDexApplication{

 ...     

}

答案 2 :(得分:1)

我还没有深入了解这背后的逻辑,但在我的情况下,这是由于我的 build.gradle compile 'com.android.support:appcompat-v7:25.3.1'和compile 'com.google.android.gms:play-services:10.2.4'的版本冲突造成的>文件。

仅启用multidex对我无效。在搜索其他解决方案时,我发现有些人抱怨play-services版本冲突的奇怪问题。所以,我回溯了代码更改,最后将play-services版本从 10.2.4 更改为 10.2.1 ,这对我有用。

答案 3 :(得分:1)

解决了崩溃问题。我删除了一些未使用的依赖项,并删除了rx java dependency io.reactivex.rxjava。替换Rx java我在我的包中添加了一些虚拟类,这里已经描述了https://realm.io/docs/java/latest

// File 1
package io.reactivex;
public class Flowable {
}
// File 2
package io.reactivex;
public class Observable {
}
// File 3
package io.reactivex;
public enum BackpressureStrategy {
   LATEST;
}

答案 4 :(得分:0)

请更改您的依赖项,如下所示:

已编辑的依赖项:

div

原因是'compile fileTree(dir:'libs',include:['* .jar'])'包括libs文件夹中所有要gradle的jar文件..

感谢。!!

答案 5 :(得分:0)

shrinkProdDebugMultiDexComponents任务invokes Proguard,因此此错误来自Proguard code

我的猜测是你没有使用最新版本的Olive Office SDK(可能是因为错误或配置错误的Proguard版本而混淆)。如果是这种情况,请从SDK开发人员那里获取最新版本。

要解决此问题,请检查this类似的错误。虽然它以wontfix状态关闭,但this blogpost描述了如何修补Proguard代码。

另请查看Eric Lafortune(Proguard的作者)关于类似问题的thisthat个答案。