Exécution de «cordova build android» - impossible de trouver l'attribut android: fontVariationSettings et android: ttcIndex


103

Lorsque je cours cordova build android --buildConfig xxxx --release, j'obtiens l'erreur suivante:

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

La chose étrange est que j'utilise deux machines macOS pour la compilation, et je reçois cette erreur uniquement sur l'une d'entre elles pour le même code.

Voici la sortie de ./gradlew cdvPrintPropsI get sur les deux machines:

: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

Voici la liste des plugins utilisés:

$ 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"

Comment puis-je résoudre ce problème?


Ce problème m'est arrivé toute la journée également. Je l'ai réduit à un plugin que j'utilise. Cependant, j'ai besoin de ce plugin pour mes applications. Quel plugin utilisez-vous?
Chris R

@ChrisRitten Salut, j'ai complété le post ci-dessus avec la liste des plugins. Cordialement.
Stéphane Padovani

1
aucune des réponses n'aide, luttant avec cela depuis un jour maintenant.
khusrav

Si cela peut aider freakyjolly.com
Code Spy

Réponses:


106

Il suffit de mettre ce qui suit dans build-extras.gradle

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

Merci! C'est une approche raisonnable pour Cordova d'épingler une version.
Hozuki

10
Je garde mon dossier de plates-formes hors du contrôle de code source afin d'accomplir cela, j'ai créé build-extras.gradledans mon projet du code ajouté à la racine pour le copier dans hooks\after_platform_add gist.github.com/charlesbedrosian
...

8
je n'ai pas un tel fichier: "build-extras.gradle"
Joe Sleiman

3
Pour les autres utilisateurs de phonegap-build. La réponse est cordova-android-support-gradle-release forums.adobe.com/thread/2462835
catu

7
En plus du commentaire de @ StéphanePadovani, notez qu'il doit être créé dans le dossier / plates-formes / android / app de Cordova Android 7.0.0
Will Kru

83

Google a publié la nouvelle version 28.0.0-alpha1 de com.android.support:support-v4 qui ajoute 2 nouveaux attributs (android: fontVariationSettings et android: ttcIndex). Certains plugins utilisent les dernières bibliothèques compatibles avec Android, ce qui entraîne des incompatibilités indésirables.

Option 1: Installez le plugin cordova-android-support-gradle-release .

Plugin bien documenté qui "aligne diverses versions des bibliothèques de support Android spécifiées par d'autres plugins sur une version spécifique". Testé sans aucun comportement destructeur.

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

Lisez la documentation pour un ensemble complet d'options: Lisez - moi

Option 2 : Ajouter l'extrait de code suivant dans build.gradle sous plates-formes / 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'
}

Attention: le code dans build.gradle sera écrasé si vous supprimez / ajoutez la plateforme Android. Si vous ne souhaitez pas utiliser le plugin pour une raison quelconque ou si cela ne fonctionne pas pour vous, créez plutôt un hook et écrasez le fichier à chaque fois. Vérifiez le deuxième commentaire ici .

Si le problème persiste, vous pouvez essayer:

cordova platform rm android
cordova platform add android

OU

Assurez-vous qu'aucune version précédente de l'application n'est installée sur l'appareil que vous testez, car vous recevrez une erreur ambiguë lors de la tentative de rétrogradation de la version existante: "INSTALL_FAILED_VERSION_DOWNGRADE" et "UnhandledPromiseRejectionWarning: Unhandled PromiseRejectionWarning: Unhandled Promise Rejet"


2
Meilleure réponse. L'installation du plugin est la meilleure et simple solution à cela. Il résout automatiquement l'erreur une fois le plugin ajouté. Facile. Pas besoin de jouer autour de la création de fichiers dans le dossier de la plate-forme qui doit être suivi manuellement en cas de suppression et d'ajout de plates-formes.
Neel

L'option 1 a fonctionné pour moi. Il est extrêmement frustrant que Cordova définisse leurs dépendances de manière non stricte. Je ne sais pas pourquoi ils le font. J'ai laissé mon projet en état de fonctionnement il y a des semaines, revenez-y pour recompiler une version de débogage et soudainement des erreurs se produisent.
Norman Breau

Échec de la récupération du plugin cordova-android-support-gradle-release via le registre
netshark1000

@ netshark1000 Ce problème n'est pas lié au plugin mais à votre package.json ou à une configuration de projet. Jetez un œil au package.json et assurez-vous que le plugin n'est pas déjà installé. S'il existe, appelez simplement ionic cordova et préparez-vous à le recharger. Si le problème persiste, supprimez les plates-formes, le dossier plugins et ajoutez à nouveau les plates-formes. Cela devrait faire l'affaire.
Andrew Radulescu

1
Parfait, # 1 m'a sauvé
GBarroso

31

La même erreur m'arrive. Apparemment, une nouvelle version de la com.android.support:support-v4bibliothèque a été publiée et le plugin que j'utilise définit com.android.support:support-v4:+comme dépendance dans plugin.xml. Le +signe signifie qu'il obtiendra la dernière version (28.0.0), qui semble être incompatible avec d'autres plugins.

J'ai pu créer une version de développement en changeant toutes les dépendances du plugin de com.android.support:support-v4:+à com.android.support:support-v4:27.1.0. Aussi, j'ai exécuté ionic cordova platform remove androidet ionic cordova platform add android. J'espère que cela aide, au moins pour le développement.


Merci beaucoup, De mon côté, j'ai changé une chose les fichiers gradle du plugin dans le répertoire de la plate-forme Android. veuillez vérifier si cela ne fonctionne pas avec la solution @avmatte.
Sandun Priyanka

ne fonctionne pas pour moi, je fais la même chose mais lorsque je rajoute la plate-forme Android, la version revient à la v4: 24.1.1+ même lorsque je l'ai supprimée à 27.1.0
Joe Sleiman

J'ai cette erreur: Impossible de trouver com.android.support:support-v4:27.1.0.
Joe Sleiman

28

Je viens de résoudre ce problème en accédant au dossier platform / android et en éditant le project.propertiesfichier) et en le remplaçant com.android.support:support-v4:+par com.android.support:support-v4:27.1.0.


21

Si vous avez vraiment juste besoin d'une solution rapide à ce problème pour que votre build s'exécute, vous pouvez essayer d'ajouter les lignes suivantes dans votre fichier platform / android / build.gradle:

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

Quoi qu'il en soit, définir la version ici n'est pas une solution durable.


joli. cela l'a fait pour moi, mais oui, je suppose que cela sera perdu si je supprime et ajoute la plate-forme ou installe sur une nouvelle machine.
Gurnard

J'ai dû mettre cela dans / plates-formes / android / app; comme vous le dites, ce n'est pas durable
user542319

@stu vous n'avez pas dit dans votre réponse où dois-je mettre ce code en bas?
Sayed Mohd Ali le

15

C'est étrange, mais cela fonctionne lorsque j'ajoute les lignes ci-dessous avec les mêmes versions.

Voici mes lignes liées dans le platforms/android/build.gradlefichier:

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+'
}

Dans mon projet, le problème est survenu à cause du plugin 'cordova-plugin-crosswalk-webview'.


Merci, cela a vraiment aidé à re-télécharger les dépendances qui ont été précédemment écrasées par la mise à jour. Bien que l'édition de votre build.gradle soit déconseillée, j'ai essayé les solutions précédentes en vain
Nico

8

J'ai la même erreur mais pas dans la construction de cordova. Une nouvelle version des com.android.support:appcompat-v7dépendances et. Mais la version incompatible est dans le troisième paquet qui dépend de com.android.support:appcompat-v7. Donc je ne peux pas réparer le troisième paquet avec la solution de @avmatte .

Utilisez la solution de @ Sai Teja pour trouver un paquet incompatible:

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

Puis corrigé avec:

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}'
        ...
    }
}

Le code ci-dessus force la version des dépendances.


8

J'étais confronté à la même erreur. A fait une recherche complète dans le répertoire plugin pour com.android.support:support-v4:+ et l'a remplacé par un code de version statique.

Pour moi, com.android.support:support-v4:23.4.0 fonctionnait très bien. Il n'était alors pas nécessaire de supprimer et de rajouter la plate-forme Android.


8

Voici un moyen simple de résoudre ce problème qui persistera lorsque le répertoire de la plate-forme est reconstruit et il n'est pas nécessaire de parcourir tous vos plugins pour essayer de trouver un coupable. Créez un fichier build-extras.gradleavec ce contenu:

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

Créez ensuite le fichier after_platform_add/010_copy_build_extras.jsavec le contenu suivant:

#!/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}`));
}

Maintenant, recréez la plate-forme Android et elle utilisera la bibliothèque de support épinglée.


les hooks de sous-répertoire sont obsolètes, utilisez config.xml<platform name="android"> <hook src="hooks/copy_build_extras.js" type="before_build" /> </platform>
Exlord

ok testé et votre code semble invalide process.argv[2]est buildpour moi!
Exlord le

Désolé @Exlord, je suppose qu'il faudra quelques ajustements pour fonctionner avec le nouveau crochet de style, mais j'utilise ce code exact avec un crochet de sous-répertoire actuellement et cela fonctionne très bien.
Brad Pitcher

8

J'ai trouvé la solution sur Ionic Forum, qui était la seule solution qui a fonctionné pour moi:

Courir:

plateforme ionique cordova rm android

Courir:

plate-forme ionique cordova ajouter android@8.0.0

Courir:

plugin cordova ionique ajouter cordova-plugin-androidx

Courir:

plugin cordova ionique ajouter l'adaptateur cordova-plugin-androidx

Assurez-vous que votre gradle.properties a:

cdvMinSdkVersion = 19

Assurez-vous que votre build.gradle a:

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 }

Assurez-vous que votre config.xml contient:

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

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

qui est également traité dans la réponse stackoverflow: https://stackoverflow.com/a/56656680/839691


C'est la seule solution qui fonctionne sur mon ancienne Ionic 3application. Je vous remercie!
Sampath

en utilisant ionic 3: Cela m'a aidé à résoudre ce problème, mais j'ai obtenu un autre problème maintenant * Ce qui n'a pas fonctionné: l'exécution a échoué pour la tâche ': app: compileDebugJavaWithJavac'. > La compilation a échoué; voir la sortie d'erreur du compilateur pour plus de détails.
Prem Sanil

1
@PremSanil Vous n'êtes pas sûr que cela soit à l'origine de votre problème, mais assurez-vous d'avoir téléchargé les outils de construction 28.0.3 dans le gestionnaire de SDK d'Android Studio.
alpere

@alpere J'ai dû mettre à jour la version Node vers la v10.17.0 et la suppression des plugins inutilisés a commencé à fonctionner (Utilisation du thème bleu Ionic 3)
Prem Sanil

5

Certaines de vos bibliothèques devraient utiliser

com.android.support:support-v4:+

Trouvez celui qui est, avec

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

Et ajoutez cette bibliothèque en tant que module si elle n'utilise pas une version spécifique dans sa dernière mise à jour (soulevez également un problème dans cette bibliothèque!;))

Merci à @avmatte!

EDIT: Vous pouvez également demander gradle pour forcer la version de la bibliothèque

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

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

4

J'avais le même problème à l'improviste hier. Cela a commencé au hasard, mais à la lecture, il semble que cela soit lié à une mise à jour comme mentionné ci-dessus par @ cpro90. Cependant, j'ai essayé et je n'ai pas pu trouver où effectuer le changement manuel nécessaire.

Finalement, j'ai identifié que le problème était causé par mon plugin cordova-plugin-crosswalk-webview. Sur GitHub, j'ai trouvé le problème sur la repro du plugin ce matin, et il avait plus de 520 vues au déjeuner.

@UNUMObile a suggéré ce qui suit dans le build.gradlefichier pour forcer globalement une version antérieure:

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

Cela a fonctionné immédiatement pour moi et peut aider les autres avec d'autres plugins qui ont également eu leur dépendance à 'com.android.support:support-4:<28. La nouvelle version 28 semble être le problème.

J'espère que cela aidera quelqu'un à avancer.


4

Juste quelques conseils pour les développeurs Kotlin:

Si vous suivez ces réponses ici, vous êtes sûr de ne pas avoir de support-v4bibliothèque dans votre projet, mais vous voyez toujours cette erreur, veuillez jeter un œil à la ktxbibliothèque.

Je viens de comprendre que j'utilise la dernière 1.0.0-alpha1version de la bibliothèque ktx et cette erreur s'affiche; après avoir changé de version 0.3, tout est revenu à la normale maintenant.


Échec de la résolution: androidx.fragment: fragment-ktx: 0.3, lorsque je passe à «1.0.0-alpha1», le même problème se produit.
Mahmood Ali

@MahmoodAli jetez un œil aux autres dépendances? Je ne fais que publier ma situation et Google peut également demander à l'autre package de faire la même erreur.
Anthonyeef

@MahmoodAli merci pour le lien, mais je pense que la plupart des projets commencent à utiliser ktx lib avant que l'androidx ne soit annoncé dans Google IO de cette année. Il est difficile d'éviter de mélanger ktx avec la bibliothèque de support ... peut-être que la migration vers androidx devrait être la solution finale pour ce genre d'exception.
Anthonyeef

4

Ajoutez les lignes suivantes à vos plates-formes / android / build.gradle

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

si le problème persiste, essayez d'exécuter cette commande:

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

3

Dans votre build.gradlefichier, ajoutez

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

Et dans votre project.propertiesfichier changez cordova.system.library.3en cordova.system.library.3=com.android.support:support-v13:27.+.


2

Pour les utilisateurs de Phonegap Build , comme @catu l'a mentionné dans un commentaire, vous pouvez essayer ce plugin dont le but est d'éviter les échecs de construction causés par l'inclusion de différentes versions des bibliothèques de support .


1

Résolvez simplement ce problème en plaçant les lignes de code suivantes dans le fichier platform / android / app / build.gradle, juste après le bloc buildscript {}:

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

1

J'ai eu le même problème après l'installation du plugin cordova-plugin-file-opener2. Il a résolu après avoir fait: Option 1: Installez le plugin cordova-android-support-gradle-release. plugin cordova ajouter cordova-android-support-gradle-release --fetch


0

Une autre approche avec la même solution consiste à créer un crochet. Il est persistant (après la réinstallation de la plate-forme), vous pouvez le valider et cela ne nécessite pas de ré-ajouter la plate-forme.

% project% \ 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');
  }
};

Init hook dans la configuration

% projet% \ config.xml

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

Installez la dépendance fs dans votre projet:

npm i fs --save-dev

Exécuter la construction:

cordova construire android


0

SIMPLE ET SUPER CORRECT MANIÈRE DE RÉSOUDRE IT!

Mettez simplement à jour le sdk et ajoutez la dernière version 2 d'Android ... et redémarrez l'ordinateur! Terminé...

Maintenant, nous avons le temps de parler de voitures et de sports ...


0

J'ai eu le même problème et aucune des solutions proposées n'a fonctionné pour moi. L'installation de la dernière version d'Android SDK Build-tools (27.0.3) a résolu mon problème.


0

Lien de la solution

Cela est dû au plugin compat. Supprimez ce plugin si vous avez une version plus ancienne (inférieure à 1.2.0 ) et définissez cordova-android@6.3.0

plugin cordova rm cordova-plugin-compat --force

plugin cordova ajouter cordova-plugin-compat@1.2.0

cordova plateforme rm android

plate-forme ionique cordova ajouter android@6.3.0

Travailler à mon cas. Merci :)


0

met à jour la réponse 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 dans le répertoire racine

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

0

Je rencontrais ce problème avec react native et il était causé par les lignes suivantes dans mon 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...

Apparemment, cela + s'est résolu à une nouvelle version 17.0.0 qui a cassé ma version.
Changer le + en 16.0.0 (ou 16.0.1 pour play-services-base) a résolu mon problème


0

Ce problème me tue depuis une semaine.

Finalement j'ai fini sur android@6.4.0

J'ai changé android/project.propertiesen changeant

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

Ce changement m'a finalement sorti de la fosse des ténèbres du message d'erreur ttcIndex.

Alors j'ai eu cette erreur

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

L'erreur était apparemment due à un problème de version Java. J'ai ensuite changé android/build.gradleavec le changement suivant

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

Notez également que le cordova-android-support-gradle-releaseplugin est installé, mais je ne sais pas si j'en ai besoin.


-1

C'est une entrée en double dans values.xml dans un dossier appelé support-compat-28.0.0-alpha1.aar.

Vous trouverez ce fichier sous Windows à l'adresse \users\YOURUSERID\.gradle\caches\transforms-1\files-1.1

Une fois dans ce dossier, vous devez aller plus loin dans values.xml .

Dans ce fichier, recherchez un élément <declare-styleable name="FontFamilyFont>.

Dans cet élément, supprimez les QUATRE lignes avec android:dedans.

Après avoir effectué ce changement, je peux reconstruire sans erreur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.