Ответ 1
Просто поставьте следующее в build-extras.gradle
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:27.1.0'
}
}
Когда я запустил 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"
Как я могу исправить эту проблему?
Просто поставьте следующее в build-extras.gradle
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:27.1.0'
}
}
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 под платформами/андроид
/**
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: отказ от необработанного обещания"
То же самое происходит со мной. По-видимому, была выпущена новая версия библиотеки 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
. Надеюсь, что это поможет, по крайней мере, для развития.
Я только что исправил эту проблему, перейдя в папку платформы /android и отредактировал файл project.properties
) и заменил com.android.support:support-v4:+
на com.android.support:support-v4:27.1.0
.
Если вам действительно нужно быстро исправить эту проблему, чтобы выполнить прогон сборки, вы можете попробовать добавить следующие строки в свой файл platform/android/build.gradle:
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:27.1.0'
}
}
Во всяком случае, установка версии здесь не является устойчивым решением.
Это странно, но он работает, когда я добавляю строки ниже с теми же версиями.
Это мои связанные строки в файле 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'.
У меня такая же ошибка, но не у кордовой сборки. Новая версия 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}'
...
}
}
Выше кода заставляют версию зависимостей.
Я столкнулся с той же ошибкой. Провел полное исследование в каталоге плагинов для com.android.support:support-v4: + и заменил его статическим кодом версии.
Для меня com.android.support:support-v4:23.4.0 работал отлично. Тогда не нужно было удалять и повторно добавлять платформу Android.
Вот простой способ исправить его, который будет сохраняться при восстановлении каталога платформы, и нет необходимости проходить через все ваши плагины, чтобы попытаться найти преступника. Создайте файл 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, и она будет использовать закрепленную библиотеку поддержки.
Некоторые из ваших библиотек должны использовать
com.android.support:support-v4:+
Найдите то, что есть, с
gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath
И добавьте эту библиотеку в качестве модуля, если она не использует в ней последнюю версию (также поднимите проблему в этой библиотеке!))
Благодаря @avmatte!
Вчера у меня была такая же проблема. Это началось случайно, но из-за чтения вокруг, похоже, что это связано с обновлением, как указано выше, с помощью @cpro90. Однако я попытался и не смог найти, где внести необходимые изменения вручную.
В конце концов я обнаружил, что проблема вызвана моим плагином-плагином-перекрестком-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, похоже, проблема.
Я надеюсь, что это поможет кому-то двигаться вперед.
Несколько советов разработчику Kotlin:
Если вы будете следовать этим ответам здесь, вы уверены, что у вас нет библиотеки support-v4
в вашем проекте, но вы все еще видите эту ошибку, пожалуйста, посмотрите библиотеку ktx
.
Я просто выяснил, что я использую последнюю версию 1.0.0-alpha1
для библиотеки ktx, и эта ошибка проявляется; после того, как я вернулся к версии 0.3
, теперь все нормализовалось.
Добавьте следующие строки в ваши платформы /android/build.gradle
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:27.1.0'
}
}
если проблема не устранена, попробуйте выполнить эту команду:
cordova plugin add cordova-android-support-gradle-release --fetch
В вашем 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.+
.
Для пользователей Phonegap Build, как упоминалось в комментарии @catu, вы можете попробовать этот плагин, целью которого является предотвращение сбоев сборки, вызванных включением разных версий библиотек поддержки.
Просто исправьте эту проблему, поместив следующие строки кода в файл platform/android/app/build.gradle сразу после блока buildscript {}:
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:27.1.0'
}
}
У меня была такая же проблема после установки плагина cordova-plugin-file-opener2. Восстановление после выполнения: Вариант 1: Установите плагин cordova-android-support-gradle-release. плагин Cordova добавить Cordova-Android-Support-Gradle-релиз --fetch
Другой подход с таким же решением - создать крючок. Это постоянное (после переустановки платформы), вы можете зафиксировать его, и он не требует повторной добавления платформы.
% проект%\Scripts\Android\андроида-подставок-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
Выполнить сборку:
Кордоба строит андроид
СУПЕР ПРОСТОЙ И ПРАВИЛЬНЫЙ СПОСОБ РЕШЕНИЯ ЭТОГО!
Просто обновите SDK и добавьте последнюю версию Android 2... и перезагрузите компьютер! Готово...
Теперь у нас есть время поговорить об автомобилях и спорте...
У меня была такая же проблема, и ни одно из данных решений не помогло мне. Установка последней версии Android SDK Build-tools (27.0.3) решила мою проблему.
Это связано с плагином Compat. Удалите этот плагин, если у вас более старая версия (менее 1.2.0) и установите [email protected]
кордова плагин рм кордова-плагин-компат --force
Cordova плагин добавить [email protected]
кордова платформа рм андроид
Ионная платформа Cordova добавить [email protected]
Работаю над моим делом. Спасибо :)
обновляет ответ @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
в корневом build-extras.gradle
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:27.1.0'
}
}
Я android/app/build.gradle
с этой проблемой с реагировать родной, и это было вызвано следующими строками в моем 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) решило мою проблему
Я нашел решение на Ionic Forum, которое было единственным решением, которое работало для меня:
Бежать:
ионные кордова платформа рм андроид
Бежать:
Ионная платформа Cordova добавить [email protected]
Бежать:
ионные кордова плагин добавить кордова-плагин-androidx
Бежать:
Ионный Cordova плагин добавить Cordova-плагин-Androidroid-адаптер
Убедитесь, что ваш 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" />
который также обрабатывается в ответе stackoverflow: fooobar.com/questions/17861467/...
Это повторяющаяся запись в 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:
.
После того, как я сделал это изменение, я смогу снова построить без ошибок.
Если вы используете ionic и получаете эту ошибку, устраните ее, выполнив следующие действия:
-cordova platform rm android
-cordova platform add android
Это может быть возможным решением