android - repetidos - eliminar archivos duplicados sin programas
Android Studio: archivos duplicados copiados en APK META-INF/DEPENDENCIAS cuando se compilan (5)
Exporté mi proyecto desde Eclipse e importé a Android Studio usando las instrucciones en este enlace: http://developer.android.com/sdk/installing/migrate.html
Cuando construyo, tengo un error:
Duplicate files copied in APK META-INF/DEPENDENCIES
Después de buscar, encontré una solución: agregar
packagingOptions {
exclude ''META-INF/DEPENDENCIES''
}
en build.gradle
¡Y funciona!
Pero no entiendo por qué tuve este error y por qué tuve que aplicar esa corrección. ¿Alguien puede explicar?
En las compilaciones de Android Gradle, no está permitido incluir el mismo archivo con la misma ruta más de una vez en el resultado. En su compilación, había dos archivos META-INF/DEPENDENCIES
procedentes de diferentes lugares. Como no necesita este archivo en absoluto en su aplicación, lo más simple es decirle al sistema de compilación que lo ignore por completo, que es lo que hace esta directiva de exclude
.
También hay una directiva pickFirst
para decirle al sistema de compilación que conserve una de las copias; hay una pequeña cantidad de detalles sobre eso en Android Gradle plugin 0.7.0: "archivos duplicados durante el empaquetado de APK" .
Las compilaciones de Android en Gradle son bastante estrictas con los archivos duplicados, lo que puede dificultar la vida. Hay un problema similar si incluye la misma clase de Java más de una vez, donde obtiene el error " Definición de varios archivos dex" (consulte los archivos Dex múltiples para definir Landroid / support / v4 / accessibilityservice / AccessibilityServiceInfoCompat ) para ver un ejemplo típico).
Otros sistemas de construcción son más indulgentes. Es típico en Java que si incluye la misma clase más de una vez en un classpath, por ejemplo, la primera copia que ve es la que se usa; los duplicados después de eso son ignorados. Esto es en la mayoría de los casos más fácil de tratar, pero tiene un par de problemas. La más importante es que puede haber errores sutiles si múltiples versiones diferentes de un archivo se infiltran en la construcción sin que usted lo sepa; puede ser difícil averiguar qué está pasando. Cuando lo resuelves, normalmente puedes resolverlo haciendo malabares con el orden en que se incluyen las cosas para asegurarte de que el que quieres llegue al resultado final, pero en construcciones muy complejas, esto puede ser difícil de lograr, y puede suceder que hacer cosas aparentemente no relacionadas, como incluir nuevas bibliotecas en su proyecto, pueda alterar el orden y generar muchas dificultades.
Por esa razón, Gradle tiene la filosofía de no confiar en el orden de las cosas para determinar los "ganadores" en el juego de resolución de duplicados, y obliga al desarrollador a explicitar todas las dependencias. La implementación de Android de su sistema de compilación sobre Gradle sigue esa filosofía.
La forma más fácil que he encontrado para resolver este problema es utilizar un comodín, por lo que no tiene que declarar manualmente cada archivo en conflicto.
packagingOptions {
pickFirst ''**''
}
La solución más simple es agregar
packagingOptions {
pickFirst ''META-INF/*''
}
a su build.gradle en la sección de Android
Si bien la respuesta de Scott Barta es correcta, le falta una solución simple y común: simplemente agregue
android {
packagingOptions {
exclude ''META-INF/DEPENDENCIES''
exclude ''META-INF/NOTICE''
exclude ''META-INF/LICENSE''
exclude ''META-INF/LICENSE.txt''
exclude ''META-INF/NOTICE.txt''
}
}
a su build.gradle para ignorar esos duplicados.