在AndroidStudio使用中砸紊,很多人會(huì)遇到Duplicate files copied in APK 這種錯(cuò)誤,導(dǎo)致程序不能編譯或者不能打包。出現(xiàn)這種原因就是在編譯或者打包階段出現(xiàn)文件重復(fù)的問題格郁,其實(shí)解決這些問題很簡單,我們只需要根據(jù)錯(cuò)誤提示增加在gradle文件配置packagingOptions配置独悴。
在之前eclipse項(xiàng)目時(shí)使用apache-mime4j-0.6.jar和httpmime-4.0.jar例书,后來轉(zhuǎn)到Androidstudio后出現(xiàn)下面的錯(cuò)誤
Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/DEPENDENCIES
File1: E:\Project\MyApp\app\libs\apache-mime4j-0.6.jar
File2: E:\Project\MyApp\app\libs\httpmime-4.0.jar
看到提示說Duplicate files copied in APK META-INF/DEPENDENCIES,也就是這兩個(gè)jar中都有一個(gè)DEPENDENCIES文件刻炒,導(dǎo)致編譯或者打包合并時(shí)出現(xiàn)錯(cuò)誤决采。既然是文件重復(fù)出的錯(cuò),我們只需要在packagingOptions設(shè)置排除該文件即可坟奥。
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
packagingOptions{
exclude 'META-INF/DEPENDENCIES'
}
defaultConfig {
applicationId "com.myapp.test"
minSdkVersion 17
targetSdkVersion 21
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile 'com.android.support:support-v4:22.0.0'
compile files('libs/apache-mime4j-0.6.jar')
compile files('libs/httpmime-4.0.jar')
}
一般情況還會(huì)出現(xiàn)NOTICE树瞭,LICENSE文件也會(huì)重復(fù)。
packagingOptions{
exclude 'META-INF/NOTICE' // will not include NOTICE file
exclude 'META-INF/LICENSE' // will not include LICENSE file
exclude 'META-INF/DEPENDENCIES'
}
多Module jar重復(fù)
當(dāng)我們創(chuàng)建多個(gè)Module并且都使用了某一個(gè)依賴如加入下面依賴
compile 'com.google.code.gson:gson:2.6.2'
當(dāng)我們?cè)贛oudule 中都加入了依賴后就會(huì)出現(xiàn)jar重復(fù)筏勒,導(dǎo)致運(yùn)行失敗移迫,此時(shí)我們可以將其中一個(gè)Moudle的依賴保留上面寫法旺嬉,其余更如下
provided 'com.google.code.gson:gson:2.6.2'
或者右鍵module,選擇open module setting,選擇要修改的module名管行,切換到dependencies頁面,將要修改的jar的scope設(shè)置為provided模式邪媳。
使用第三方依賴 jar重復(fù)
當(dāng)我們不同Module使用了同一個(gè)依賴時(shí)可以更改scope為provided模式捐顷,但是如果我們使用的的兩個(gè)第三方依賴中包含有相同的jar的,我們就不能更改scope,雨效。如我們項(xiàng)目中使用了下面兩個(gè)依賴
compile'com.microsoft.projectoxford:vision:0.5.0'
compile 'com.microsoft.projectoxford:emotion:1.0.0'
此時(shí)運(yùn)行程序會(huì)出現(xiàn)錯(cuò)誤提示
Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForArmDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/maven/commons-io/commons-io/pom.xml
File1: E:\Project\MyApp\app\build\intermediates\exploded-aar\com.microsoft.projectoxford\vision\0.5.0\jars\libs\commons-io-2.4.jar
File2: E:\Project\MyApp\app\build\intermediates\exploded-aar\com.microsoft.projectoxford\emotion\1.0.0\jars\libs\commons-io-2.4.jar
通過提示我們看出這兩個(gè)依賴中都使用了commons-io-2.4.jar迅涮,為了保證運(yùn)行,我們根據(jù)提示慢慢修改嗎徽龟,在packagingOptions中加入下面配置
exclude 'META-INF/maven/commons-io/commons-io/pom.xml'
加入后再次運(yùn)行又出現(xiàn)錯(cuò)誤
Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForArmDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/maven/commons-io/commons-io/pom.properties
File1: E:\Project\MyApp\app\build\intermediates\exploded-aar\com.microsoft.projectoxford\vision\0.5.0\jars\libs\commons-io-2.4.jar
File2: E:\Project\MyApp\app\build\intermediates\exploded-aar\com.microsoft.projectoxford\emotion\1.0.0\jars\libs\commons-io-2.4.jar
根據(jù)提示繼續(xù)在packagingOptions中加入下面配置
exclude 'META-INF/maven/commons-io/commons-io/pom.properties'
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.myapp.test"
minSdkVersion 16
targetSdkVersion 22
versionCode 6
versionName "1.0"
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/maven/commons-io/commons-io/pom.xml'
exclude 'META-INF/maven/commons-io/commons-io/pom.properties'
}
sourceSets {
main {
java.srcDirs = ['src/main/java']
jniLibs.srcDir 'libs'
}
debug.setRoot('build-types/debug')
debug.res.srcDirs = ['src/debug/res']
release.setRoot('build-types/release')
}
}
dependencies {
compile('com.microsoft.projectoxford:vision:0.5.0'){
exclude group: 'org.apache.commons.io'
}
compile 'com.microsoft.projectoxford:emotion:1.0.0'
}