Executando “cordova build android” - incapaz de encontrar o atributo android: fontVariationSettings e android: ttcIndex

88

Quando eu executo cordova build android --buildConfig xxxx --release , Eu recebo 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 mais estranho é que eu uso duas máquinas macOS para a compilação e recebo esse erro apenas em uma delas para o mesmo código.

Aqui está a saída de ./gradlew cdvPrintProps que obtenho 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 plugins 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?

    
por Stéphane Padovani 07.03.2018 в 23:50
fonte

24 respostas

96

Basta colocar o seguinte em build-extras.gradle

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:27.1.0'
    }
}
    
por helmson helmson 08.03.2018 / 14:46
fonte
65

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

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

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

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

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

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á substituído 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ê, crie um hook e sobrescreva o arquivo toda vez. Verifique o segundo comentário aqui .

Se o problema persistir, você pode tentar:

cordova platform rm android
cordova platform add android

OR

Verifique se você não tem uma versão anterior do aplicativo instalado no dispositivo testado, pois receberá um erro ambíguo ao tentar fazer o downgrade da versão existente: "INSTALL_FAILED_VERSION_DOWNGRADE" e "UnhandledPromiseRejectionWarning: rejeição de promessa não tratada"

    
por Andrew Radulescu 09.03.2018 / 20:24
fonte
30

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

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

    
por avmatte 08.03.2018 / 03:27
fonte
20

Se você realmente só precisa de uma solução rápida para resolver essa questão, tente adicionar as seguintes linhas em seu arquivo / 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.

    
por stu 08.03.2018 / 13:42
fonte
20

Acabei de corrigir esse problema indo para a pasta platform / android e editei o arquivo project.properties ) e substituí o com.android.support:support-v4:+ por com.android.support:support-v4:27.1.0 .

    
por Ahmed 08.03.2018 / 13:21
fonte
15

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

Estas são as minhas linhas relacionadas no arquivo platforms/android/build.gradle :

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 devido ao plugin 'cordova-plugin-crosswalk-webview'.

    
por Muhammed Tanrıverdi 08.03.2018 / 14:18
fonte
8

Eu tenho o mesmo erro, mas não no build de cordova. Uma nova versão do com.android.support:appcompat-v7 e dependências.Mas a versão incompatível está no terceiro pacote que depende de com.android.support:appcompat-v7 .Então eu não posso consertar o terceiro pacote com solução @ avmatte .

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

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

Em seguida, corrigi-lo 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.

    
por doit 08.03.2018 / 07:11
fonte
8

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

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

    
por cpro90 08.03.2018 / 10:57
fonte
8

Aqui está uma maneira fácil de corrigir isso que persistirá quando o diretório da plataforma for reconstruído e não precisar passar por todos os plug-ins para tentar encontrar um culpado. Crie um arquivo build-extras.gradle com estes conteúdos:

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

Em seguida, crie o arquivo after_platform_add/010_copy_build_extras.js com 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.

    
por Brad Pitcher 08.03.2018 / 22:46
fonte
4

Algumas de suas bibliotecas devem estar usando

com.android.support:support-v4:+

Descubra qual deles é, 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 crie um problema nessa biblioteca!;))

Obrigado ao @avmatte!

    
por Sai Teja 08.03.2018 / 05:12
fonte
4

Eu estava tendo o mesmo problema do nada ontem. Começou de forma aleatória, mas a partir da leitura, 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 na repro do plugin esta manhã, e tinha mais de 520 visualizações ao almoço.

@UNUMObile sugeriu o seguinte no arquivo build.gradle 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 plugins que também tiveram sua dependência em 'com.android.support:support-4:<28. A nova versão 28 parece ser o problema.

Espero que isso ajude alguém a progredir.

    
por Chris Scutt 08.03.2018 / 22:24
fonte
4

Apenas algumas dicas para o desenvolvedor do Kotlin:

Se você seguir estas respostas aqui, tiver certeza de que não tem a biblioteca support-v4 em seu projeto, mas ainda estiver vendo esse erro, consulte a biblioteca ktx .

Acabei de descobrir que estou usando a última versão 1.0.0-alpha1 da biblioteca ktx e esse erro é exibido; depois eu mudei de volta para a versão 0.3 , tudo de volta ao normal agora.

    
por Anthonyeef 13.05.2018 / 16:30
fonte
3

No seu arquivo build.gradle , adicione

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

E na sua alteração do arquivo project.properties cordova.system.library.3 para cordova.system.library.3=com.android.support:support-v13:27.+ .

    
por aman 13.03.2018 / 08:16
fonte
1

Para usuários do Phonegap Build , como @catu mencionado em um comentário, você pode tentar este plugin que é para evitar falhas de compilação causadas pela inclusão de versões diferentes das bibliotecas de suporte .

    
por user276648 05.04.2018 / 04:48
fonte
1

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

configurations.all {
    resolutionStrategy {
            force 'com.android.support:support-v4:27.1.0'
    }
}
    
por Kush 27.04.2018 / 13:16
fonte
1

Adicione as seguintes linhas às suas plataformas / android / build.gradle

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

se ainda tiver problemas, tente executar este comando:

cordova plugin add cordova-android-support-gradle-release --fetch
    
por karan bhatia 17.07.2018 / 13:55
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 adição de novas plataformas.

  

% projeto% \ 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 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 no seu projeto:

  

npm i fs --save-dev

Executar compilação:

  

cordova build android

    
por pavelety 12.03.2018 / 00:47
fonte
0

MODO SUPER SIMPLES E CORRETO DE RESOLVÁ-LO!

Atualize o SDK e adicione a última versão do Android ... e reinicie o computador! Feito ...

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

    
por AriWais 18.04.2018 / 18:32
fonte
0

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

    
por Daniel W. 30.05.2018 / 18:51
fonte
0

atualiza a 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'
  }
}
    
por Exlord 18.06.2018 / 12:34
fonte
0

Se você estiver usando o iônico e receber este erro, resolva-o da seguinte forma:

-cordova platform rm android
-cordova platform add android

Pode ser uma solução possível

    
por Raphael Andrey Martinez Velasq 28.06.2018 / 21:42
fonte
0

Link da solução

Isto é devido ao plugin compatível. Remova esse plugin se você tiver uma versão antiga (menor que 1.2.0 ) e configure cordova-android@6.3.0

  

plug-in cordova rm cordova-plugin-compat --force

     

cordova plugin add cordova-plugin-compat@1.2.0

     

plataforma cordova rm android

     

plataforma ionic cordova add android@6.3.0

Trabalhando no meu caso. Obrigado :)

    
por Pranay Kumar 04.06.2018 / 12:27
fonte
0

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

    
por DineshS 04.09.2018 / 13:36
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ê precisa ir mais fundo até values.xml .

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

Nesse elemento, remova as QUATRO linhas com android: .

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

    
por Henk Kelder 08.03.2018 / 23:47
fonte