Esecuzione di "cordova build android" - impossibile trovare l'attributo android: fontVariationSettings e android: ttcIndex


103

Quando corro cordova build android --buildConfig xxxx --release, ricevo il seguente errore:

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

La cosa strana è che uso due macchine macOS per la compilazione e ottengo questo errore solo su una di esse per lo stesso codice.

Ecco l'output di ./gradlew cdvPrintPropsottengo sulle due macchine:

: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

Di seguito è riportato l'elenco dei plugin utilizzati:

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

Come posso risolvere questo problema?


Questo problema è accaduto anche a me tutto il giorno. L'ho ristretto a un plugin che utilizzo. Tuttavia ho bisogno di questo plugin per le mie applicazioni. Che plugin stai usando?
Chris R

@ChrisRitten Ciao, ho completato il post sopra con l'elenco dei plugin. Saluti.
Stéphane Padovani

1
nessuna delle risposte aiuta, lottando con questo per un giorno ormai.
khusrav

Se questo può aiutare freakyjolly.com/…
Code Spy

Risposte:


106

Basta inserire quanto segue in build-extras.gradle

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

Grazie! Questo è un approccio ragionevole per Cordova per bloccare una versione.
Hozuki

10
Tengo la cartella delle mie piattaforme fuori dal controllo del codice sorgente, quindi per ottenere ciò, ho creato build-extras.gradlenel mio progetto il codice aggiunto radice per copiarlo in hooks\after_platform_add gist.github.com/charlesbedrosian/…
cbedrosian

8
Non ho questo file: "build-extras.gradle"
Joe Sleiman

3
Per altri utenti di phonegap-build. La risposta è Cordova-android-support-Gradle-release forums.adobe.com/thread/2462835
catu

7
Oltre al commento di @ StéphanePadovani, nota che dovrebbe essere creato nella cartella / piattaforme / android / app da Cordova Android 7.0.0
Will Kru

83

Google ha rilasciato la nuova versione 28.0.0-alpha1 di com.android.support:support-v4 che aggiunge 2 nuovi attributi (android: fontVariationSettings e android: ttcIndex). Alcuni plugin utilizzano le ultime librerie di supporto Android che si traducono in incompatibilità indesiderate.

Opzione 1: installa il plug -in cordova-android-support-gradle-release .

Plugin ben documentato che "allinea varie versioni delle librerie di supporto Android specificate da altri plugin a una versione specifica". Testato senza alcun comportamento distruttivo.

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

Leggi la documentazione per un set completo di opzioni: Readme

Opzione 2 : aggiungi lo snippet di codice successivo in build.gradle in piattaforme / 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'
}

Attenzione: il codice in build.gradle verrà sovrascritto se rimuovi / aggiungi la piattaforma Android. Se non vuoi usare il plugin per qualche motivo o in qualche modo non funziona per te, crea invece un hook e sovrascrivi il file ogni volta. Controlla il secondo commento qui .

Se il problema persiste puoi provare:

cordova platform rm android
cordova platform add android

O

Assicurati di non avere una versione precedente dell'app installata sul dispositivo che provi perché riceverai un errore ambiguo quando tenterà di eseguire il downgrade della versione esistente: "INSTALL_FAILED_VERSION_DOWNGRADE" e "UnhandledPromiseRejectionWarning: Unhandled promise rejection"


2
Migliore risposta. L'installazione del plugin è la soluzione migliore e facile a questo. Risolve automaticamente l'errore una volta aggiunto il plug-in. Semplice. Non c'è bisogno di giocare creando file nella cartella della piattaforma che deve essere monitorata manualmente in caso di rimozione e aggiunta di piattaforme.
Neel

L'opzione 1 ha funzionato per me. È estremamente frustrante che Cordova definisca le loro dipendenze in modo non rigoroso. Non so perché lo fanno. Ho lasciato il mio progetto in uno stato funzionante settimane fa, torna ad esso per ricompilare una versione di debug e improvvisamente si verificano errori.
Norman Breau

Impossibile recuperare il plug-in cordova-android-support-gradle-release tramite il registro
netshark1000

@ netshark1000 Questo problema non è correlato al plugin ma con il tuo package.json o con qualche configurazione del progetto. Dai un'occhiata al package.json e assicurati che il plugin non sia già installato. Se esiste basta chiamare ionica cordova prepararsi a ricaricarla. Se il problema è persistente, rimuovere le piattaforme, la cartella dei plug-in e aggiungere nuovamente le piattaforme. Questo dovrebbe fare il trucco.
Andrew Radulescu

1
Perfetto, il numero 1 mi ha salvato
GBarroso

31

Lo stesso errore sta accadendo a me. Apparentemente, è com.android.support:support-v4stata rilasciata una nuova versione della libreria e il plugin che sto usando definisce com.android.support:support-v4:+come dipendenza in plugin.xml. Il +segno significa che riceverà l'ultima versione (28.0.0), che sembra essere incompatibile con altri plugin.

Sono stato in grado di creare una versione di sviluppo modificando tutte le dipendenze del plugin da com.android.support:support-v4:+a com.android.support:support-v4:27.1.0. Inoltre, ho eseguito ionic cordova platform remove androide ionic cordova platform add android. Spero che aiuti, almeno per lo sviluppo.


Grazie mille, da parte mia, ho cambiato una cosa gradle file del plugin all'interno della directory della piattaforma Android. per favore controlla se non funziona dalla soluzione @avmatte.
Sandun Priyanka

non funziona per me, faccio lo stesso ma quando aggiungo di nuovo la piattaforma Android la versione torna alla v4: 24.1.1+ anche quando l'ho rimossa alla 27.1.0
Joe Sleiman

ho questo errore: Impossibile trovare com.android.support:support-v4:27.1.0.
Joe Sleiman

28

Ho appena risolto questo problema andando alla cartella platform / android e modificato il project.propertiesfile) e sostituito com.android.support:support-v4:+con com.android.support:support-v4:27.1.0.


21

Se hai davvero solo bisogno di una soluzione rapida su quel problema per far funzionare la tua build, puoi provare ad aggiungere le seguenti righe nel tuo file platform / android / build.gradle:

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

Ad ogni modo, impostare la versione qui non è una soluzione sostenibile.


Ben fatto. questo lo ha fatto per me, ma sì, immagino che andrà perso se rimuovo e aggiungo la piattaforma o installo su una nuova macchina.
Gurnard

Ho dovuto metterlo in / piattaforme / android / app; come dici tu non è sostenibile
user542319

@stu non hai detto nella tua risposta dove devo mettere questo codice in fondo?
Sayed Mohd Ali

15

È strano, ma funziona quando aggiungo le righe seguenti con le stesse versioni.

Queste sono le mie righe correlate nel platforms/android/build.gradlefile:

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

Nel mio progetto, il problema si è verificato a causa del plug-in "cordova-plugin-crosswalk-webview".


Grazie, questo mi ha davvero aiutato a scaricare nuovamente le dipendenze che erano state precedentemente sovrascritte dall'aggiornamento. Sebbene la modifica del tuo build.gradle sia scoraggiata, ho provato le soluzioni precedenti senza alcun risultato
Nico

8

Ho lo stesso errore ma non nella build di cordova. Una nuova versione di com.android.support:appcompat-v7e dipendenze. Ma la versione incompatibile è nel terzo pacchetto che dipende da com.android.support:appcompat-v7. Quindi non posso riparare il terzo pacchetto con la soluzione di @avmatte .

Usa la soluzione di @ Sai Teja per trovare un pacchetto incompatibile:

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

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

Sopra il codice forza la versione delle dipendenze.


8

Stavo affrontando lo stesso errore. Ho fatto una ricerca completa nella directory dei plugin per com.android.support:support-v4:+ e lo ha sostituito con un codice di versione statica.

Per me, com.android.support:support-v4:23.4.0 ha funzionato perfettamente. Non è stato quindi necessario rimuovere e aggiungere nuovamente la piattaforma Android.


8

Ecco un modo semplice per risolverlo che persisterà quando la directory della piattaforma viene ricostruita e non è necessario passare attraverso tutti i plugin per cercare di trovare un colpevole. Crea un file build-extras.gradlecon questi contenuti:

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

Quindi crea il file after_platform_add/010_copy_build_extras.jscon i seguenti contenuti:

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

Ora ricrea la piattaforma Android e utilizzerà la libreria di supporto bloccata.


gli hook della sottodirectory sono deprecati utilizzare config.xml<platform name="android"> <hook src="hooks/copy_build_extras.js" type="before_build" /> </platform>
Exlord

ok testato e il tuo codice sembra non essere valido process.argv[2]è buildper me!
Exlord

Mi dispiace @Exlord, immagino che occorrerà qualche aggiustamento per funzionare con il nuovo stile di hook, ma attualmente sto usando questo codice esatto con un hook di sottodirectory e sta funzionando alla grande.
Brad Pitcher

8

Ho trovato la soluzione su Ionic Forum, che era l'unica soluzione che ha funzionato per me:

Correre:

piattaforma ionica cordova rm android

Correre:

La piattaforma ionica Cordova aggiunge android@8.0.0

Correre:

Il plugin ionico cordova aggiunge cordova-plugin-androidx

Correre:

Il plug-in ionico cordova aggiunge l'adattatore cordova-plugin-androidx

Assicurati che il tuo gradle.properties abbia:

cdvMinSdkVersion = 19

Assicurati che il tuo build.gradle abbia:

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 }

Assicurati che il tuo config.xml abbia:

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

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

che viene gestito anche nella risposta stackoverflow: https://stackoverflow.com/a/56656680/839691


Questa è l'unica soluzione che funziona sulla mia vecchia Ionic 3app. Grazie!
Sampath

utilizzando ionic 3: questo mi ha aiutato a risolvere questo problema, ma ora ho un altro problema * Cosa è andato storto: esecuzione non riuscita per l'attività ': app: compileDebugJavaWithJavac'. > Compilazione fallita; vedere l'output dell'errore del compilatore per i dettagli.
Prem Sanil

1
@PremSanil Non sono sicuro che questo stia causando il tuo problema, ma assicurati di aver scaricato gli strumenti di build 28.0.3 in SDK Manager di Android Studio.
alpere

@alpere ho dovuto aggiornare la versione di Node alla v10.17.0 e i plug-in inutilizzati rimossi hanno iniziato a funzionare (utilizzando il tema blu Ionic 3)
Prem Sanil

5

Alcune delle tue librerie dovrebbero usare

com.android.support:support-v4:+

Trova quale è, con

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

E aggiungi quella libreria come modulo se non utilizza una versione specifica nell'ultimo aggiornamento (solleva anche un problema in quella libreria!;))

Grazie a @avmatte!

EDIT: puoi anche richiedere a gradle di forzare la versione della libreria

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

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

4

Ieri stavo avendo lo stesso problema di punto in bianco. È iniziato in modo casuale, ma dalla lettura in giro, sembra che abbia a che fare con un aggiornamento come menzionato sopra da @ cpro90. Tuttavia, ho provato e non sono riuscito a trovare dove effettuare la modifica manuale necessaria.

Alla fine ho scoperto che il problema era causato dal mio plugin cordova-plugin-crosswalk-webview. Su GitHub, ho riscontrato il problema nella riproduzione del plug-in questa mattina e aveva oltre 520 visualizzazioni a pranzo.

@UNUMObile ha suggerito quanto segue nel build.gradlefile per forzare una versione precedente a livello globale:

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

Questo ha funzionato immediatamente per me e potrebbe aiutare gli altri con altri plugin che hanno avuto la loro dipendenza da 'com.android.support:support-4:<28. La nuova versione 28 sembra essere il problema.

Spero che questo aiuti qualcuno ad andare avanti.


4

Solo alcuni suggerimenti per lo sviluppatore Kotlin:

Se segui queste risposte qui, sei sicuro di non avere una support-v4libreria nel tuo progetto ma stai ancora visualizzando questo errore, dai un'occhiata alla ktxlibreria.

Ho appena scoperto che sto usando l'ultima 1.0.0-alpha1versione per la libreria ktx e questo errore viene mostrato; dopo che sono tornato alla versione 0.3, ora tutto torna alla normalità.


Impossibile risolvere: androidx.fragment: fragment-ktx: 0.3, quando cambio a "1.0.0-alpha1" si verifica lo stesso problema.
Mahmood Ali

@MahmoodAli dai un'occhiata alle altre dipendenze? Sto solo pubblicando la mia situazione e Google potrebbe anche fare in modo che l'altro pacchetto faccia lo stesso sbagliato.
Anthonyeef

@MahmoodAli grazie per il collegamento, ma penso che la maggior parte del progetto inizi a utilizzare ktx lib prima che androidx venga annunciato nel Google IO di quest'anno. È difficile evitare di mescolare ktx con la libreria di supporto ... forse la migrazione ad androidx dovrebbe essere la soluzione finale per questo tipo di eccezione.
Anthonyeef

4

Aggiungi le seguenti righe alle tue piattaforme / android / build.gradle

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

se il problema persiste, prova a eseguire questo comando:

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

3

Nel tuo build.gradlefile aggiungi

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

E nel tuo project.propertiesfile cambia cordova.system.library.3in cordova.system.library.3=com.android.support:support-v13:27.+.


2

Per gli utenti di Phonegap Build , come ha menzionato @catu in un commento, puoi provare questo plugin il cui scopo è prevenire errori di compilazione causati dall'inclusione di diverse versioni delle librerie di supporto .


1

Risolvi questo problema inserendo le seguenti righe di codice nel file platform / android / app / build.gradle, subito dopo il blocco buildscript {}:

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

1

Ho avuto lo stesso problema dopo aver installato il plug-in cordova-plugin-file-opener2. È stato ripristinato dopo aver eseguito: Opzione 1: installa il plug-in cordova-android-support-gradle-release. il plug-in cordova aggiunge cordova-android-support-gradle-release --fetch


0

Un altro approccio con la stessa soluzione è creare un gancio. È persistente (dopo la reinstallazione della piattaforma), puoi eseguirne il commit e non è necessario aggiungere nuovamente la piattaforma.

% 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 in config

% Del progetto% \ config.xml

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

Installa la dipendenza fs nel tuo progetto:

npm i fs --save-dev

Esegui build:

cordova build Android


0

SUPER SEMPLICE E CORRETTOMODO PER RISOLVERLO!

Basta aggiornare l'SDK e aggiungere l'ultima versione 2 di Android ... e riavviare il computer! Fatto...

Ora abbiamo tempo per parlare di auto e sport ...


0

Ho avuto lo stesso problema e nessuna delle soluzioni fornite ha funzionato per me. L'installazione dell'ultima versione di Android SDK Build-tools (27.0.3) ha risolto il mio problema.


0

Collegamento alla soluzione

Ciò è dovuto al plug-in compatibile. Rimuovi quel plugin se hai una versione precedente (inferiore alla 1.2.0 ) e imposta cordova-android@6.3.0

cordova plugin rm cordova-plugin-compat --force

Il plugin cordova aggiunge cordova-plugin-compat@1.2.0

cordova platform rm android

La piattaforma ionica Cordova aggiunge android@6.3.0

Lavorando al mio caso. Grazie :)


0

aggiornamenti alla risposta di @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 nella directory principale

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

0

Stavo riscontrando questo problema con React Native ed è stato causato dalle seguenti righe nel mio android/app/build.gradle:

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

eccetera...

Apparentemente questo + si è risolto in una nuova versione 17.0.0 che ha rotto la mia build.
La modifica del + in 16.0.0 (o 16.0.1 per play-services-base) ha risolto il mio problema


0

Questo problema mi stava uccidendo da una settimana.

Alla fine sono finito android@6.4.0

Ho alterato 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+

Quel cambiamento mi ha finalmente fatto uscire dal pozzo dell'oscurità del messaggio di errore ttcIndex.

Quindi ho ricevuto questo errore

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

L'errore era apparentemente dovuto a un problema di versione di Java. Ho quindi modificato android/build.gradlecon la seguente modifica

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

Nota anche che ho il cordova-android-support-gradle-releaseplugin installato, ma non ho idea se ne ho bisogno.


-1

È una voce duplicata in values.xml in una cartella chiamata support-compat-28.0.0-alpha1.aar .

Troverai questo file su Windows all'indirizzo \users\YOURUSERID\.gradle\caches\transforms-1\files-1.1

Una volta all'interno di quella cartella devi andare alcuni livelli più in profondità in values.xml .

In quel file, cerca un elemento <declare-styleable name="FontFamilyFont> .

In quell'elemento, rimuovi le QUATTRO righe con android: .

Dopo aver apportato tale modifica, posso ricostruire senza errori.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.