Running "cordova build android" - unable to find attribute android:fontVariationSettings and android:ttcIndex

AndroidCordovaGradle

Android Problem Overview


When I run cordova build android --buildConfig xxxx --release, I get the following error:

ERROR: In <declare-styleable> FontFamilyFont, unable to find attribute android:fontVariationSettings
ERROR: In <declare-styleable> FontFamilyFont, unable to find attribute android:ttcIndex

The strange thing is I use two macOS machines for the compilation, and I get this error only on one of them for the same code.

Here is the output of ./gradlew cdvPrintProps I get on the two machines:

: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

Below is the list of plugins used:

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

How can I fix this problem?

Android Solutions


Solution 1 - Android

Just put following in build-extras.gradle

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

Solution 2 - Android

Google released the new version 28.0.0-alpha1 of com.android.support:support-v4 which is adding 2 new attributes(android:fontVariationSettings and android:ttcIndex). Some of the plugins are using the latest android-support libraries which results in unwanted incompatibilities.

Option 1: Install cordova-android-support-gradle-release plugin.

Well documented plugin which "aligns various versions of the Android Support libraries specified by other plugins to a specific version". Tested without any destructive behavior.

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

Read the documentation for a full set of options: Readme

Option 2: Add next code snippet in build.gradle under platforms/android

/** 
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'
}

Warning: code in build.gradle will be overwritten if you remove/add the Android platform. If you don't want to use the plugin for some reason or somehow is not working for you, instead create a hook and overwrite the file every time. Check 2nd comment here.

If the problem is persistent you may try:

cordova platform rm android
cordova platform add android

OR

Make sure you don't have a previous version of the app installed on the device you test because you'll receive an ambiguous error when it tries to downgrade the existing version: "INSTALL_FAILED_VERSION_DOWNGRADE" and "UnhandledPromiseRejectionWarning: Unhandled promise rejection"

Solution 3 - Android

The same error is happening to me. Apparently, a new version of the com.android.support:support-v4 library was released, and the plugin I'm using defines com.android.support:support-v4:+ as dependency in plugin.xml. The + sign means that it will get the latest version (28.0.0), which seems seems to be incompatible with other plugins.

I was able to build a development version by changing all the plugin dependencies from com.android.support:support-v4:+ to com.android.support:support-v4:27.1.0. Also, I executed ionic cordova platform remove android and ionic cordova platform add android. Hope it helps, at least for development.

Solution 4 - Android

I have just fixed this issue by going to the platform/android folder and edited the project.properties) file and replaced com.android.support:support-v4:+ with com.android.support:support-v4:27.1.0.

Solution 5 - Android

If you really just need a quick fix on that issue to make your build run, you may try adding the following lines into your platforms/android/build.gradle file:

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

Anyhow, setting the version here is not a sustainable fix.

Solution 6 - Android

It's strange, but it works when I add the below lines with the same versions.

This is my related lines in the platforms/android/build.gradle file:

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

In my project, the problem was occurred because of the 'cordova-plugin-crosswalk-webview' plugin.

Solution 7 - Android

I found the solution on Ionic Forum, which was the only solution that worked for me:

Run:

ionic cordova platform rm android

Run:

ionic cordova platform add [email protected]

Run:

ionic cordova plugin add cordova-plugin-androidx

Run:

ionic cordova plugin add cordova-plugin-androidx-adapter

Make sure your gradle.properties has:

cdvMinSdkVersion=19

Make sure your build.gradle has:

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 }

Make sure your config.xml has:

<preference name="android-minSdkVersion" value="19" />

from: https://forum.ionicframework.com/t/firebase-app-unable-to-compile-on-android-with-aapt-error/166564/7

which is also handled in the stackoverflow answer: https://stackoverflow.com/a/56656680/839691

Solution 8 - Android

I have the same error but not in cordova build. A new version of the com.android.support:appcompat-v7 and dependencies.But the incompatible version is in the third package that dependent on com.android.support:appcompat-v7.So i can't fixed the third package with @avmatte's solution.

Use @Sai Teja's solution to find incompatible package:

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

Then fixed it with:

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

Above code force the dependencies version.

Solution 9 - Android

I was facing the same error. Did a complete research in the plugin-directory for com.android.support:support-v4:+ and replaced it with a static version code.

For me, com.android.support:support-v4:23.4.0 worked just fine. There was no need to remove and re-add the android platform then.

Solution 10 - Android

Here's an easy way to fix it that will persist when the platform directory is rebuilt and there's no need to go through all your plugins to try and find a culprit. Create a file build-extras.gradle with these contents:

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

Then create the file after_platform_add/010_copy_build_extras.js with the following contents:

#!/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}`));
}

Now recreate the android platform and it will use the pinned support library.

Solution 11 - Android

Some of your libraries should be using

com.android.support:support-v4:+

Find which one that is, with

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

And add that library as a module if it is not using a specific version in it's latest update (Also raise an issue in that library! ;) )

Thanks to @avmatte!

EDIT: You can also request gradle to force the library version

ext {
    supportVersion {latest_version_here}
} // In root project.gradle

configurations.all {
    resolutionStrategy {
        force "com.android.support:support-v4:$supportVersion"
    }
}

Solution 12 - Android

Add the following lines to your platforms/android/build.gradle

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

if still having issue try running this command:

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

Solution 13 - Android

I was having the same problem out of the blue yesterday. It started randomly, but from reading around, it looks like it is to do with an update as mentioned above by @cpro90. However, I tried and could not find where to make the necessary manual change.

Eventually I identified that the problem was being caused by my cordova-plugin-crosswalk-webview plugin. On GitHub, I found the issue on the plugin repro this morning, and it had over 520 views by lunch.

@UNUMObile suggested the following in the build.gradle file to force an earlier version globally:

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

This worked immediately for me and may help others with other plugins that also have had their dependency on 'com.android.support:support-4:<28. The new version 28 seems to be the issue.

I hope this helps someone move forward.

Solution 14 - Android

Just some tips for Kotlin developer:

If you follow these answers here, you are sure you don't have support-v4 library in your project but you are still seeing this error, please take a look at the ktx library.

I just figure out that I am using the latest 1.0.0-alpha1 version for ktx library and this error show out; after I changed back to version 0.3, everything back to normal now.

Solution 15 - Android

In your build.gradle file add

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

And in your project.properties file change cordova.system.library.3 to cordova.system.library.3=com.android.support:support-v13:27.+.

Solution 16 - Android

For Phonegap Build users, as @catu mentionned in a comment, you can try this plugin which purpose is to prevent build failures caused by including different versions of the support libraries.

Solution 17 - Android

Just fix this issue by putting following lines of code in platforms/android/app/build.gradle file, just after buildscript {} block:

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

Solution 18 - Android

I had same problem after installing the cordova-plugin-file-opener2 plugin. It resoved after doing: Option 1: Install cordova-android-support-gradle-release plugin. cordova plugin add cordova-android-support-gradle-release --fetch

Solution 19 - Android

Another aproach with same solution is create a hook. It's persistent (after platform reinstall), you can commit it and it don't require re-adding platform.

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

Init hook in config > %project%\config.xml

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

Install fs dependency to your project:

> npm i fs --save-dev

Run build:

> cordova build android

Solution 20 - Android

SUPER SIMPLE AND CORRECT WAY OF SOLVING IT!

Just update the sdk and add the latest 2 version of android... and restart the computer! Done...

Now we have time to talk about cars and sports...

Solution 21 - Android

I had the same problem, and none of the given solutions worked for me. Installing the latest version of Android SDK Build-tools (27.0.3) resolved my problem.

Solution 22 - Android

Solution link

This is due to compat plugin. Remove that plugin if you have older version (less than 1.2.0) and set [email protected]

> cordova plugin rm cordova-plugin-compat --force > > cordova plugin add [email protected] > > cordova platform rm android > > ionic cordova platform add [email protected]

Working at my case. Thanks :)

Solution 23 - Android

updates to @Brad Pitcher's answer:

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 in the root dir

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

Solution 24 - Android

I was running into this issue with react native and it was caused by the following lines in my android/app/build.gradle:

implementation ("com.google.android.gms:play-services-base:+") {
  force = true;
}
implementation ("com.google.android.gms:play-services-maps:+") {
  force = true;
}

etc...

Apparently this + resolved to a new 17.0.0 version which broke my build.
Changing the + to 16.0.0 (or 16.0.1 for play-services-base) solved my issue

Solution 25 - Android

This problem had been killing me for a week.

Ultimately I ended up on [email protected]

I altered android/project.properties by changing

#cordova.system.library.3=com.google.android.gms:play-services-analytics:+
cordova.system.library.3=com.google.android.gms:play-services-analytics:15+

That change finally got me out of the ttcIndex error message pit of darkness.

Then I got this error

com.android.builder.dexing.DexArchiveBuilderException: 
  com.android.builder.dexing.DexArchiveBuilderException

The error was apparently due to a Java version issue. I then altered android/build.gradle with the following change

compileOptions {
  #sourceCompatibility JavaVersion.VERSION_1_6
  #targetCompatibility JavaVersion.VERSION_1_6
  sourceCompatibility JavaVersion.VERSION_1_8
  targetCompatibility JavaVersion.VERSION_1_8
}

Also note I do have the cordova-android-support-gradle-release plugin installed, but have no idea if I need it.

Solution 26 - Android

It's a duplicate entry in values.xml in a folder called support-compat-28.0.0-alpha1.aar.

You'll find this file on Windows at \users\YOURUSERID\.gradle\caches\transforms-1\files-1.1

Once inside that folder you have to go some levels deeper to values.xml.

In that file, search for an element <declare-styleable name="FontFamilyFont>.

In that element, remove the FOUR lines with android: in it.

After I made that change I can build again without errors.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSt&#233;phane PadovaniView Question on Stackoverflow
Solution 1 - Androidhelmson helmsonView Answer on Stackoverflow
Solution 2 - AndroidAndrew RadulescuView Answer on Stackoverflow
Solution 3 - AndroidavmatteView Answer on Stackoverflow
Solution 4 - AndroidAhmedView Answer on Stackoverflow
Solution 5 - AndroidstuView Answer on Stackoverflow
Solution 6 - AndroidMuhammed TanriverdiView Answer on Stackoverflow
Solution 7 - AndroidalpereView Answer on Stackoverflow
Solution 8 - AndroiddoitView Answer on Stackoverflow
Solution 9 - Androidcpro90View Answer on Stackoverflow
Solution 10 - AndroidBrad PitcherView Answer on Stackoverflow
Solution 11 - AndroidTeja KonjetiView Answer on Stackoverflow
Solution 12 - Androidkaran bhatiaView Answer on Stackoverflow
Solution 13 - AndroidChris ScuttView Answer on Stackoverflow
Solution 14 - AndroidAnthonyeefView Answer on Stackoverflow
Solution 15 - AndroidamanView Answer on Stackoverflow
Solution 16 - Androiduser276648View Answer on Stackoverflow
Solution 17 - AndroidKushView Answer on Stackoverflow
Solution 18 - AndroidDineshSView Answer on Stackoverflow
Solution 19 - AndroidpaveletyView Answer on Stackoverflow
Solution 20 - AndroidAri WaisbergView Answer on Stackoverflow
Solution 21 - AndroidDaniel W.View Answer on Stackoverflow
Solution 22 - AndroidPranay KumarView Answer on Stackoverflow
Solution 23 - AndroidExlordView Answer on Stackoverflow
Solution 24 - AndroidUri KlarView Answer on Stackoverflow
Solution 25 - AndroidAustin HutchisonView Answer on Stackoverflow
Solution 26 - AndroidHenk KelderView Answer on Stackoverflow