运行“cordova build android” - 无法找到属性android:fontVariationSettings和android:ttcIndex

问题描述 投票:96回答:24

当我运行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"

我该如何解决这个问题?

android cordova gradle
24个回答
103
投票

只需在build-extras.gradle中添加以下内容即可

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

4
投票

你的一些图书馆应该使用

com.android.support:support-v4:+

找到哪一个,用

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

如果该库未在其最新更新中使用特定版本,则将该库添加为模块(同时在该库中引发问题!;))

感谢@avmatte!


4
投票

我昨天也遇到了同样的问题。它是随机开始的,但从阅读开始,看起来它与@ 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似乎是个问题。

我希望这能帮助某些人前进。


4
投票

给Kotlin开发者一些提示:

如果您在这里遵循这些答案,您确定您的项目中没有support-v4库,但您仍然看到此错误,请查看ktx库。

我只是弄清楚我正在使用最新的1.0.0-alpha1版本的ktx库,这个错误显示出来;在我改回版本0.3后,现在一切恢复正常。


4
投票

将以下行添加到您的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

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,您可以尝试使用qazxsw poi,其目的是防止因包含不同版本的支持库而导致的构建失败。


1
投票

只需在builds脚本{}块之后将以下代码行放在platforms / android / app / build.gradle文件中即可解决此问题:

this plugin

1
投票

我在安装cordova-plugin-file-opener2插件后遇到了同样的问题。它在执行之后恢复:选项1:安装cordova-android-support-gradle-release插件。 cordova插件添加cordova-android-support-gradle-release --fetch


0
投票

使用相同解决方案的另一种方法是创建钩子。它是持久的(在平台重新安装之后),你可以提交它,它不需要重新添加平台。

%项目%\脚本\机器人\ 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


0
投票

解决它的超级简单和正确的方法!

只需更新sdk并添加最新的2版android ...并重新启动计算机!完成...

现在我们有时间谈论汽车和运动......


78
投票

谷歌发布了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:未处理的承诺拒绝”


0
投票

我遇到了同样的问题,并且没有一个给定的解决方案适合我。安装最新版本的Android SDK Build-tools(27.0.3)解决了我的问题。


0
投票

... <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]

在我的案子工作。谢谢 :)


0
投票

更新@Brad Pitcher的回答:

Solution link

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

0
投票

如果您正在使用离子并且出现此错误,请通过执行以下操作解决此问题:

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

这可能是一种可能的解决方案


-1
投票

它是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>的四行。

在我做出改变后,我可以再次构建而不会出错。


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 androidionic cordova platform add android。希望它有所帮助,至少对于发展而言。


26
投票

我刚刚通过访问platform / android文件夹并编辑了project.properties文件并用com.android.support:support-v4:+替换了com.android.support:support-v4:27.1.0来修复此问题。


21
投票

如果您真的需要快速修复该问题以使您的构建运行,您可以尝试将以下行添加到您的platforms / android / build.gradle文件中:

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

无论如何,在这里设置版本不是一个可持续的修复。


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'插件而发生的。


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:+的plugin目录中进行了完整的研究,并将其替换为静态版本代码。

对我来说,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平台,它将使用固定支持库。

© www.soinside.com 2019 - 2024. All rights reserved.