运行“ 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"

我该如何解决这个问题?


我也整天都在发生这个问题。我将其范围缩小到我使用的插件。但是,我的应用程序需要此插件。您正在使用什么插件?
克里斯·R

@ChrisRitten嗨,我已经完成了上面带有插件列表的帖子。问候。
斯特凡·帕多瓦尼

1
答案都无济于事,现在已经为此奋斗了一天。
khusrav '18年

如果这可以帮助freakyjolly.com/...
代码间谍

Answers:


106

只需关注以下内容 build-extras.gradle中

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

谢谢!这是Cordova固定到版本的一种合理方法。
Hozuki

10
我把我的平台,所以为了完成这个文件夹的源代码控制的了,我创建build-extras.gradle的代码添加到它在复制我的项目的根hooks\after_platform_add gist.github.com/charlesbedrosian/...
cbedrosian

8
我没有这样的文件:“ build-extras.gradle”
Joe

3
对于phonegap-build的其他用户。答案是科尔多瓦- Android的支持,gradle这个释放 forums.adobe.com/thread/2462835
卡图

7
除了@StéphanePadovani的评论之外,请注意,它应该在Cordova Android 7.0.0的/ platforms / android / app文件夹中创建
Will Kru

83

Google发布了com.android.support:support-v4的新版本28.0.0-alpha1,其中添加了2个新属性(android:fontVariationSettings和android:ttcIndex)。一些插件正在使用最新的android-support库,这会导致不必要的不​​兼容性。

选项1: 安装cordova-android-support-gradle-release插件。

记录良好的插件,“将其他插件指定的Android支持库的各种版本与特定版本对齐”。经过测试,没有任何破坏性行为。

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

阅读文档以获取全套选项:自述文件

选项2:在platform / 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中的代码将被覆盖。如果您由于某种原因不想使用该插件或因某种原因无法使用插件,请创建一个钩子,并每次覆盖该文件。在此处检查第二条评论。

如果问题仍然存在,您可以尝试:

cordova platform rm android
cordova platform add android

要么

确保您没有在测试的设备上安装该应用程序先前版本,因为在尝试降级现有版本时会收到一个模棱两可的错误:“ INSTALL_FAILED_VERSION_DOWNGRADE”和“ UnhandledPromiseRejectionWarning:未处理的承诺被拒绝”


2
最佳答案。安装插件是解决此问题的最佳且简便的方法。添加插件后,它将自动解决错误。简单。无需在平台文件夹中创建文件,而在删除和添加平台时需要手动跟踪这些文件。
Neel

选项1对我有用。科尔多瓦以非严格的方式定义其依赖关系非常令人沮丧。我不知道他们为什么这样做。几周前,我的项目仍处于工作状态,请回到项目重新编译调试版本,然后突然出现错误。
诺曼·布劳

无法通过注册表获取插件cordova-android-support-gradle-release
netshark1000,18年

@ netshark1000此问题与插件无关,但与您的package.json或某些项目配置有关。查看package.json并确保尚未安装插件。如果存在,只需致电离子科尔多瓦准备重新加载它。如果问题仍然存在,请删除平台,然后插入plugins文件夹,然后重新添加平台。这应该可以解决问题。
安德鲁·拉杜列斯库

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


非常感谢,在我这一边,我在android平台目录中更改了插件的gradle文件。请从@avmatte解决方案中检查是否无效。
Sandun Priyanka,

对我不起作用,我做同样的事情,但是当我重新添加android平台时,即使将其删除到27.1.0,版本也返回到v4:24.1.1+
Joe

我有此错误:找不到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

如果您真的只需要快速解决此问题以使构建运行,则可以尝试将以下几行添加到platform / android / build.gradle文件中:

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

无论如何,在此处设置版本不是可持续的解决方案。


好一个。这是为我完成的,但是是的,如果我删除并添加平台或在新计算机上安装,这会丢失。
古纳德

不得不把它放在/ platforms / android / app中;正如您所说的那样,它不可持续
user542319 '18

@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,但我还是尝试了先前的解决方案,但无济于事
Nico

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

OK测试,你的代码似乎是无效的process.argv[2]build我!
6

抱歉,@ Exlord我想需要对它进行一些调整才能使用新样式的钩子,但是我现在将此确切的代码与子目录钩子一起使用,并且效果很好。
布莱德·皮彻

8

我在Ionic论坛上找到了该解决方案,这是唯一对我有用的解决方案:

跑:

离子科尔多瓦平台rm android

跑:

离子Cordova平台添加android@8.0.0

跑:

离子Cordova插件添加cordova-plugin-androidx

跑:

离子Cordova插件添加cordova-plugin-androidx-adapter

确保您的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'的执行失败。>编译失败;有关详细信息,请参见编译器错误输出。
Prem Sanil

1
@PremSanil不确定这是否引起您的问题,但请确保已在Android Studio的SDK Manager中下载了构建工具28.0.3。
alpere

@alpere我必须将Node版本更新到v10.17.0,并删除了未使用的插件开始工作(使用Ionic 3蓝色主题)
Prem Sanil

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上,我今天早上在插件repro上发现了这个问题,午餐时有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 '18年

@MahmoodAli感谢您的链接,但是我认为大多数项目在今年Google IO宣布androidx之前就开始使用ktx lib。很难避免将ktx与支持库混合使用……也许迁移到androidx应该是此类异常的最终解决方案。
Anthonyeef '18年

4

将以下行添加到您的platform / 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.3cordova.system.library.3=com.android.support:support-v13:27.+


2

对于Phonegap Build用户,如@catu在评论中提到的,您可以尝试使用此插件,目的是防止由于包含不同版本的支持库而导致的构建失败


1

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

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

配置中的初始化钩子

%project%\ config.xml

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

将fs依赖项安装到您的项目:

npm i 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

离子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'
  }
}

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(或基于play-services的16.0.1)解决了我的问题


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:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.