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?


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

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"


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.


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.


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.


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


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.


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.


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.


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 android@8.0.0

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


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

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.


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.


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

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.+.


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 .


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

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


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


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


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.


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 cordova-android@6.3.0

plugin cordova rm cordova-plugin-compat --force

plugin cordova add cordova-plugin-compat@1.2.0

plataforma cordova rm android

plataforma iônica cordova add android@6.3.0

Trabalhando no meu caso. Obrigado :)


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

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


0

Este problema estava me matando por uma semana.

No final das contas acabei em android@6.4.0

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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.