Android Gradle在API 19上的Multidex构建问题

11
我有一个项目,启用了multidex以避免65k限制,并使用productFlavors(dev API 21和prod API 19)进行定制。 在API 21即dev flavor上构建我的项目成功,但在API 19即prod flavor上,它在应用程序任务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'  
}

请问有人能帮忙吗?关于IT技术的问题。

1
已经尝试过了!!没有成功。 - Sidakpreet N
您是否在使用Proguard? - Giorgio Antonioli
@Fondesa 不,没有使用Proguard。 - Sidakpreet N
@AndiGeeky 编辑了带有 build.gradle 的问题。 - Sidakpreet N
问题出在编译文件('libs/itsrts-pptviewer.jar')上。这个jar文件在libs文件夹里面。如果你把它移除掉,那么程序就可以正常工作了。 - Jayakrishnan
你成功了吗?如果是,怎么做到的?我卡住了。。 - Benobab
6个回答

11

Android 5.0 及以上版本的 Multidex 支持

Android 5.0 及以上版本使用名为 ART 的运行时环境,原生支持从应用程序 APK 文件中加载多个 dex 文件。ART 在应用程序安装时执行预编译,扫描 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);
    ...
}

我希望这能帮助你解决问题。


谢谢.. Bhuvesh,我刚刚在我的应用程序文件中添加了以下代码,它解决了问题,在oncreate中没有BUNDLE,在那之前我只使用了MULTIDEX JAR在我的构建中,但是我的应用程序在低于API 21的运行时崩溃..现在它可以工作了,不知道背后的原因。 public void onCreate( ) { MultiDex.install(this); super.onCreate(); // 初始化单例 sInstance = this; } - Jishant

1

解决了上述崩溃问题。我删除了一些未使用的依赖项,也删除了 RxJava 依赖 io.reactivex.rxjava。作为 RxJava 的替代,我在我的包中添加了一些虚拟类,这些类已经在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;
}

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,这对我有效。

1
在API 21中,由于API 21已经使用ART而非Dalvik,因此不会调用:app:shrinkProdDebugMultiDexComponents命令。因此,原生支持multidex。
对于API低于21的情况,则执行:app:shrinkProdDebugMultiDexComponents命令。检查您的build.gradle,一切看起来都很好,这就带我来到了以下问题。
您是否正确设置了multidex支持?
您是否设置了支持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{

 ...     

}

0

shrinkProdDebugMultiDexComponents任务调用Proguard,因此此错误来自Proguard 代码

我猜测您可能没有使用最新版本的Olive Office SDK(该版本可能使用有缺陷或配置不正确的Proguard版本进行混淆)。如果是这种情况,请从SDK开发人员处获取最新版本。

对于解决方法,请检查类似的错误。虽然它已经被关闭,但此博客文章描述了如何修补Proguard代码。

还请查看Eric Lafortune(Proguard的作者)在类似问题上的个答案。


0
请按以下方式更改您的依赖项:
编辑后的依赖项:
compile fileTree(dir: 'libs', include: ['*.jar'])
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 'com.googlecode.linkedin-j:linkedin-j-core:1.0.416'
compile 'oauth.signpost:signpost-core:1.2.1.2'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.4'
compile 'com.googlecode.json-simple:json-simple:1.1'
compile 'org.twitter4j:twitter4j-core:4.0.2'
compile files('libs/itsrts-pptviewer.jar')
compile files('libs/dropbox-android-sdk-1.6.3.jar')
compile 'com.joanzapata.pdfview:android-pdfview:1.0.1@jar'
compile 'com.facebook.android:facebook-android-sdk:4.1.0'  

原因是'compile fileTree(dir: 'libs', include: ['*.jar'])'将libs文件夹中的所有jar文件都包含在gradle中。

Thanks.!!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接