Запуск “cordova build android” - не вдається знайти атрибут android: fontVariationSettings та android: ttcIndex


103

Під час запуску cordova build android --buildConfig xxxx --releaseя отримую таку помилку:

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

Дивна річ, що для компіляції я використовую два машини macOS, і я отримую цю помилку лише на одній з них для того ж коду.

Ось результат, який ./gradlew cdvPrintPropsя отримую на двох машинах:

: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

Нижче наведено список використаних плагінів:

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

Як я можу виправити цю проблему?


Це питання трапляється і зі мною цілий день. Я звузив його до плагіна, який я використовую. Однак мені потрібен цей плагін для моїх додатків. Який плагін ви використовуєте?
Кріс Р

@ChrisRitten Привіт, я доповнив пост вище списком плагінів. З повагою
Стефан Падовані

1
ніхто з відповідей не допомагає, бореться з цим вже цілий день.
хусрав

Якщо в цьому може допомогти freakyjolly.com/…
Code Spy

Відповіді:


106

Просто поставте наступне в build-extras.gradle

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

Дякую! Це розумний підхід для Кордової прив’язати до версії.
Хозукі

10
Я зберігаю свою папку платформ поза контролем джерела, тому для цього я створив build-extras.gradleу своєму корені проекту доданий код, щоб скопіювати його в hooks\after_platform_add gist.github.com/charlesbedrosian/…
cbedrosian

8
у мене немає такого файлу: "build-extras.gradle"
Джо Слейман

3
Для інших користувачів phonegap-build. Відповідь - cordova-android-support-gradle-release forums.adobe.com/thread/2462835
catu

7
Окрім коментаря @ StéphanePadovani, зауважте, що його слід створити в папці / platforms / android / app із Cordova Android 7.0.0
Буде Кру

83

Google випустила нову версію 28.0.0-alpha1 з com.android.support:support-v4 , який додає 2 нових атрибутів (Android: fontVariationSettings і Android: ttcIndex). Деякі з плагінів використовують найсвіжіші бібліотеки підтримки Android, що призводить до небажаних несумісностей.

Варіант 1: Встановіть плагін cordova-android-support-gradle-release .

Добре задокументований плагін, який "вирівнює різні версії бібліотек підтримки Android, визначені іншими плагінами, до певної версії". Випробуваний без деструктивної поведінки.

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

Прочитайте документацію для повного набору варіантів: Readme

Варіант 2 : Додайте наступний фрагмент коду в build.gradle під платформами / 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'
}

Попередження: код у build.gradle буде перезаписаний, якщо ви видалите / додасте платформу Android. Якщо ви не хочете використовувати плагін з якихось причин або якимось чином не працює для вас, замість цього створіть гачок і перезаписуйте файл кожен раз. Перевірте другий коментар тут .

Якщо проблема не вирішена, ви можете спробувати:

cordova platform rm android
cordova platform add android

АБО

Переконайтеся, що у вас на пристрої, що ви тестуєте, встановлена ​​попередня версія програми, оскільки ви отримаєте неоднозначну помилку при спробі понизити існуючу версію: "INSTALL_FAILED_VERSION_DOWNGRADE" та "UnhandledPromiseRejectionWarning: Нерозподілене відхилення обіцянки"


2
Найкраща відповідь. Встановлення плагіна - це найкраще і просте рішення для цього. Він автоматично вирішує помилку після додавання плагіна. Простий. Немає потреби займатися створенням файлів у папці платформи, яку потрібно відстежувати вручну в разі видалення та додавання платформ.
Ніл

Варіант 1 працював на мене. Надзвичайно засмучує те, що Кордова визначає свої залежності не суворо. Я не знаю, чому вони це роблять. Залишив мій проект у робочому стані тижні тому, поверніться до нього, щоб перекомпілювати версію налагодження і раптом трапляються помилки.
Норман Бро

Не вдалося отримати плагін cordova-android-support-gradle-release через реєстр
netshark1000

@ netshark1000 Ця проблема пов'язана не з плагіном, а з вашим package.json або певною конфігурацією проекту. Погляньте на package.json і переконайтеся, що плагін ще не встановлений. Якщо існує, просто зателефонуйте іонній кордоні, підготуйтеся її перезавантажити. Якщо проблема усувається, видаліть платформи, папку плагінів і знову додайте платформи. Це повинно зробити трюк.
Андрій Радулеску

1
Ідеально, №1 врятувало мене
GBarroso

31

Та сама помилка трапляється і зі мною. Мабуть, вийшла нова версія com.android.support:support-v4бібліотеки, і плагін, який я використовую, визначає com.android.support:support-v4:+як залежність у plugin.xml. В +знак означає , що він буде отримати саму останню версію (28.0.0), який , здається , здається несумісним з іншими плагінами.

Мені вдалося створити версію розробки, змінивши всі залежності плагіна від com.android.support:support-v4:+на com.android.support:support-v4:27.1.0. Також я виконав ionic cordova platform remove androidі ionic cordova platform add android. Сподіваюся, це допомагає, принаймні, для розвитку.


Велике спасибі. На моєму боці я змінив файли gradle плагіна всередині каталогу платформи Android. Будь ласка, перевірте, якщо це не працює з рішення @avmatte.
Садун Приянка

не працює для мене, я роблю те саме, але коли я знову додаю платформу для android, версія повертається до v4: 24.1.1+ і навіть тоді, коли я її видалив до 27.1.0
Джо Слейман

у мене є ця помилка: не вдалося знайти com.android.support:support-v4:27.1.0.
Джо Слейман

28

Я щойно вирішив цю проблему, перейшовши в папку платформи / android і відредагував project.propertiesфайл) і замінив com.android.support:support-v4:+на com.android.support:support-v4:27.1.0.


21

Якщо вам справді просто потрібно швидко виправити цю проблему для запуску збірки, ви можете спробувати додати наступні рядки у файл своєї платформи / android / build.gradle:

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

Так чи інакше, встановлення версії тут не є стійким виправленням.


хороший. це зробив це для мене, але так, я думаю, це буде втрачено, якщо я видалю і додам платформу або встановлюю на новій машині.
Гурнард

Довелося помістити це в / platforms / android / app; як ви говорите, його не стійкий
user542319

@stu ви не сказали у своїй відповіді, де мені слід покласти цей код внизу?
Сказав Мохд Алі

15

Це дивно, але він працює, коли я додаю рядки нижче з тими ж версіями.

Це мої пов'язані рядки у 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+'
}

У моєму проекті проблема виникла через плагін "cordova-plugin-crosswalk-webview".


Завдяки цьому справді допомогло повторне завантаження залежностей, які раніше були перезаписані оновленням. Незважаючи на те, що редагування build.gradle не рекомендує, я намагався попередніх рішень безрезультатно
Ніко

8

У мене така ж помилка, але не в програмі Cordova. Нова версія і com.android.support:appcompat-v7і залежності. Але несумісна версія знаходиться в третьому пакеті, який залежить від com.android.support:appcompat-v7. Отже, я не можу виправити третій пакет рішенням @avmatte .

Використовуйте рішення @ Sai Teja , щоб знайти несумісний пакет:

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

Потім виправити це за допомогою:

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

Наведений вище код примушує версію залежності.


8

Я зіткнувся з тією ж помилкою. Зробив повне дослідження плагіну-каталогу для com.android.support:support-v4:+ та замінив його статичним кодом версії.

Для мене com.android.support:support-v4:23.4.0 працював чудово. Тоді не потрібно було видаляти та знову додавати платформу Android.


8

Ось простий спосіб її виправити, який зберігатиметься, коли каталог платформи буде перебудований і не потрібно переглядати всі ваші плагіни, щоб спробувати знайти винуватця. Створіть файл build-extras.gradleіз цим вмістом:

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

Потім створіть файл after_platform_add/010_copy_build_extras.jsіз таким вмістом:

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

Тепер відтворіть платформу Android, і вона використовуватиме закріплену бібліотеку підтримки.


гачки підкаталогу застаріли, використовуйте config.xml<platform name="android"> <hook src="hooks/copy_build_extras.js" type="before_build" /> </platform>
Exlord

добре протестовано і ваш код , здається, недійсним process.argv[2]є buildдля мене!
Exlord

Вибачте @Exlord Я думаю, що для роботи з новим гаком стилю знадобиться певна корекція, але я зараз використовую цей точний код із гачком підкаталогу, і він працює чудово.
Бред Пітчер

8

Я знайшов рішення на Ionic Forum, який був єдиним рішенням, яке працювало на мене:

Виконати:

іонна кордова платформа rm android

Виконати:

іонна кордова платформа додати android@8.0.0

Виконати:

іонний кордова плагін додає cordova-плагін-androidx

Виконати:

іонний кабельний плагін додайте cordova-плагін-androidx-адаптер

Переконайтесь, що ваша gradle.properties має:

cdvMinSdkVersion = 19

Переконайтесь, що у build.gradle є:

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 }

Переконайтесь, що у config.xml є:

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

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

який також обробляється у відповіді stackoverflow: https://stackoverflow.com/a/56656680/839691


Це єдине рішення працює на моєму старому Ionic 3додатку. Дякую!
Сампат

Використання ionic 3: Це допомогло мені вирішити цю проблему, але зараз з’явилася інша проблема * Що пішло не так: Виконання не вдалося виконати завдання ': app: compileDebugJavaWithJavac'. > Компіляція не вдалася; див. інформацію про помилку компілятора.
Прем Саніл

1
@PremSanil Не впевнений, що це викликає ваші проблеми, але переконайтеся, що ви завантажили інструменти для збирання 28.0.3 в Менеджер SDK Android Studio.
Альпер

@alpere Мені довелося оновити версію Node до v10.17.0 і видалити невикористані плагіни почали працювати (Використовуючи синю тему
Ionic

5

Деякі ваші бібліотеки мають використовувати

com.android.support:support-v4:+

Знайдіть, з ким, що є

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

І додайте цю бібліотеку як модуль, якщо вона не використовує певну версію в своєму останньому оновлення (також підніміть проблему в цій бібліотеці!;))

Дякуємо @avmatte!

РЕДАКТУВАННЯ: Ви також можете запросити gradle, щоб примусити версію бібліотеки

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

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

4

У мене була вчора така ж проблема в непритомності. Він розпочався випадковим чином, але з читання навколо, схоже, це стосується оновлення, як згадував вище @ cpro90. Однак я спробував і не зміг знайти, де зробити необхідні ручні зміни.

Врешті-решт я виявив, що проблема була викликана моїм плагіном cordova-plugin-crosswalk-webview. Сьогодні вранці на GitHub я виявив проблему щодо репрограму плагіну, і до обіду було понад 520 переглядів.

@UNUMObile запропонував у build.gradleфайлі наступне, щоб застосувати попередню версію в усьому світі:

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

Це працювало негайно для мене і може допомогти іншим плагінам, які також мали свою залежність від 'com.android.support:support-4:<28. Нова версія 28, здається, є проблемою.

Я сподіваюся, що це допоможе комусь рухатися вперед.


4

Кілька порад для розробника Kotlin:

Якщо ви дотримуєтесь цих відповідей тут, ви впевнені, що support-v4у вашому проекті немає бібліотеки, але ви все ще бачите цю помилку, перегляньте ktxбібліотеку.

Я просто 1.0.0-alpha1зрозумів , що я використовую останню версію для бібліотеки ktx, і ця помилка виявляється; після того як я перейшов на версію 0.3, зараз все повернулося до нормального.


Не вдалося вирішити: androidx.fragment: fragment-ktx: 0.3, коли я переходжу на "1.0.0-alpha1", трапляється така ж проблема.
Махмуд Алі

@MahmoodAli погляньте на інші залежності? Я просто розміщую свою ситуацію, і Google може також інший пакет зробити те саме неправильним.
Антонієф

@MahmoodAli дякую за посилання, але я думаю, що більшість проектів починають використовувати ktx lib до того, як андроїд буде оголошено в цьому році в Google IO. Важко уникнути змішування ktx з бібліотекою підтримки ... можливо, міграція до androidx має стати остаточним рішенням для такого винятку.
Антонієф

4

Додайте наступні рядки до своїх платформ / android / build.gradle

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

якщо все-таки виникають проблеми, спробуйте виконати цю команду:

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

3

У build.gradleфайл додайте

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

І у вашому project.propertiesфайлі змініть cordova.system.library.3на cordova.system.library.3=com.android.support:support-v13:27.+.


2

Для користувачів Phonegap Build , як в коментарі згадується @catu, ви можете спробувати цей плагін, метою якого є запобігання збоїв у збірці, викликаних включенням різних версій бібліотек підтримки .


1

Просто виправте цю проблему, додавши наступні рядки коду у файл платформ / android / app / build.gradle, відразу після блоку buildscript {}:

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

1

У мене була така ж проблема після встановлення плагіна cordova-plugin-file-opener2. Це відновлено після виконання: Варіант 1: Встановити модуль cordova-android-support-gradle-release. додаток cordova додайте cordova-android-support-gradle-release --fetch


0

Ще один підхід з тим же рішенням - створити гачок. Він стійкий (після перевстановлення платформи), ви можете зробити це і не потребувати повторного додавання платформи.

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

Запустити гак у конфіг

% project% \ config.xml

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

Встановіть залежність fs до свого проекту:

npm i fs - зберегти-розробити

Виконати збірку:

cordova build android


0

СУПЕР простий і правильний спосіб його вирішення!

Просто оновіть sdk та додайте останню 2 версію Android ... та перезавантажте комп'ютер! Готово ...

Зараз у нас є час поговорити про машини та спорт ...


0

У мене була така ж проблема, і жодне із наведених рішень не працювало на мене. Встановлення останньої версії Android SDK Build-інструментів (27.0.3) вирішило мою проблему.


0

Посилання на рішення

Це пов’язано з плагіном compat. Видаліть цей плагін, якщо у вас є старша версія (менше 1.2.0 ) та встановіть cordova-android@6.3.0

cordova plugin rm cordova-plugin-compat --force

додаток cordova додайте cordova-plugin-compat@1.2.0

cordova платформа rm android

іонна кордова платформа додати android@6.3.0

Працюючи над моєю справою. Дякую :)


0

оновлення відповіді @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 в кореневій реж

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

0

Я зіткнувся з цим питанням з рідною реакцією, і це було викликано наступними рядками в моєму android/app/build.gradle:

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

тощо ...

Мабуть, це + вирішило до нової версії 17.0.0, яка зламала мою збірку.
Зміна + на 16.0.0 (або 16.0.1 для бази даних play-services) вирішила мою проблему


0

Ця проблема вбивала мене протягом тижня.

Зрештою я закінчився android@6.4.0

Я змінив android/project.properties, змінивши

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

Ця зміна нарешті вивела мене з ями темряви повідомлення про помилку ttcIndex.

Тоді я отримав цю помилку

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

Помилка, мабуть, пов’язана з проблемою версії Java. Потім я змінив android/build.gradleнаступною зміною

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

Також зауважте, у мене cordova-android-support-gradle-releaseвстановлений плагін, але поняття не маю, чи потрібен він.


-1

Це повторюваний запис у values.xml у папці під назвою support-compat-28.0.0-alpha1.aar.

Цей файл ви знайдете в Windows за адресою \users\YOURUSERID\.gradle\caches\transforms-1\files-1.1

Опинившись у цій папці, ви повинні пройти кілька рівнів глибше значення.xml .

У цьому файлі знайдіть елемент <declare-styleable name="FontFamilyFont>.

У цьому елементі видаліть ЧЕТВЕРІ рядки, що містяться android:в ньому

Після внесення змін я можу створити знову без помилок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.