Stéphane Padovani
Stéphane Padovani

Reputation: 1157

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

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?

Upvotes: 104

Views: 72439

Answers (26)

Teja Konjeti
Teja Konjeti

Reputation: 343

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

Upvotes: 5

Austin Hutchison
Austin Hutchison

Reputation: 31

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.

Upvotes: 0

alpere
alpere

Reputation: 1119

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

Upvotes: 9

Uri Klar
Uri Klar

Reputation: 3988

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

Upvotes: 0

DineshS
DineshS

Reputation: 81

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

Upvotes: 1

karan bhatia
karan bhatia

Reputation: 185

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

Upvotes: 5

Exlord
Exlord

Reputation: 5381

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

Upvotes: 0

Pranay Kumar
Pranay Kumar

Reputation: 144

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 :)

Upvotes: 0

Daniel W.
Daniel W.

Reputation: 563

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.

Upvotes: 0

Anthonyeef
Anthonyeef

Reputation: 2675

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.

Upvotes: 4

Kush
Kush

Reputation: 11

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

Upvotes: 1

Ari Waisberg
Ari Waisberg

Reputation: 1303

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

Upvotes: 0

user276648
user276648

Reputation: 6383

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.

Upvotes: 2

aman
aman

Reputation: 75

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

Upvotes: 3

pavelety
pavelety

Reputation: 874

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

Upvotes: 0

Andrew Radulescu
Andrew Radulescu

Reputation: 1899

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"

Upvotes: 84

Henk Kelder
Henk Kelder

Reputation: 9

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.

Upvotes: -1

Chris Scutt
Chris Scutt

Reputation: 86

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.

Upvotes: 4

tnrvrd
tnrvrd

Reputation: 3250

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.

Upvotes: 15

Ahmed
Ahmed

Reputation: 1776

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.

Upvotes: 28

helmson helmson
helmson helmson

Reputation: 1100

Just put following in build-extras.gradle

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

Upvotes: 106

Brad Pitcher
Brad Pitcher

Reputation: 1785

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.

Upvotes: 8

stu
stu

Reputation: 219

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.

Upvotes: 21

cpro90
cpro90

Reputation: 168

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.

Upvotes: 8

doit
doit

Reputation: 81

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.

Upvotes: 8

avmatte
avmatte

Reputation: 631

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.

Upvotes: 31

Related Questions