Executando “cordova build android” - não foi possível encontrar o atributo android: fontVariationSettings e android: ttcIndex

103

Quando eu executo cordova build android --buildConfig xxxx --release, obtenho o seguinte erro:

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

O estranho é que uso duas máquinas macOS para a compilação e recebo esse erro apenas em uma delas para o mesmo código.

Aqui está o resultado de ./gradlew cdvPrintPropsI get nas duas 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

Abaixo está a lista de plug-ins usados:

$ 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 posso resolver este problema?

Stéphane Padovani
fonte
Esse problema também está acontecendo comigo o dia todo. Eu reduzi para um plugin que uso. No entanto, eu preciso deste plugin para meus aplicativos. Quais plugins você está usando?
Chris R
@ChrisRitten Olá, concluí a postagem acima com a lista de plugins. Saudações.
Stéphane Padovani,
1
nenhuma resposta ajuda, lutando com isso há um dia.
khusrav
Se isso pode ajudar freakyjolly.com/…
Code Spy

Respostas:

106

Basta colocar o seguinte em build-extras.gradle

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:27.1.0'
    }
}
helmson helmson
fonte
Obrigado! Esta é uma abordagem razoável para Cordova fixar em uma versão.
Hozuki
10
Eu mantenho minha pasta de plataformas fora do controle de origem, então, para fazer isso, criei build-extras.gradleno meu projeto um código adicionado à raiz para copiá-lo em hooks\after_platform_add gist.github.com/charlesbedrosian/…
cbedrosian
8
não tenho esse arquivo: "build-extras.gradle"
Joe Sleiman,
3
Para outros usuários do phonegap-build. A resposta é cordova-android-support-gradle-release forums.adobe.com/thread/2462835
catu
7
Além do comentário de @ StéphanePadovani, observe que ele deve ser criado na pasta / platform / android / app do Cordova Android 7.0.0
Will Kru
83

O Google lançou a nova versão 28.0.0-alpha1 de com.android.support:support-v4 que está adicionando 2 novos atributos (android: fontVariationSettings e android: ttcIndex). Alguns dos plug-ins estão usando as bibliotecas de suporte para Android mais recentes, o que resulta em incompatibilidades indesejadas.

Opção 1: Instale o plug- in cordova-android-support-gradle-release .

Plugin bem documentado que "alinha várias versões das bibliotecas de suporte do Android especificadas por outros plug-ins a uma versão específica". Testado sem qualquer comportamento destrutivo.

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

Leia a documentação para um conjunto completo de opções: Leiame

Opção 2 : adicione o próximo snippet de código em build.gradle em 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'
}

Aviso: o código em build.gradle será sobrescrito se você remover / adicionar a plataforma Android. Se você não quiser usar o plugin por algum motivo ou de alguma forma não estiver funcionando para você, em vez disso, crie um gancho e substitua o arquivo todas as vezes. Verifique o segundo comentário aqui .

Se o problema for persistente, você pode tentar:

cordova platform rm android
cordova platform add android

OU

Certifique-se de não ter uma versão anterior do aplicativo instalada no dispositivo testado, porque você receberá um erro ambíguo quando ele tentar fazer o downgrade da versão existente: "INSTALL_FAILED_VERSION_DOWNGRADE" e "UnhandledPromiseRejectionWarning: Rejeição de promessa não tratada"

Andrew Radulescu
fonte
2
Melhor resposta. Instalar o plugin é a melhor e mais fácil solução para isso. Ele resolve automaticamente o erro assim que o plugin é adicionado. Simples. Não há necessidade de criar arquivos na pasta da plataforma que precisam ser rastreados manualmente no caso de remoção e adição de plataformas.
Neel
A opção 1 funcionou para mim. É extremamente frustrante que Cordova defina suas dependências de maneira não rígida. Eu não sei por que eles fazem isso. Deixei meu projeto funcionando semanas atrás, volte a ele para recompilar uma versão de depuração e, de repente, ocorrem erros.
Norman Breau
Falha ao buscar o plugin cordova-android-support-gradle-release via registro
netshark1000
@ netshark1000 Este problema não está relacionado com o plugin, mas com seu package.json ou alguma configuração de projeto. Dê uma olhada no package.json e certifique-se de que o plugin ainda não esteja instalado. Caso exista basta ligar para cordova iônica e preparar para recarregar. Se o problema for persistente, remova as plataformas, a pasta de plug-ins e adicione novamente as plataformas. Isso deve funcionar.
Andrew Radulescu
1
Perfeito, o número 1 me salvou
GBarroso
31

O mesmo erro está acontecendo comigo. Aparentemente, uma nova versão da com.android.support:support-v4biblioteca foi lançada e o plugin que estou usando define com.android.support:support-v4:+como dependência do plugin.xml. O +sinal significa que obterá a versão mais recente (28.0.0), que parece ser incompatível com outros plug-ins.

Consegui construir uma versão de desenvolvimento alterando todas as dependências do plugin de com.android.support:support-v4:+para com.android.support:support-v4:27.1.0. Além disso, eu executei ionic cordova platform remove androide ionic cordova platform add android. Espero que ajude, pelo menos para o desenvolvimento.

avmatte
fonte
Muito obrigado, Do meu lado, mudei uma coisa dos arquivos gradle do plugin dentro do diretório da plataforma android. verifique se não funciona com a solução @avmatte.
Sandun Priyanka
não está funcionando para mim, eu faço o mesmo, mas quando adiciono novamente a plataforma Android, a versão retorna para v4: 24.1.1+, mesmo quando removi para 27.1.0
Joe Sleiman
tenho este erro: Não foi possível encontrar com.android.support:support-v4:27.1.0.
Joe Sleiman,
28

Acabei de corrigir esse problema acessando a pasta plataforma / android, editei o project.propertiesarquivo) e substituí-lo com.android.support:support-v4:+por com.android.support:support-v4:27.1.0.

Ahmed
fonte
21

Se você realmente precisa apenas de uma solução rápida para esse problema para fazer sua compilação funcionar, você pode tentar adicionar as seguintes linhas em seu arquivo plataformas / android / build.gradle:

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

De qualquer forma, definir a versão aqui não é uma solução sustentável.

stu
fonte
Agradável. isso funcionou para mim, mas sim, eu acho que isso será perdido se eu remover e adicionar a plataforma ou instalar em uma nova máquina.
Gurnard
Tive que colocar isso em / platform / android / app; como você diz, não é sustentável
user542319 01 de
@stu, você não disse em sua resposta onde devo colocar esse código na parte inferior?
Sayed Mohd Ali
15

É estranho, mas funciona quando adiciono as linhas abaixo com as mesmas versões.

Estas são minhas linhas relacionadas no platforms/android/build.gradlearquivo:

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

No meu projeto, o problema ocorreu por causa do plugin 'cordova-plugin-crosswalk-webview'.

Muhammed Tanrıverdi
fonte
Obrigado, isso realmente ajudou a baixar novamente as dependências que foram substituídas anteriormente pela atualização. Embora a edição do seu build.gradle seja desencorajada, tentei soluções anteriores sem sucesso
Nico
8

Tenho o mesmo erro mas não na construção de cordova. Uma nova versão das com.android.support:appcompat-v7dependências e. Mas a versão incompatível está no terceiro pacote que depende de com.android.support:appcompat-v7. Portanto, não posso consertar o terceiro pacote com @avmatte a solução de .

Use a solução de @Sai Teja para encontrar um pacote incompatível:

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

Em seguida, consertei com:

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

O código acima força a versão das dependências.

faça
fonte
8

Eu estava enfrentando o mesmo erro. Fez uma pesquisa completa no diretório do plugin para com.android.support:support-v4:+ e substituiu-o por um código de versão estática.

Para mim, com.android.support:support-v4:23.4.0 funcionou perfeitamente. Não houve necessidade de remover e adicionar novamente a plataforma Android.

cpro90
fonte
8

Esta é uma maneira fácil de consertar que persistirá quando o diretório da plataforma for reconstruído e não há necessidade de passar por todos os plug-ins para tentar encontrar um culpado. Crie um arquivo build-extras.gradlecom este conteúdo:

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

Em seguida, crie o arquivo after_platform_add/010_copy_build_extras.jscom o seguinte conteúdo:

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

Agora recrie a plataforma Android e ela usará a biblioteca de suporte fixada.

Brad Pitcher
fonte
os ganchos do subdiretório estão obsoletos, use config.xml<platform name="android"> <hook src="hooks/copy_build_extras.js" type="before_build" /> </platform>
Exlord
ok testado e seu código parece inválido process.argv[2]é buildpara mim!
Exlord de
Desculpe @Exlord, acho que vai precisar de alguns ajustes para funcionar com o novo gancho de estilo, mas estou usando este código exato com um gancho de subdiretório atualmente e está funcionando muito bem.
Brad Pitcher
8

Encontrei a solução no Ionic Forum, que foi a única solução que funcionou para mim:

Corre:

plataforma iônica cordova rm android

Corre:

plataforma iônica cordova add [email protected]

Corre:

plugin cordova ionic add cordova-plugin-androidx

Corre:

plugin cordova ionic add cordova-plugin-androidx-adapter

Certifique-se de que seu gradle.properties tenha:

cdvMinSdkVersion = 19

Certifique-se de que seu build.gradle tenha:

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 }

Certifique-se de que seu config.xml tenha:

<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 também é tratado na resposta stackoverflow: https://stackoverflow.com/a/56656680/839691

Alpere
fonte
Esta é a única solução que funciona no meu Ionic 3aplicativo antigo . Obrigado!
Sampath
using ionic 3: Isso me ajudou a resolver esse problema, mas agora tenho outro problema * O que deu errado: Falha na execução da tarefa ': app: compileDebugJavaWithJavac'. > A compilação falhou; consulte a saída de erro do compilador para obter detalhes.
Prem Sanil
1
@PremSanil Não tenho certeza se isso está causando o problema, mas certifique-se de ter baixado as ferramentas de compilação 28.0.3 no SDK Manager do Android Studio.
alpere
@alpere Tive que atualizar a versão do Node para v10.17.0 e os plug-ins não utilizados removidos começaram a funcionar (usando o tema azul Ionic 3)
Prem Sanil
5

Algumas de suas bibliotecas deveriam usar

com.android.support:support-v4:+

Encontre qual é, com

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

E adicione essa biblioteca como um módulo se ela não estiver usando uma versão específica em sua atualização mais recente (também levante um problema nessa biblioteca!;))

Graças a @avmatte!

EDITAR: você também pode solicitar o Gradle para forçar a versão da biblioteca

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

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

Eu estava tendo o mesmo problema do nada ontem. Tudo começou aleatoriamente, mas lendo ao redor, parece que tem a ver com uma atualização mencionada acima por @ cpro90. No entanto, tentei e não consegui encontrar onde fazer a alteração manual necessária.

Por fim, identifiquei que o problema estava sendo causado pelo meu plug-in cordova-plugin-crosswalk-webview. No GitHub, encontrei o problema no plug-in repro esta manhã, e ele tinha mais de 520 visualizações até o almoço.

@UNUMObile sugeriu o seguinte no build.gradlearquivo para forçar uma versão anterior globalmente:

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

Isso funcionou imediatamente para mim e pode ajudar outras pessoas com outros plug-ins que também dependiam de 'com.android.support:support-4:<28. A nova versão 28 parece ser o problema.

Espero que isso ajude alguém a seguir em frente.

Chris Scutt
fonte
4

Apenas algumas dicas para desenvolvedor Kotlin:

Se você seguir essas respostas aqui, tem certeza de que não tem uma support-v4biblioteca em seu projeto, mas ainda está vendo este erro, por favor, dê uma olhada noktx biblioteca.

Acabei de descobrir que estou usando a 1.0.0-alpha1versão mais recente da biblioteca ktx e esse erro apareceu; depois que mudei de volta para a versão 0.3, tudo voltou ao normal agora.

Anthonyeef
fonte
Falha ao resolver: androidx.fragment: fragment-ktx: 0.3, quando eu mudo para '1.0.0-alpha1' o mesmo problema acontece.
Mahmood Ali
@MahmoodAli dá uma olhada nas outras dependências? Estou apenas postando minha situação, e o Google também pode solicitar que o outro pacote faça o mesmo errado.
Anthonyeef
@MahmoodAli obrigado pelo link, mas acho que a maior parte do projeto começa a usar ktx lib antes do androidx ser anunciado no Google IO deste ano. É difícil evitar misturar ktx com a biblioteca de suporte ... talvez a migração para o androidx deva ser a solução final para esse tipo de exceção.
Anthonyeef de
4

Adicione as seguintes linhas a suas plataformas / android / build.gradle

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

se ainda estiver tendo problemas, tente executar este comando:

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

Em seu build.gradlearquivo, adicione

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

E em seu project.propertiesarquivo mude cordova.system.library.3para cordova.system.library.3=com.android.support:support-v13:27.+.

um homem
fonte
2

Para usuários do Phonegap Build , como @catu mencionou em um comentário, você pode tentar este plugin cujo objetivo é prevenir falhas de build causadas pela inclusão de diferentes versões das bibliotecas de suporte .

user276648
fonte
1

Basta corrigir esse problema colocando as seguintes linhas de código no arquivo platform / android / app / build.gradle, logo após o bloco buildscript {}:

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

Eu tive o mesmo problema depois de instalar o plugin cordova-plugin-file-opener2. Ele foi removido após fazer: Opção 1: Instale o plugin cordova-android-support-gradle-release. plugin cordova add cordova-android-support-gradle-release --fetch

DineshS
fonte
0

Outra abordagem com a mesma solução é criar um gancho. É persistente (após a reinstalação da plataforma), você pode confirmá-lo e não requer a reinstalação da plataforma.

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

Gancho de inicialização na configuração

% project% \ config.xml

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

Instale a dependência fs em seu projeto:

npm i fs --save-dev

Execute o build:

cordova construir android

pedregoso
fonte
0

SUPER SIMPLES E CORRETOFORMA DE RESOLVER!

Basta atualizar o SDK e adicionar a última versão 2 do Android ... e reiniciar o computador! Feito...

Agora temos tempo para falar sobre carros e esportes ...

Ari Waisberg
fonte
0

Eu tive o mesmo problema e nenhuma das soluções fornecidas funcionou para mim. Instalar a versão mais recente do Android SDK Build-tools (27.0.3) resolveu meu problema.

Daniel W.
fonte
0

Link de solução

Isso se deve ao plugin compat. Remova esse plug-in se você tiver uma versão mais antiga (inferior a 1.2.0 ) e defina [email protected]

plugin cordova rm cordova-plugin-compat --force

plugin cordova add [email protected]

plataforma cordova rm android

plataforma iônica cordova add [email protected]

Trabalhando no meu caso. Obrigado :)

Pranay Kumar
fonte
0

atualizações da resposta 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 no diretório raiz

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

Eu estava tendo esse problema com o react nativo e foi causado pelas seguintes linhas no meu 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, isso resolveu para uma nova versão 17.0.0 que quebrou minha compilação.
Mudar + para 16.0.0 (ou 16.0.1 para play-services-base) resolveu meu problema

Uri Klar
fonte
0

Este problema estava me matando por uma semana.

No final das contas acabei em [email protected]

Eu alterei android/project.propertiesmudando

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

Essa mudança finalmente me tirou do poço da escuridão das mensagens de erro ttcIndex.

Então eu recebi este erro

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

O erro foi aparentemente devido a um problema de versão do Java. Eu então alterei android/build.gradlecom a seguinte mudança

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

Observe também que tenho o cordova-android-support-gradle-releaseplug - in instalado, mas não tenho ideia se preciso dele.

Austin Hutchison
fonte
-1

É uma entrada duplicada em values.xml em uma pasta chamada support-compat-28.0.0-alpha1.aar.

Você encontrará este arquivo no Windows em \users\YOURUSERID\.gradle\caches\transforms-1\files-1.1

Uma vez dentro dessa pasta, você deve ir alguns níveis mais profundamente para values.xml .

Nesse arquivo, procure um elemento <declare-styleable name="FontFamilyFont> .

Nesse elemento, remova as QUATRO linhas android:nele.

Depois de fazer essa alteração, posso construir novamente sem erros.

Henk Kelder
fonte