Запуск «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"

Как я могу исправить эту проблему?

Стефан Падовани
источник
Эта проблема возникает и со мной весь день. Я сузил его до плагина, который использую. Однако мне нужен этот плагин для моих приложений. Какой плагин вы используете?
Chris R
@ChrisRitten Привет, я завершил пост со списком плагинов. С уважением.
Стефан Падовани
1
ни один из ответов не помогает, борюсь с этим в течение дня.
хусрав
Если это может помочь freakyjolly.com/…
Code Spy

Ответы:

106

Просто введите следующее в build-extras.gradle

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:27.1.0'
    }
}
Helmson Helmson
источник
Спасибо! Это разумный подход для Кордовы, чтобы привязать к версии.
Hozuki
10
Я держу папку с моей платформой вне системы контроля версий, поэтому для этого я создал build-extras.gradleв корневом hooks\after_platform_add каталоге
cbedrosian
8
у меня нет такого файла: "build-extras.gradle"
Джо Слейман
3
Для других пользователей phonegap-build. Ответ: cordova-android-support-gradle-release forum.adobe.com/thread/2462835
catu 09
7
В дополнение к комментарию @ StéphanePadovani обратите внимание, что он должен быть создан в папке / platform / android / app из Cordova Android 7.0.0
Will Kru
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. Если вы не хотите использовать плагин по какой-либо причине или почему-то не работает для вас, вместо этого создайте перехватчик и каждый раз перезаписывайте файл. Отметьте 2-й комментарий здесь .

Если проблема не исчезнет, ​​вы можете попробовать:

cordova platform rm android
cordova platform add android

ИЛИ

Убедитесь, что на тестируемом устройстве не установлена предыдущая версия приложения, поскольку при попытке понизить существующую версию вы получите неоднозначную ошибку: «INSTALL_FAILED_VERSION_DOWNGRADE» и «UnhandledPromiseRejectionWarning: необработанное отклонение обещания»

Андрей Радулеску
источник
2
Лучший ответ. Установка плагина - лучшее и простое решение этой проблемы. Он автоматически устраняет ошибку после добавления плагина. Просто. Нет необходимости возиться с созданием файлов в папке платформы, которые необходимо отслеживать вручную в случае удаления и добавления платформ.
Neel
Вариант 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

Я только что исправил эту проблему, перейдя в папку platform / android и отредактировав project.propertiesфайл) и заменив его com.android.support:support-v4:+на com.android.support:support-v4:27.1.0.

Ахмед
источник
21

Если вам действительно нужно быстро исправить эту проблему, чтобы запустить сборку, вы можете попробовать добавить следующие строки в свой файл platform / android / build.gradle:

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

Во всяком случае, установка версии здесь не является устойчивым решением.

Стю
источник
хороший. это сделало это для меня, но да, я думаю, это будет потеряно, если я удалю и добавлю платформу или установлю на новую машину.
Gurnard
Пришлось поместить это в / platform / android / app; как вы говорите, это неустойчиво
user542319 01
@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

У меня такая же ошибка, но не в сборке кордовы. Новая версия 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.

cpro90
источник
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

Бегать:

платформа ionic cordova добавить android@8.0.0

Бегать:

плагин ionic cordova добавить cordova-plugin-androidx

Бегать:

Плагин ionic cordova добавить адаптер Cordova-plugin-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приложении. Спасибо!
Sampath
с использованием ionic 3: это помогло мне решить эту проблему, но теперь возникла другая проблема * Что пошло не так: сбой выполнения для задачи ': app: compileDebugJavaWithJavac'. > Сбой компиляции; подробности см. в выводе ошибок компилятора.
Прем Санил,
1
@PremSanil Не уверен, что это вызывает вашу проблему, но убедитесь, что вы скачали инструменты сборки 28.0.3 в Android Studio SDK Manager.
alpere
@alpere Мне пришлось обновить версию Node до v10.17.0 и удалить неиспользуемые плагины, начали работать (с использованием синей темы Ionic 3)
Прем Санил
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 может также заставить другой пакет сделать то же самое.
Anthonyeef
@MahmoodAli благодарит за ссылку, но я думаю, что большая часть проекта начинает использовать ktx lib до того, как androidx будет объявлен в Google IO в этом году. Трудно избежать смешивания ktx с библиотекой поддержки ... возможно, переход на androidx должен быть окончательным решением для такого рода исключений.
Anthonyeef
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 упомянул в комментарии, вы можете попробовать этот плагин, целью которого является предотвращение сбоев сборки, вызванных включением разных версий поддерживающих библиотек .

user276648
источник
1

Просто исправьте эту проблему, поместив следующие строки кода в файл platform / 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

Другой подход с таким же решением - создать крючок. Он постоянный (после переустановки платформы), вы можете зафиксировать его, и повторное добавление платформы не требуется.

% проект% \ 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');
  }
};

Хук инициализации в конфигурации

% проект% \ config.xml

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

Установите зависимость fs в свой проект:

npm я fs --save-dev

Запускаем сборку:

Кордова сборка Android

павелеты
источник
0

СУПЕР ПРОСТОЙ И ПРАВИЛЬНЫЙ СПОСОБ РЕШЕНИЯ!

Просто обновите sdk и добавьте последнюю 2 версию android ... и перезагрузите компьютер! Готово...

Теперь у нас есть время поговорить об автомобилях и спорте ...

Ари Вайсберг
источник
0

У меня была такая же проблема, и ни одно из приведенных решений не помогло мне. Установка последней версии Android SDK Build-tools (27.0.3) решила мою проблему.

Дэниел В.
источник
0

Ссылка на решение

Это связано с плагином compat. Удалите этот плагин, если у вас более старая версия (менее 1.2.0 ), и установите cordova-android@6.3.0

плагин cordova rm cordova-plugin-compat --force

плагин cordova добавить cordova-plugin-compat@1.2.0

Кордова платформа rm android

платформа ionic cordova добавить 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'
  }
}
Exlord
источник
0

Я столкнулся с этой проблемой с помощью response native, и это было вызвано следующими строками в моем 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-base) решило мою проблему

Ури Клар
источник
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

Оказавшись внутри этой папки, вам нужно пройти на несколько уровней глубже до values.xml .

В этом файле найдите элемент <declare-styleable name="FontFamilyFont>.

В этом элементе удалите ЧЕТЫРЕ строки с android:.

После того, как я внес это изменение, я могу снова построить без ошибок.

Хенк Келдер
источник