【问题标题】:Running "cordova build android" - unable to find attribute android:fontVariationSettings and android:ttcIndex运行“cordova build android”-找不到属性 android:fontVariationSettings 和 android:ttcIndex
【发布时间】:2018-03-07 22:50:59
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

  • 这个问题也一直在我身上发生。我已将其缩小到我使用的插件。但是我的应用程序需要这个插件。你用的是什么插件?
  • @ChrisRitten 嗨,我已经完成了上面的插件列表。问候。
  • 没有答案帮助,现在为此苦苦挣扎了一天。

标签: android cordova gradle


【解决方案1】:

只需将以下内容放入 build-extras.gradle

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

【讨论】:

  • 谢谢!这是 Cordova 固定到版本的合理方法。
  • 我将我的平台文件夹置于源代码管理之外,因此为了实现这一点,我在项目根目录中创建了 build-extras.gradle 添加代码以将其复制到 hooks\after_platform_add gist.github.com/charlesbedrosian/…
  • 我没有这样的文件:"build-extras.gradle"
  • 对于 phonegap-build 的其他用户。答案是cordova-android-support-gradle-release forums.adobe.com/thread/2462835
  • 除了@StéphanePadovani 的评论,请注意它应该在 Cordova Android 7.0.0 的 /platforms/android/app 文件夹中创建
【解决方案2】:

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

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

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

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

阅读文档以获取全套选项:Readme

选项 2: 在 platforms/android

下的 build.gradle 中添加下一个代码 sn-p
/** 
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:未处理的承诺拒绝”

【讨论】:

  • 最佳答案。安装插件是最好和最简单的解决方案。添加插件后,它会自动解决错误。简单的。无需在平台文件夹中创建文件,在删除和添加平台时需要手动跟踪。
  • 选项 1 对我有用。 Cordova 以非严格的方式定义它们的依赖关系非常令人沮丧。我不知道他们为什么这样做。几周前我的项目处于工作状态,回来重新编译一个调试版本,突然出现错误。
  • 无法通过注册表获取插件cordova-android-support-gradle-release
  • @netshark1000 此问题与插件无关,而与您的 package.json 或某些项目配置有关。查看 package.json 并确保该插件尚未安装。如果存在,只需调用 ionic cordova 准备重新加载它。如果问题是持续删除平台,插件文件夹并重新添加平台。这应该可以解决问题。
  • 完美,#1 救了我
【解决方案3】:

同样的错误发生在我身上。显然,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 解决方案,请检查一下。
  • 不适合我,我也是这样做的,但是当我重新添加 android 平台时,即使我将其删除到 27.1.0,版本也会返回到 v4:24.1.1+
  • 我有这个错误:找不到 com.android.support:support-v4:27.1.0。
【解决方案4】:

我刚刚解决了这个问题,方法是转到 platform/android 文件夹并编辑 project.properties) 文件并将 com.android.support:support-v4:+ 替换为 com.android.support:support-v4:27.1.0

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

    • 不错的一个。这是为我做的,但是我想如果我删除并添加平台或安装在新机器上,这将会丢失。
    • 必须把它放在 /platforms/android/app ;正如你所说,它不可持续
    • @stu 你没有在你的回答中告诉我应该把这段代码放在哪里?
    【解决方案6】:

    这很奇怪,但是当我添加以下具有相同版本的行时它可以工作。

    这是我在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,但我尝试了以前的解决方案无济于事
    【解决方案7】:

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

    运行:

    ionic cordova 平台 rm android

    运行:

    ionic cordova 平台添加 android@8.0.0

    运行:

    ionic cordova 插件添加 cordova-plugin-androidx

    运行:

    ionic 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 应用程序的解决方案。谢谢!
    • 使用 ionic 3:这帮助我解决了这个问题,但现在又遇到了另一个问题 * 出了什么问题:任务 ':app:compileDebugJavaWithJavac' 执行失败。 > 编译失败;有关详细信息,请参阅编译器错误输出。
    • @PremSanil 不确定这是否会导致您的问题,但请确保您已在 Android Studio 的 SDK 管理器中下载了构建工具 28.0.3。
    • @alpere 我必须将 Node 版本更新到 v10.17.0 并删除未使用的插件开始工作(使用 Ionic 3 蓝色主题)
    【解决方案8】:

    我有同样的错误,但在 cordova build 中没有。 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}'
            ...
        }
    }
    

    以上代码强制依赖版本。

    【讨论】:

      【解决方案9】:

      我遇到了同样的错误。对 com.android.support:support-v4:+ 的插件目录进行了全面研究,并将其替换为静态版本代码。

      对我来说,com.android.support:support-v4:23.4.0 工作得很好。那时不需要删除和重新添加android平台。

      【讨论】:

        【解决方案10】:

        这里有一个简单的修复方法,当平台目录被重建时它会持续存在,并且不需要通过所有的插件来尝试找到罪魁祸首。使用以下内容创建文件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 &lt;platform name="android"&gt; &lt;hook src="hooks/copy_build_extras.js" type="before_build" /&gt; &lt;/platform&gt;
        • ok 已测试,您的代码似乎无效 process.argv[2] 对我来说是 build
        • 对不起@Exlord 我想它需要一些调整才能使用新样式的钩子,但我目前正在使用这个带有子目录钩子的确切代码,它工作得很好。
        【解决方案11】:

        将以下行添加到您的平台/android/build.gradle

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

        如果仍有问题,请尝试运行此命令:

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

        【讨论】:

          【解决方案12】:

          您的一些库应该正在使用

          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"
              }
          }
          

          【讨论】:

            【解决方案13】:

            我昨天突然遇到了同样的问题。它是随机开始的,但从四处阅读来看,它似乎与@cpro90 上面提到的更新有关。但是,我尝试了但找不到在哪里进行必要的手动更改。

            最终我发现问题是由我的 cordova-plugin-crosswalk-webview 插件引起的。在 GitHub 上,我今天早上在插件 repro 上找到了the issue,到午餐时它的浏览量已超过 520 次。

            @UNUMObile 在build.gradle 文件中建议以下内容以强制全局使用较早版本:

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

            这对我来说立竿见影,并且可以帮助其他人使用其他插件,这些插件也依赖于 'com.android.support:support-4:

            我希望这可以帮助某人前进。

            【讨论】:

              【解决方案14】:

              给 Kotlin 开发者的一些提示:

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

              我刚刚发现我正在为 ktx 库使用最新的 1.0.0-alpha1 版本,并且出现了这个错误;在我改回版本0.3后,现在一切都恢复正常了。

              【讨论】:

              • 无法解决:androidx.fragment:fragment-ktx:0.3 ,当我更改为 '1.0.0-alpha1' 时会发生同样的问题。
              • @MahmoodAli 看看其他依赖项?我只是发布我的情况,Google 也可能让其他包也犯了同样的错误。
              • @MahmoodAli 感谢提供链接,但我认为大多数项目在今年的 Google IO 中宣布 androidx 之前就开始使用 ktx lib。很难避免将 ktx 与支持库混合在一起......也许迁移到 androidx 应该是这种异常的最终解决方案。
              【解决方案15】:

              在您的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.+

              【讨论】:

                【解决方案16】:

                对于 Phonegap Build 用户,正如@catu 在评论中提到的,您可以尝试this plugin,其目的是防止由于包含不同版本的支持库而导致构建失败 em>。

                【讨论】:

                  【解决方案17】:

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

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

                  【讨论】:

                    【解决方案18】:

                    安装 cordova-plugin-file-opener2 插件后我遇到了同样的问题。这样做后它解决了: 选项 1:安装 cordova-android-support-gradle-release 插件。 cordova 插件添加 cordova-android-support-gradle-release --fetch

                    【讨论】:

                      【解决方案19】:

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

                      %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

                      运行构建:

                      cordova 构建安卓

                      【讨论】:

                        【解决方案20】:

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

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

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

                        【讨论】:

                          【解决方案21】:

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

                          【讨论】:

                            【解决方案22】:

                            Solution link

                            这是由于兼容插件。 如果您有旧版本(低于 1.2.0)并设置 cordova-android@6.3.0

                            ,请删除该插件

                            cordova 插件 rm cordova-plugin-compat --force

                            cordova 插件添加 cordova-plugin-compat@1.2.0

                            cordova 平台 rm android

                            ionic cordova 平台添加android@6.3.0

                            为我工作。谢谢:)

                            【讨论】:

                              【解决方案23】:

                              @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'
                                }
                              }
                              

                              【讨论】:

                                【解决方案24】:

                                我在使用 react 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(或 play-services-base 的 16.0.1)解决了我的问题

                                【讨论】:

                                  【解决方案25】:

                                  这个问题困扰了我一个星期。

                                  最终我选择了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 插件,但不知道是否需要它。

                                  【讨论】:

                                    【解决方案26】:

                                    它是 values.xml 中名为 support-compat-28.0.0-alpha1.aar 的文件夹中的重复条目。

                                    您可以在 Windows 上的\users\YOURUSERID\.gradle\caches\transforms-1\files-1.1找到此文件

                                    进入该文件夹后,您必须更深入地了解 values.xml

                                    在该文件中,搜索元素 &lt;declare-styleable name="FontFamilyFont&gt;

                                    在该元素中,删除其中包含 android: 的四行。

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

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2019-12-02
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2016-10-23
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多