Ejecutando "cordova build android" - no se puede encontrar el atributo android: fontVariationSettings y android: ttcIndex

103

Cuando ejecuto cordova build android --buildConfig xxxx --release, aparece el siguiente error:

ERROR: In <declare-styleable> FontFamilyFont, unable to find attribute android:fontVariationSettings
ERROR: In <declare-styleable> FontFamilyFont, unable to find attribute android:ttcIndex

Lo extraño es que utilizo dos máquinas macOS para la compilación y obtengo este error solo en una de ellas para el mismo código.

Aquí está la salida de ./gradlew cdvPrintPropsI get en las dos máquinas:

:cdvPrintProps
cdvCompileSdkVersion=26
cdvBuildToolsVersion=27.0.3
cdvVersionCode=null
cdvMinSdkVersion=21
cdvBuildMultipleApks=true
cdvReleaseSigningPropertiesFile=release-signing.properties
cdvDebugSigningPropertiesFile=null
cdvBuildArch=null
computedVersionCode=152045989
computedArmv7VersionCode=1520459892
computedX86VersionCode=1520459894

A continuación se muestra la lista de complementos utilizados:

$ cordova plugins list
cordova-custom-config 5.0.2 "cordova-custom-config"
cordova-fabric-plugin 1.1.10 "cordova-fabric-plugin"
cordova-open-native-settings 1.5.0 "Native settings"
cordova-plugin-app-event 1.2.1 "Application Events"
cordova-plugin-app-version 0.1.9 "AppVersion"
cordova-plugin-camera 2.4.1 "Camera"
cordova-plugin-compat 1.2.0 "Compat"
cordova-plugin-console 1.1.0 "Console"
cordova-plugin-crosswalk-webview 2.4.0 "Crosswalk WebView Engine"
cordova-plugin-datepicker 0.9.2 "DatePicker"
cordova-plugin-device 2.0.1 "Device"
cordova-plugin-email 1.2.7 "EmailComposer"
cordova-plugin-file 4.3.3 "File"
cordova-plugin-file-transfer 1.6.3 "File Transfer"
cordova-plugin-inappbrowser 1.7.2 "InAppBrowser"
cordova-plugin-network-information 1.3.4 "Network Information"
cordova-plugin-secure-storage 2.6.8 "SecureStorage"
cordova-plugin-splashscreen 4.1.0 "Splashscreen"
cordova-plugin-statusbar 2.4.1 "StatusBar"
cordova-plugin-whitelist 1.3.3 "Whitelist"
cordova.plugins.diagnostic 3.9.2 "Diagnostic"
de.appplant.cordova.plugin.local-notification 0.8.5 "LocalNotification"
ionic-plugin-keyboard 2.2.1 "Keyboard"

¿Como puedo solucionar este problema?

Stéphane Padovani
fuente
Este problema también me ha estado sucediendo todo el día. Lo he reducido a un complemento que uso. Sin embargo, necesito este complemento para mis aplicaciones. ¿Qué complementos estás usando?
Chris R
@ChrisRitten Hola, he completado la publicación anterior con la lista de complementos. Saludos.
Stéphane Padovani
1
ninguna de las respuestas ayuda, luchando con esto por un día.
khusrav
Si esto puede ayudar a freakyjolly.com/…
Code Spy

Respuestas:

106

Simplemente ponga lo siguiente en build-extras.gradle

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:27.1.0'
    }
}
Helmson Helmson
fuente
¡Gracias! Este es un enfoque razonable para que Cordova ancle a una versión.
Hozuki
10
Mantengo mi carpeta de plataformas fuera del control de fuente, así que para lograr esto, creé build-extras.gradleen la raíz de mi proyecto un código agregado para copiarlo en hooks\after_platform_add gist.github.com/charlesbedrosian/…
cbedrosian
8
no tengo ese archivo: "build-extras.gradle"
Joe Sleiman
3
Para otros usuarios de phonegap-build. La respuesta es cordova-android-support-gradle-release forums.adobe.com/thread/2462835
catu
7
Además del comentario de @ StéphanePadovani, tenga en cuenta que debe crearse en la carpeta / plataformas / android / app de Cordova Android 7.0.0
Will Kru
83

Google lanzó la nueva versión 28.0.0-alpha1 de com.android.support:support-v4 que está agregando 2 nuevos atributos (android: fontVariationSettings y android: ttcIndex). Algunos de los complementos utilizan las últimas bibliotecas compatibles con Android, lo que genera incompatibilidades no deseadas.

Opción 1: Instale el complemento cordova-android-support-gradle-release .

Complemento bien documentado que "alinea varias versiones de las bibliotecas de soporte de Android especificadas por otros complementos a una versión específica". Probado sin ningún comportamiento destructivo.

cordova plugin add cordova-android-support-gradle-release --fetch

Lea la documentación para obtener un conjunto completo de opciones: Léame

Opción 2 : agregue el siguiente fragmento de código en build.gradle en plataformas / android

/** 
IMPORTANT - Manually added
Problem: 8 March 2018 - Google released version support-v4:28.0.0-alpha1 
which breaks the project with following error: unable to find attribute 
android:fontVariationSettings and android:ttcIndex

Effect: Force a specific version of the library
*/

configurations.all {
    resolutionStrategy.force 'com.android.support:support-v4:27.1.0'
}

Advertencia: el código en build.gradle se sobrescribirá si quita / agrega la plataforma Android. Si no desea usar el complemento por alguna razón o de alguna manera no funciona para usted, cree un enlace y sobrescriba el archivo cada vez. Consulte el segundo comentario aquí .

Si el problema persiste, puede intentar:

cordova platform rm android
cordova platform add android

O

Asegúrate de no tener una versión anterior de la aplicación instalada en el dispositivo que estás probando porque recibirás un error ambiguo cuando intente degradar la versión existente: "INSTALL_FAILED_VERSION_DOWNGRADE" y "UnhandledPromiseRejectionWarning: Rechazo de promesa no controlada"

Andrew Radulescu
fuente
2
La mejor respuesta. La instalación del complemento es la mejor y más fácil solución para esto. Automágicamente resuelve el error una vez que se agrega el complemento. Sencillo. No es necesario jugar creando archivos en la carpeta de la plataforma que deben rastrearse manualmente en caso de eliminar y agregar plataformas.
Neel
La opción 1 funcionó para mí. Es extremadamente frustrante que Cordova defina sus dependencias de una manera no estricta. No sé por qué lo hacen. Dejé mi proyecto en un estado de trabajo hace semanas, regrese a él para recompilar una versión de depuración y de repente ocurren errores.
Norman Breau
Error al recuperar el complemento cordova-android-support-gradle-release a través del registro
netshark1000
@ netshark1000 Este problema no está relacionado con el complemento, sino con su package.json o alguna configuración del proyecto. Eche un vistazo al package.json y asegúrese de que el complemento no esté instalado. Si existe, simplemente llame a ionic cordova y prepárese para recargarlo. Si el problema persiste, elimine las plataformas, la carpeta de complementos y vuelva a agregar las plataformas. Esto debería funcionar.
Andrew Radulescu
1
Perfecto, el # 1 me salvó
GBarroso
31

Me está sucediendo el mismo error. Aparentemente, com.android.support:support-v4se lanzó una nueva versión de la biblioteca y el complemento que estoy usando se define com.android.support:support-v4:+como dependencia en plugin.xml. El +letrero significa que obtendrá la última versión (28.0.0), que parece ser incompatible con otros complementos.

Pude construir una versión de desarrollo cambiando todas las dependencias de complementos de com.android.support:support-v4:+a com.android.support:support-v4:27.1.0. Además, ejecuté ionic cordova platform remove androidy ionic cordova platform add android. Espero que ayude, al menos para el desarrollo.

avmatte
fuente
Muchas gracias. Por mi parte, cambié una cosa en los archivos gradle del complemento dentro del directorio de la plataforma Android. Verifique si no funciona con la solución @avmatte.
Sandun Priyanka
no funciona para mí, hago lo mismo, pero cuando vuelvo a agregar la plataforma Android, la versión vuelve a v4: 24.1.1+ incluso cuando la eliminé a 27.1.0
Joe Sleiman
Tengo este error: No se pudo encontrar com.android.support:support-v4:27.1.0.
Joe Sleiman
28

Acabo de solucionar este problema yendo a la carpeta de plataforma / android y edité el project.propertiesarchivo) y lo reemplacé com.android.support:support-v4:+con com.android.support:support-v4:27.1.0.

Ahmed
fuente
21

Si realmente solo necesita una solución rápida a ese problema para ejecutar su compilación, puede intentar agregar las siguientes líneas en su archivo de plataformas / android / build.gradle:

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:27.1.0'
    }
}

De todos modos, configurar la versión aquí no es una solución sostenible.

Stu
fuente
Buena esa. esto lo hizo por mí, pero sí, supongo que se perderá si elimino y agrego la plataforma o la instalo en una nueva máquina.
Rubio
Tuve que poner esto en / platform / android / app; como dices, no es sostenible
user542319
@stu, no ha dicho en su respuesta, ¿dónde debería poner este código en la parte inferior?
Sayed Mohd Ali
15

Es extraño, pero funciona cuando agrego las siguientes líneas con las mismas versiones.

Estas son mis líneas relacionadas en el platforms/android/build.gradlearchivo:

dependencies {
  compile fileTree(dir: 'libs', include: '*.jar')
  // SUB-PROJECT DEPENDENCIES START
  debugCompile(project(path: "CordovaLib", configuration: "debug"))
  releaseCompile(project(path: "CordovaLib", configuration: "release"))
  compile "com.android.support:support-v4:26.+"
  compile "com.android.support:appcompat-v7:26.+"
  // SUB-PROJECT DEPENDENCIES END
}

// ADDED THESE LINES
configurations.all {
  resolutionStrategy.force 'com.android.support:support-v4:26+'
}

En mi proyecto, el problema se produjo debido al complemento 'cordova-plugin-crosswalk-webview'.

Muhammed Tanrıverdi
fuente
Gracias, esto realmente ayudó a volver a descargar las dependencias que anteriormente fueron sobrescritas por la actualización. Aunque no se recomienda editar su build.gradle, probé soluciones anteriores en vano
Nico
8

Tengo el mismo error pero no en cordova build. Una nueva versión de las com.android.support:appcompat-v7dependencias y. Pero la versión incompatible está en el tercer paquete que depende de com.android.support:appcompat-v7. Así que no puedo arreglar el tercer paquete con la solución de @avmatte .

Utilice la solución de @ Sai Teja para encontrar un paquete incompatible:

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

Luego lo arregló con:

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-compat:{the_same_version}'
        force 'com.android.support:appcompat-v7:{the_same_version}'
        force 'com.android.support:support-core-utils:{the_same_version}'
        force 'com.android.support:support-core-ui:{the_same_version}'
        force 'com.android.support:support-fragment:{the_same_version}'
        force 'com.android.support:support-annotations:{the_same_version}'
        ...
    }
}

El código anterior fuerza la versión de dependencias.

hazlo
fuente
8

Estaba enfrentando el mismo error. Hice una investigación completa en el directorio de complementos para com.android.support:support-v4:+ y lo reemplazó con un código de versión estático.

Para mí, com.android.support:support-v4:23.4.0 funcionó bien. No hubo necesidad de eliminar y volver a agregar la plataforma Android en ese momento.

cpro90
fuente
8

Aquí hay una manera fácil de solucionarlo que persistirá cuando se reconstruya el directorio de la plataforma y no hay necesidad de revisar todos sus complementos para tratar de encontrar un culpable. Crea un archivo build-extras.gradlecon estos contenidos:

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:27.1.0'
    }
}

Luego crea el archivo after_platform_add/010_copy_build_extras.jscon el siguiente contenido:

#!/usr/bin/env node

var fs = require('fs');

var rootdir = process.argv[2];
var android_dir = `${rootdir}/platforms/android`;
var gradle_filename = 'build-extras.gradle';
var gradle_file = `${rootdir}/${gradle_filename}`;
if (fs.existsSync(android_dir) && fs.existsSync(gradle_file)) {
  fs.createReadStream(gradle_file)
    .pipe(fs.createWriteStream(`${android_dir}/${gradle_filename}`));
}

Ahora vuelva a crear la plataforma de Android y usará la biblioteca de soporte anclada.

Brad Pitcher
fuente
los ganchos de directorio secundario están en desuso uso config.xml<platform name="android"> <hook src="hooks/copy_build_extras.js" type="before_build" /> </platform>
Exlord
ok probado y su código parece no ser válido process.argv[2]es buildpara mí!
Exlord
Lo siento @Exlord. Supongo que necesitará algunos ajustes para funcionar con el nuevo estilo de gancho, pero estoy usando este código exacto con un gancho de subdirectorio actualmente y está funcionando muy bien.
Brad Pitcher
8

Encontré la solución en Ionic Forum, que fue la única solución que funcionó para mí:

Correr:

plataforma iónica cordova rm android

Correr:

plataforma ionic cordova agregar [email protected]

Correr:

complemento iónico cordova agregar cordova-plugin-androidx

Correr:

complemento iónico cordova agregar cordova-plugin-androidx-adapter

Asegúrese de que su gradle.properties tenga:

cdvMinSdkVersion = 19

Asegúrese de que su build.gradle tenga:

project.ext { defaultBuildToolsVersion="28.0.3" //String 

defaultMinSdkVersion=19 //Integer - Minimum requirement is Android 4.4 

defaultTargetSdkVersion=28 //Integer - We ALWAYS target the latest by default 

defaultCompileSdkVersion=28 //Integer - We ALWAYS compile with the latest by default }

Asegúrese de que su config.xml tenga:

<preference name="android-minSdkVersion" value="19" />

de: https://forum.ionicframework.com/t/firebase-app-unable-to-compile-on-android-with-aapt-error/166564/7

que también se maneja en la respuesta de stackoverflow: https://stackoverflow.com/a/56656680/839691

alpere
fuente
Esta es la única solución que funciona en mi Ionic 3aplicación anterior. ¡Gracias!
Sampath
usando ionic 3: Esto me ayudó a resolver este problema, pero ahora tengo otro problema * Qué salió mal: Error de ejecución para la tarea ': app: compileDebugJavaWithJavac'. > La compilación falló; consulte la salida de error del compilador para obtener más detalles.
Prem Sanil
1
@PremSanil No estoy seguro de que esto esté causando su problema, pero asegúrese de haber descargado las herramientas de compilación 28.0.3 en el SDK Manager de Android Studio.
alpere
@alpere Tuve que actualizar la versión de Node a v10.17.0 y los complementos eliminados sin usar comenzaron a funcionar (usando el tema azul de Ionic 3)
Prem Sanil
5

Algunas de sus bibliotecas deberían usar

com.android.support:support-v4:+

Encuentra cuál es, con

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

Y agregue esa biblioteca como un módulo si no está usando una versión específica en su última actualización (¡También plantee un problema en esa biblioteca!;))

¡Gracias a @avmatte!

EDITAR: también puede solicitar que gradle forzar la versión de la biblioteca

ext {
    supportVersion {latest_version_here}
} // In root project.gradle

configurations.all {
    resolutionStrategy {
        force "com.android.support:support-v4:$supportVersion"
    }
}
Teja Konjeti
fuente
4

Ayer tuve el mismo problema de la nada. Comenzó al azar, pero a partir de la lectura, parece que tiene que ver con una actualización como se mencionó anteriormente por @ cpro90. Sin embargo, lo intenté y no pude encontrar dónde realizar el cambio manual necesario.

Finalmente, identifiqué que el problema estaba siendo causado por mi complemento cordova-plugin-crosswalk-webview. En GitHub, encontré el problema en la reproducción del complemento esta mañana, y tenía más de 520 vistas para el almuerzo.

@UNUMObile sugirió lo siguiente en el build.gradlearchivo para forzar una versión anterior a nivel mundial:

configurations.all {
    resolutionStrategy.force 'com.android.support:support-v4:24.0.0'
}

Esto funcionó de inmediato para mí y puede ayudar a otros con otros complementos que también han dependido de 'com.android.support:support-4:<28. La nueva versión 28 parece ser el problema.

Espero que esto ayude a alguien a seguir adelante.

Chris Scutt
fuente
4

Solo algunos consejos para el desarrollador de Kotlin:

Si sigue estas respuestas aquí, está seguro de que no tiene una support-v4biblioteca en su proyecto pero sigue viendo este error, por favor, eche un vistazo a la ktxbiblioteca.

Me acabo de dar cuenta de que estoy usando la última 1.0.0-alpha1versión de la biblioteca ktx y aparece este error; después de cambiar de nuevo a la versión 0.3, todo volvió a la normalidad ahora.

Anthonyeef
fuente
No se pudo resolver: androidx.fragment: fragment-ktx: 0.3, cuando cambio a '1.0.0-alpha1' ocurre el mismo problema.
Mahmood Ali
@MahmoodAli echa un vistazo a las otras dependencias? Solo estoy publicando mi situación, y es posible que Google también tenga el otro paquete haciendo lo mismo mal.
Anthonyeef
@MahmoodAli gracias por el enlace, pero creo que la mayor parte del proyecto comienza a usar ktx lib antes de que se anuncie androidx en Google IO de este año. Es difícil evitar mezclar ktx con la biblioteca de soporte ... tal vez la migración a androidx debería ser la solución final para este tipo de excepción.
Anthonyeef
4

Agregue las siguientes líneas a sus plataformas / android / build.gradle

  configurations.all {
        resolutionStrategy {
            force 'com.android.support:support-v4:27.1.0'
        }
    }

Si aún tiene problemas, intente ejecutar este comando:

cordova plugin add cordova-android-support-gradle-release --fetch
karan bhatia
fuente
3

En su build.gradlearchivo agregue

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:27.1.0'
    }
}

Y en su project.propertiesarchivo cambie cordova.system.library.3a cordova.system.library.3=com.android.support:support-v13:27.+.

un hombre
fuente
2

Para los usuarios de Phonegap Build , como @catu mencionó en un comentario, pueden probar este complemento cuyo propósito es evitar fallas de compilación causadas por la inclusión de diferentes versiones de las bibliotecas de soporte .

usuario276648
fuente
1

Simplemente solucione este problema colocando las siguientes líneas de código en el archivo platform / android / app / build.gradle, justo después del bloque buildscript {}:

configurations.all {
    resolutionStrategy {
            force 'com.android.support:support-v4:27.1.0'
    }
}
Kush
fuente
1

Tuve el mismo problema después de instalar el complemento cordova-plugin-file-opener2. Se resolvió después de hacer: Opción 1: Instalar el complemento cordova-android-support-gradle-release. complemento cordova agregar cordova-android-support-gradle-release --fetch

DineshS
fuente
0

Otro enfoque con la misma solución es crear un gancho. Es persistente (después de la reinstalación de la plataforma), puede confirmarlo y no requiere volver a agregar la plataforma.

% proyecto% \ scripts \ android \ android-support-version.js

#!/usr/bin/env node

var fs = require('fs');

function replace_strings_in_file(filename, replacementsObject) {
  if (fs.existsSync(filename)) {
    var data = fs.readFileSync(filename, 'utf8');
    Object.keys(replacementsObject).forEach(function (to_replace) {
      var replace_with = replacementsObject[to_replace];
      data = data.replace(to_replace, replace_with);
    });
    console.log(data);
    fs.writeFileSync(filename, data, 'utf8');
  } else {
    console.log('file not found');
  }
}

module.exports = function (context) {
  var rootdir = process.argv[2];
  if (rootdir) {
    replace_strings_in_file("platforms/android/project.properties", {'com.android.support:support-v4:+': 'com.android.support:support-v4:27.1.0'});
    console.log('com.android.support version fix');
  }
};

Gancho de inicio en la configuración

% proyecto% \ config.xml

...
<platform name="android">
  <hook src="scripts/android/android-support-version.js" type="before_build" />
  ...

Instale la dependencia de fs en su proyecto:

npm i fs --save-dev

Ejecutar compilación:

cordova construir android

pavimento
fuente
0

¡ FORMA SÚPER SIMPLE Y CORRECTA DE RESOLVERLO!

Simplemente actualice el sdk y agregue la última versión 2 de Android ... ¡y reinicie la computadora! Hecho...

Ahora tenemos tiempo para hablar de coches y deportes ...

Ari Waisberg
fuente
0

Tuve el mismo problema y ninguna de las soluciones dadas me funcionó. La instalación de la última versión de Android SDK Build-tools (27.0.3) resolvió mi problema.

Daniel W.
fuente
0

Enlace de solución

Esto se debe al complemento de compatibilidad. Elimine ese complemento si tiene una versión anterior (menos de 1.2.0 ) y configure [email protected]

cordova plugin rm cordova-plugin-compat --force

complemento de cordova agregar [email protected]

plataforma cordova rm android

plataforma ionic cordova agregar [email protected]

Trabajando en mi caso. Gracias :)

Pranay Kumar
fuente
0

actualizaciones a la respuesta de @Brad Pitcher:

hooks/copy_build_extras.js

#!/usr/bin/env node

var fs = require('fs');

module.exports = function (context) {
  var rootdir         = context.opts.projectRoot;
  var android_dir     = `${rootdir}/platforms/android`;
  var gradle_filename = 'build-extras.gradle';
  var gradle_file     = `${rootdir}/${gradle_filename}`;
  if (fs.existsSync(android_dir) && fs.existsSync(gradle_file)) {
    fs.createReadStream(gradle_file)
      .pipe(fs.createWriteStream(`${android_dir}/${gradle_filename}`));
  }
};

config.xml

<platform name="android">
    <allow-intent href="market:*" />
    <hook src="hooks/copy_build_extras.js" type="before_build" />
</platform>

build-extras.gradle en el directorio raíz

configurations.all {
  resolutionStrategy {
    force 'com.android.support:support-v4:27.1.0'
  }
}
Exlord
fuente
0

Me estaba encontrando con este problema con react native y fue causado por las siguientes líneas en mi android/app/build.gradle:

implementation ("com.google.android.gms:play-services-base:+") {
  force = true;
}
implementation ("com.google.android.gms:play-services-maps:+") {
  force = true;
}

etc ...

Aparentemente, esto se resolvió con una nueva versión 17.0.0 que rompió mi compilación.
Cambiar el + a 16.0.0 (o 16.0.1 para play-services-base) resolvió mi problema

Uri Klar
fuente
0

Este problema me había estado matando durante una semana.

Al final terminé en [email protected]

Yo alteré android/project.propertiescambiando

#cordova.system.library.3=com.google.android.gms:play-services-analytics:+
cordova.system.library.3=com.google.android.gms:play-services-analytics:15+

Ese cambio finalmente me sacó del pozo de la oscuridad del mensaje de error ttcIndex.

Entonces recibí este error

com.android.builder.dexing.DexArchiveBuilderException: 
  com.android.builder.dexing.DexArchiveBuilderException

El error aparentemente se debió a un problema con la versión de Java. Luego alteré android/build.gradlecon el siguiente cambio

compileOptions {
  #sourceCompatibility JavaVersion.VERSION_1_6
  #targetCompatibility JavaVersion.VERSION_1_6
  sourceCompatibility JavaVersion.VERSION_1_8
  targetCompatibility JavaVersion.VERSION_1_8
}

También tenga en cuenta que tengo el cordova-android-support-gradle-releasecomplemento instalado, pero no tengo idea de si lo necesito.

Austin Hutchison
fuente
-1

Es una entrada duplicada en values.xml en una carpeta llamada support-compat-28.0.0-alpha1.aar.

Encontrará este archivo en Windows en \users\YOURUSERID\.gradle\caches\transforms-1\files-1.1

Una vez dentro de esa carpeta, debe profundizar algunos niveles en values.xml .

En ese archivo, busque un elemento <declare-styleable name="FontFamilyFont>.

En ese elemento, elimine las CUATRO líneas que contiene android:.

Después de realizar ese cambio, puedo volver a compilar sin errores.

Henk Kelder
fuente