Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


La compilación de Android no fusionará los manifiestos de las bibliotecas

Tenemos varios proyectos, dependiendo de muchos módulos de lib de Android. Para evitar las etiquetas xml duplicadas en los manifiestos de aplicaciones, ponemos los receptores, servicios y actividades relevantes en sus respectivos módulos.

Hasta hoy, hemos utilizado:

  • ¿Es posible utilizar Java 8 para el desarrollo de Android?
  • Cómo realizar una prueba de unidad
  • No se puede encontrar la opción de módulo de importación en la estructura del proyecto (Android Studio 0.3.4 - 0.5.2)
  • Facebook strings no tiene traducción por defecto
  • "La configuración de firma se debe especificar en los scripts de compilación de Gradle" ... lo hice
  • El módulo de prueba de Android (Gradle Plugin 1.3) no funciona: "debug-classes not found"
    • Android Studio: 2.2.1
    • Gradle: 2.1.3
    • BuildToolsVersion: 23.0.3

    Hoy hemos actualizado a:

    • Android Studio: 2.3
    • Gradle: 2.3.0
    • BuildToolsVersion: 25.0.0

    Hasta esta actualización, todo funcionó bien y los manifiestos se fusionaron, tuvimos conflictos y los arreglamos. A partir de la actualización que hemos hecho, los manifiestos no se fusionan, en absoluto!

    — Actualización 1 —

    Hemos usado la vista Manifiesto fusionado, y vimos que simplemente no incluye los manifiestos en la fusión, lo único que hace se fusiona desde los módulos de manifiesto son los permisos, por ejemplo, si agrego un nuevo permiso a un ¡Los módulos manifiestan que lo unirían SOLAMENTE y no el resto de los elementos!

    No hay nada que combinar

    Te garantizo que hay un montón de cosas para fusionar!

    — Actualización 2 —

    Parece que todo lo que está fuera de la etiqueta de aplicación se fusiona en el manifiesto principal, y todo dentro de la etiqueta de la aplicación, no lo hace.

    — Actualización 3 —

    Módulo que no se fusiona:

    Gradle:

    apply plugin: 'com.android.library' android { compileSdkVersion 23 buildToolsVersion '25.0.0' defaultConfig { minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { jniDebuggable true } } } dependencies { compile project(path: ':android-infra') compile 'com.google.android.gms:play-services-gcm:9.0.0' compile project(path: ':engine-core-server') compile project(path: ':engine-core-aneeda') } 

    Manifiesto:

     <manifest package="com.sensiya.voip.managers.gcm" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="com.google.android.c2dm.permission.KAKI"/> <application tools:node="replace"> <service android:enabled="true" android:name="com.sensiya.voip.managers.gcm.GcmIntentService"/> <receiver android:name="com.sensiya.voip.managers.gcm.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <category android:name="com.iamplus.onenumber.device"/> </intent-filter> </receiver> </application> </manifest> 

    Módulo que se fusionará:

    Gradle:

     apply plugin: 'com.android.library' android { compileSdkVersion 23 buildToolsVersion '25.0.0' defaultConfig { minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { jniDebuggable true } } } dependencies { compile project(path: ':android-infra') compile 'com.sensiya:sense-services-client:1.24.2@aar' compile project(path: ':engine-core-server') compile project(path: ':engine-core-aneeda') } 

    Manifiesto:

     <manifest package="com.iamplus.android.senseServices" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application tools:node="replace"> <service android:name="com.iamplus.senseServices.ContextualEventService" android:enabled="true"/> <service android:name="com.iamplus.senseServices.Serv" android:enabled="true"/> <service android:name="com.iamplus.senseServices.Serv1" android:enabled="true"/> </application> </manifest> 

    ¿Alguna sugerencia?

  • ¿Qué sucede si la minSdkVersion es menor que la targetSdkVersion?
  • ¿Por qué Gradle crea mi módulo en el modo Release cuando la aplicación está en Debug
  • ¿Cómo puedo admitir mi aplicación Android para varias tiendas de Android?
  • Diseño de aplicaciones de Android para tablets
  • No se pudo encontrar el método android () para los argumentos al crear un proyecto de Android desde gradle
  • Error después de agregar biblioteca de juegos de servicios: ': app: transformClassesWithJarMergingForDebug'
  • 5 Solutions collect form web for “La compilación de Android no fusionará los manifiestos de las bibliotecas”

    Podría ser muchas cosas. Como usted no proporcionó código, supongo que está usando el comportamiento de combinación predeterminado. Para obtener más información, consulte: Combinar conflictos heurísticos

    Puede utilizar la vista Manifiesto fusionado para obtener una vista previa de los resultados de su manifiesto combinado y encontrar errores de conflicto.

    En general, la combinación por defecto debería funcionar. A continuación, utilice la vista Manifiesto fusionado para ver cómo y dónde ha perdido valores durante la fusión. El uso de marcadores de reglas de mezcla le ayudaría a administrar la fusión mediante la asignación de marcadores de reglas.

    Si no hay ninguna fusión en absoluto. Por lo que es probablemente un problema de dependencia entre los módulos.

    Tenga en cuenta que el orden de dependencia juega un papel crucial con los módulos que tienen el mismo nivel de prioridad, como las bibliotecas.

    — Actualizar 5.April.2017 —

    Estos son algunos consejos útiles:

    1. Intenta actualizar y reconstruir otras libs tanto como puedas.
    2. Elimine todas las dependencias y, a continuación, limpie el proyecto y, a continuación, vuelva a agregarlos. Y compruebe si los importa correctamente. Que se podría hacer por construir el proyecto sin problemas.
    3. Tenga en cuenta que dado que los recursos de gradle 2.2.0 de los módulos no serán accesibles en la aplicación.
    4. Comprueba tu manifiesto si el proceso de combinación no está desactivado explícitamente por el atributo: tools:node=”remove" o tools:node="removeAll" o en gradle (consulta Disable Manifest Merger en Android Gradle Build )
    5. Intente crear una demostración con un módulo y una fusión de pistas. Y luego hacer coincidir las salidas con sus proyectos. Esto dejará claro que no es problema de configuración, pero Android Studio 2.3 (para luego reinstalar la versión fresca)

    — Actualizar (2) 5.April.2017 —

    Después de haber agregado el código, pude ver que está utilizando Atributo

     tools:node="replace" 

    Bajo el elemento de la aplicación en tus módulos (y probablemente también en el manifiesto de la aplicación). Creo que esa es la razón por la que no obtuvo ningún manifiesto fusionado de módulos importados fusionados con el manifiesto de su aplicación. Consulte las tools:node="replace" bajo Node markers .

    Reemplace completamente el elemento de prioridad inferior. Es decir, si hay un elemento coincidente en el manifiesto de menor prioridad, ignórelo y utilice este elemento exactamente como aparece en este manifiesto.

    Eso significa que ambos módulos anteriores nunca obtendrán ninguna cosa fusionada con manifiestos desde:

    • Androide infra
    • Com.sensiya: sense-services-client: 1.24.2
    • Motor-núcleo-servidor
    • Motor-núcleo-aneeda

    Así que deshacerse de ese atributo y limpiar y reconstruir los módulos. Reconstruir todo el proyecto.

    Si obtiene conflictos de combinación de manifiesto tiene dos opciones.

    1) encuentre todos los archivos de manifiesto incluidos en su proyecto incluyendo los de las bibliotecas que tenga como dependencias y asegúrese de que no haya configuraciones conflictivas.

    O 2) añadir algunas reglas de resolución de mezcla a sus Manifests para dictar cómo cada conflicto debe resolverse.

    Hay una gran página en que aquí con muchos detalles.
    https://developer.android.com/studio/build/manifest-merge.html

    Desde Android Studio

    Construir —> Limpiar el proyecto
    entonces
    Construir -> Hacer Proyecto
    Esto debería ayudar a

    Tuve un problema similar para Unity. Yo era capaz de resolverlo por ir en el SDK Manager y la eliminación de la última api de Android. Entonces instalé un api ligeramente más viejo y funcionó (API 21 o 22 pienso)

    Lo que el SDK Manager parece

    Hace poco tengo el mismo problema en mi código de producción. Tener una bibliotecas en el módulo de la aplicación existe también en otras dependencias de Gradle hace que las entradas duplicadas. Necesitamos excluir dicho módulo o bibliotecas de uno en conflicto.

    Para eso debemos saber el número de bibliotecas usadas por una dependencia particular de Gadle.

    Considere un caso en el que utilizo "bolts-android-1.2.0.jar" en mi gradle de aplicación. En el mismo gradle estoy usando facebookSDK como abajo.

     compile('com.facebook.android:facebook-android-sdk:4.5.0') 

    Así que tengo que excluir "pernos-android" como a continuación

     compile('com.facebook.android:facebook-android-sdk:4.5.0') { exclude module: 'bolts-android' } 

    Entonces, ¿cómo saber que facebookSDK utiliza "bolts-android"

    Aquí puedes usar el plugin Android Method Count

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.