当我运行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'
}
}
你的一些图书馆应该使用
com.android.support:support-v4:+
找到哪一个,用
gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath
如果该库未在其最新更新中使用特定版本,则将该库添加为模块(同时在该库中引发问题!;))
感谢@avmatte!
我昨天也遇到了同样的问题。它是随机开始的,但从阅读开始,看起来它与@ cpro90上面提到的更新有关。但是,我试过并找不到在哪里进行必要的手动更改。
最后我发现问题是由我的cordova-plugin-crosswalk-webview插件引起的。在GitHub上,我今天早上在插件上找到了the issue,午餐时它有超过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
后,现在一切恢复正常。
将以下行添加到您的platforms / 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,您可以尝试使用qazxsw poi,其目的是防止因包含不同版本的支持库而导致的构建失败。
只需在builds脚本{}块之后将以下代码行放在platforms / android / app / build.gradle文件中即可解决此问题:
this plugin
我在安装cordova-plugin-file-opener2插件后遇到了同样的问题。它在执行之后恢复:选项1:安装cordova-android-support-gradle-release插件。 cordova插件添加cordova-android-support-gradle-release --fetch
使用相同解决方案的另一种方法是创建钩子。它是持久的(在平台重新安装之后),你可以提交它,它不需要重新添加平台。
%项目%\脚本\机器人\ Android的支持,version.js
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:27.1.0'
}
}
配置中的Init挂钩
%项目%\ config.xml中
#!/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');
}
};
将fs依赖项安装到您的项目:
npm和fs --save-dev
运行构建:
cordova构建android
解决它的超级简单和正确的方法!
只需更新sdk并添加最新的2版android ...并重新启动计算机!完成...
现在我们有时间谈论汽车和运动......
谷歌发布了com.android.support:support-v4的新版本28.0.0-alpha1,它增加了2个新属性(android:fontVariationSettings和android:ttcIndex)。一些插件使用最新的android支持库,导致不必要的兼容性。
选项1:安装cordova-android-support-gradle-release插件。
记录良好的插件,“将其他插件指定的Android支持库的各种版本与特定版本对齐”。测试时没有任何破坏性行为。
cordova plugin add cordova-android-support-gradle-release --fetch
阅读文档以获取一整套选项:Readme
选项2:在platforms / android下的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'
}
警告:如果删除/添加Android平台,build.gradle中的代码将被覆盖。如果您由于某种原因不想使用该插件或以某种方式不适合您,而是每次都创建一个钩子并覆盖该文件。检查第二条评论here。
如果问题持续存在,您可以尝试:
cordova platform rm android
cordova platform add android
要么
确保您在测试的设备上没有安装以前版本的应用程序,因为在尝试降级现有版本时会收到模糊错误:“INSTALL_FAILED_VERSION_DOWNGRADE”和“UnhandledPromiseRejectionWarning:未处理的承诺拒绝”
我遇到了同样的问题,并且没有一个给定的解决方案适合我。安装最新版本的Android SDK Build-tools(27.0.3)解决了我的问题。
...
<platform name="android">
<hook src="scripts/android/android-support-version.js" type="before_build" />
...
这是由于compat插件。如果您有旧版本(小于1.2.0)并设置[email protected],请删除该插件
cordova插件rm cordova-plugin-compat --force
cordova插件添加[email protected]
cordova平台rm android
离子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
如果您正在使用离子并且出现此错误,请通过执行以下操作解决此问题:
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:27.1.0'
}
}
这可能是一种可能的解决方案
它是values.xml中名为-cordova platform rm android
-cordova platform add android
的文件夹中的重复条目。
你可以在Windows上的support-compat-28.0.0-alpha1.aar
找到这个文件
进入该文件夹后,您必须更深入到values.xml。
在该文件中,搜索元素\users\YOURUSERID\.gradle\caches\transforms-1\files-1.1
。
在该元素中,删除其中包含<declare-styleable name="FontFamilyFont>
的四行。
在我做出改变后,我可以再次构建而不会出错。
同样的错误发生在我身上。显然,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
。希望它有所帮助,至少对于发展而言。
我刚刚通过访问platform / android文件夹并编辑了project.properties
文件并用com.android.support:support-v4:+
替换了com.android.support:support-v4:27.1.0
来修复此问题。
如果您真的需要快速修复该问题以使您的构建运行,您可以尝试将以下行添加到您的platforms / 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'插件而发生的。
我有相同的错误,但没有在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}'
...
}
}
上面的代码强制依赖版本。
我遇到了同样的错误。在com.android.support:support-v4:+的plugin目录中进行了完整的研究,并将其替换为静态版本代码。
对我来说,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平台,它将使用固定支持库。