我有一个项目,我已启用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'
}
任何人都可以帮忙吗?
答案 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代码。