几天前Android Studio 3.0发布了。同一天我更新了我的IDE版本和所有依赖项,包括Gradle插件版本。我的gradle文件的当前版本是^
build.gradle(project)
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.google.gms:google-services:3.1.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
maven { url "http://jzaccone.github.io/SlidingMenu-aar" }
maven { url "https://jitpack.io" }
flatDir { dirs "libs" }
}
}
build.gradle(mmodule:app)
buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.24.0'
}
}
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
repositories {
maven { url 'https://maven.fabric.io/public' }
google()
}
android {
compileSdkVersion 26
buildToolsVersion '26.0.2'
defaultConfig {
minSdkVersion 18
targetSdkVersion 26
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
/*Нельзя собрать мужское приложение для казахстана например, не понятно как это делать*/
flavorDimensions "country", "section"
productFlavors {
kz {
applicationId 'kz.kupivip.android'
dimension "country"
buildConfigField "String", "DOMEN", "\"kz\""
buildConfigField "String", "KNG_API_URL", "\"https://kng.kupivip.kz\""
buildConfigField "String", "PRE_API_URL", "\"http://kng.pre.kupivip.kz\""
buildConfigField "String", "DEV_API_URL", "\"http://kng.dev.kupivip.kz\""
buildConfigField "String", "CALL_CENTER_PHONE_NUMBER", "\"+77172727559\""
buildConfigField "String", "FCM_APP_NAME", "\"kazahstan\""
buildConfigField "Integer", "PHONE_DIGIT_LENGTH", "10"
buildConfigField "Integer", "BASKET_LIMIT", "6"
}
by {
applicationId 'by.kupivip.android'
dimension "country"
buildConfigField "String", "DOMEN", "\"by\""
buildConfigField "String", "KNG_API_URL", "\"https://kng.kupivip.by\""
buildConfigField "String", "PRE_API_URL", "\"http://kng.pre.kupivip.by\""
buildConfigField "String", "DEV_API_URL", "\"http://kng.dev.kupivip.by\""
buildConfigField "String", "CALL_CENTER_PHONE_NUMBER", "\"+375255400529\""
buildConfigField "String", "FCM_APP_NAME", "\"belarus\""
buildConfigField "Integer", "PHONE_DIGIT_LENGTH", "9"
buildConfigField "Integer", "BASKET_LIMIT", "10"
}
ru {
applicationId 'ru.kupivip.android'
dimension "country"
buildConfigField "String", "DOMEN", "\"ru\""
buildConfigField "String", "KNG_API_URL", "\"https://kng.kupivip.ru\""
buildConfigField "String", "PRE_API_URL", "\"http://pre.web.kupivip.local\""
buildConfigField "String", "DEV_API_URL", "\"http://dev.web.kupivip.local\""
buildConfigField "String", "CALL_CENTER_PHONE_NUMBER", "\"+7(495)99-444-99\""
buildConfigField "Integer", "PHONE_DIGIT_LENGTH", "10"
buildConfigField "Integer", "BASKET_LIMIT", "10"
}
kupivip {
dimension "section"
versionCode 83
versionName "3.8.0"
buildConfigField "boolean", "SEARCH_SUGGESTS_ON", "true"
buildConfigField "String", "SEARCH_FILTER", "\"ALL\""
buildConfigField "String", "FCM_APP_NAME", "\"native\""
}
kupivipmale {
dimension "section"
applicationId 'ru.kupivip.android.men'
versionName '3.6.2'
versionCode 21
buildConfigField "boolean", "SEARCH_SUGGESTS_ON", "false"
buildConfigField "String", "SEARCH_FILTER", "\"MALE\""
buildConfigField "String", "FCM_APP_NAME", "\"men\""
}
kupivipkids {
dimension "section"
applicationId 'ru.kupivip.android.kids'
versionName '3.6.2'
versionCode 10
buildConfigField "boolean", "SEARCH_SUGGESTS_ON", "false"
buildConfigField "String", "SEARCH_FILTER", "\"KIDS\""
buildConfigField "String", "FCM_APP_NAME", "\"kids\""
buildConfigField "String", "FCM_ALL_APP_NAME", "\"kids\""
}
kupivipluxe {
dimension "section"
applicationId 'ru.kupivip.android.luxe'
versionName '3.6.2'
versionCode 10
buildConfigField "boolean", "SEARCH_SUGGESTS_ON", "false"
buildConfigField "String", "SEARCH_FILTER", "\"ALL\""
buildConfigField "String", "FCM_APP_NAME", "\"premium\""
buildConfigField "String", "FCM_ALL_APP_NAME", "\"premium\""
}
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/notice.txt'
exclude 'META-INF/ASL2.0'
exclude 'META-INF/services/javax.annotation.processing.Processor' // butterknife
}
buildTypes {
release {
minifyEnabled false
buildConfigField "String", "AMPLITUDE_KEY", "\"a2e3631d72a8242c628d2580a82c857b\""
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "String", "PARTNER", "\"none\""
}
release_yandex.initWith(buildTypes.release)
release_yandex {
buildConfigField "String", "PARTNER", "\"yandex2016\""
}
release_aff_admon.initWith(buildTypes.release)
release_aff_admon {
buildConfigField "String", "PARTNER", "\"AFF_ADMON\""
}
alpha.initWith(buildTypes.debug)
alpha {
debuggable true
buildConfigField "String", "AMPLITUDE_KEY", "\"f62648415b602438f2059f46de739b29\""
buildConfigField "String", "PARTNER", "\"none\""
minifyEnabled false
}
}
lintOptions {
disable "ResourceType"
// butterknife без этого не дает собрать релиз https://github.com/JakeWharton/u2020/issues/216
}
dexOptions {
jumboMode = true
}
}
dependencies {
implementation 'com.android.support:multidex:1.0.2'
implementation fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
// Support
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:recyclerview-v7:26.1.0'
implementation 'com.android.support:cardview-v7:26.1.0'
implementation 'com.android.support:design:26.1.0'
implementation 'com.android.support:customtabs:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
// Google Services
implementation 'com.google.android.gms:play-services-maps:11.4.2'
implementation 'com.google.android.gms:play-services-analytics:11.4.2'
implementation 'com.google.android.gms:play-services-location:11.4.2'
// Firebase
implementation 'com.google.firebase:firebase-core:11.4.2'
implementation 'com.google.firebase:firebase-messaging:11.4.2'
implementation 'com.google.firebase:firebase-appindexing:11.4.2'
implementation 'com.google.firebase:firebase-config:11.4.2'
// ImageView with zoom and pan capabilities
implementation 'it.sephiroth.android.library.imagezoom:imagezoom:2.3.0'
// Dagger
implementation 'com.google.dagger:dagger-android:2.11'
implementation 'com.google.dagger:dagger-android-support:2.11' // if you use the support libraries
annotationProcessor 'com.google.dagger:dagger-android-processor:2.11'
annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
// Butterknife
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
// Robospice
implementation 'com.octo.android.robospice:robospice:1.4.14'
// RxJava
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.3'
// Retrofit
implementation 'com.squareup.retrofit:retrofit:1.9.0'
implementation 'com.squareup.okhttp:okhttp:2.5.0'
implementation 'com.squareup.okhttp:okhttp-urlconnection:2.5.0'
// Picasso
implementation 'com.squareup.picasso:picasso:2.5.2'
//Заменить на нативный
implementation 'com.daimajia.swipelayout:library:1.2.0@aar'
implementation 'me.zhanghai.android.materialprogressbar:library:1.1.6'
implementation 'org.florescu.android.rangeseekbar:rangeseekbar-library:0.3.0'
implementation 'com.commit451:PhotoView:1.2.4'
implementation 'io.branch.sdk.android:library:1.14.5'
//BottomSheet выводит дилог шаринга снизу
implementation 'com.flipboard:bottomsheet-core:1.5.3'
implementation 'com.flipboard:bottomsheet-commons:1.5.3'
// Crashlytics
implementation('com.crashlytics.sdk.android:crashlytics:2.5.7@aar') {
transitive = true;
}
implementation 'com.amplitude:android-sdk:2.7.1'
implementation 'com.facebook.android:facebook-android-sdk:4.20.0'
implementation 'com.github.bmelnychuk:atv:1.2.9'
// Appsflyer
implementation 'com.appsflyer:af-android-sdk:4.7.1@aar'
implementation ('com.github.tony19:timber-loggly:1.0.1')
}
////
在gradle同步过程中,所有依赖项都已解决。单元测试运行没有问题。但是当我尝试构建app - gradle show无法合并dex错误时。
来自gradle控制台的Stacktrace:
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformDexArchiveWithDexMergerForRuKupivipAlpha'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:105)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:99)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:580)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:99)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.RuntimeException: com.android.build.api.transform.TransformException: com.android.dex.DexException: Multiple dex files define Lorg/apache/commons/io/filefilter/CanReadFileFilter;
at com.android.builder.profile.Recorder$Block.handleException(Recorder.java:55)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:104)
at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:213)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:173)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:121)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:122)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:111)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
... 27 more
Caused by: com.android.build.api.transform.TransformException: com.android.dex.DexException: Multiple dex files define Lorg/apache/commons/io/filefilter/CanReadFileFilter;
at com.android.build.gradle.internal.transforms.DexMergerTransform.transform(DexMergerTransform.java:230)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:222)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:218)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
... 39 more
Caused by: com.android.dex.DexException: Multiple dex files define Lorg/apache/commons/io/filefilter/CanReadFileFilter;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:661)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:616)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:598)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:198)
at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:61)
at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:36)
这里有什么不妥?
答案 0 :(得分:1)
也许这对某些人有帮助。
这个错误是因为commons / io和robospice。 (或者其他具有commons / io依赖关系的依赖项)在我的例子中,它是robospice。 你需要像这样添加Robospice:
implementation('com.octo.android.robospice:robospice:1.4.14') {
exclude module: 'commons-io'
}
使用gradle 4.1和AS 3.0+有关commos-io错误的其他信息,您可以在google中找到。这种方法使我感到高兴。