I'm using cordova in one project with 15+ plugins. After updating to the latest cordova cli + cordova android library, a couple of plugins started to fail. I identified the issue has to do with the android dependencies added by each plugin. On the files project.properties and build.gradle in app folder I noticed duplicated entries for 'com.android.support:support-v4:27'. After I edited manualy build.gradle to add only one 'com.android.support:support-v4' matching my sdk, it worked.
** My platforms & plugins folders are not checked in my github. They are generated automatically, so I don't have the option to edit them directly.
**
Using cordova 8.1.2 and cordova-android 7.1.4
Q1: How can I make sure my android cordova project has unique compat libraries?
Q2: How can I overwrite or remove jar libraries from the project generated by cordova?
Thanks
The following plugin did what I needed fixing the issue. Basically I had a conflict of android support libraries with mismatching versions. The plugin resolves the conflicts fixing all android dependencies with the one I specified.
https://github.com/dpa99c/cordova-android-support-gradle-release
Related
I am having a build issue with a Cordova project that I have inherited specifically the error raised is: -
:CordovaLib:transformClassesAndResourcesWithPrepareIntermediateJarsForDebug
:app:processDebugResourcesC:\Users\andy.gradle\caches\transforms-1\files-1.1\support-compat-28.0.0.aar\96270291fb4c7e49ddab8d4d1a4f36f7\res\values\values.xml:133:5-70: AAPT: error: resource android:attr/fontVariationSettings not found.
I have another project which builds successfully and the difference between the two projects appears to be the platforms\android\project.settings file, if I manually change the setting my project builds. However as this file appears to be re-created every time I run cordova prepare android this is not an ideal situation, the setting in question is: -
cordova.system.library.1=com.android.support:support-v4:+
if I change this to: -
cordova.system.library.1=com.android.support:support-v4:24.1.1+
my build is successful!
So my question is what impacts this setting, as I feel I need to understand the reasoning behind the differing value as other than the working project having more dependencies the non-working project contains the same references but has one additional dependency this being: -
cordova-plugin-file-opener2
I do not have SDK version 28 installed, I can see the logic behind the error and I would assume installing version 28 may resolve the issue but I would like to understand why one project creates the settings with one version number and the second project is created with a differing one?
In Cordova projects, the versions of native libraries pulled into the Android build via Gradle are controlled directly by the Cordova plugins you have installed in your project.
The Gradle config is dynamically generated by Cordova, so each time you run cordova prepare android, the build.gradle file is regenerated.
In this case, the library dependency is the Android Support Library (com.android.support).
cordova-plugin-file-opener2 specifies version + which will pull in the very latest version, which is currently v28.0.0 as can be seen on the releases page.
However, if another plugin in your project specifies a different version, this will lead to problems and often build failures due to version conflicts.
In a native Android project, the build.gradle file is under your direct control, so you'd never have these problems.
One solution is to install the cordova-android-support-gradle-release plugin into your project.
This plugin overrides the versions of the Android Support Library specified by other plugins, enabling you to align the versions and so fix the build problems.
For example, in your case you can run:
cordova plugin add cordova-android-support-gradle-release --variable ANDROID_SUPPORT_VERSION=24.1.1
This will install the plugin and override the versions specified by other plugins to ensure v24.1.1 of the Support Library is included in your project.
One consideration is that v24 is quite old, so you may want to try a newer version, e.g.:
cordova plugin add cordova-android-support-gradle-release --variable ANDROID_SUPPORT_VERSION=27.+
Just to add some detail to my solution just in case it helps anybody else in the future!
DaveAlden added a very helpful description above of what is happening which is worth reading through as it is very difficult to get a clear concise explanation of what is or should be happening with these technologies.
My project did indeed already have the cordova-android-support-gradle-release plugin installed and it was set to 27.+ however I followed the following process and everything then started working: -
Updated my Android SDK software to the latest
Updated Cordova from version 8.0.0 to 8.1.2
Removed plugin cordova plugin add cordova-android-support-gradle-release
Added plugin back in cordova plugin add cordova-android-support-gradle-release --variable ANDROID_SUPPORT_VERSION=27
I then retried the build and everything then started working.
UPDATE:
I came to deploy my app again today and I have got the same error again, to resolve it I ran: -
cordova plugin remove cordova-android-support-gradle-release
cordova plugin add cordova-android-support-gradle-release --variable ANDROID_SUPPORT_VERSION=27.+
and it then builds successfully, I have no idea why this occurs but it is something to do with the \platforms\android\project.properties file not being setup correctly as when it builds successfully this file contains the following line: -
cordova.gradle.include.1=cordova-android-support-gradle-release/portal-cordova-android-support-gradle-release.gradle
I'm sure somebody with a clearer understanding of the build process could add some clarity!
Is there a way to set enable multidex (https://github.com/casidiablo/multidex) for Android if I build apps using Ionic Framework ?
There is a plugin that enables multidex. To install it, run:
cordova plugin add --save https://github.com/jwall149/cordova-multidex
And try building again. The build may take a little longer than usual, but your app should compile without troubles.
For those still having this issue, I've fixed it by installing cordova-plugin-multidex
cordova plugin add cordova-plugin-enable-multidex
Check it out: Multidex for Cordova
For people using androidx and cordova-android: 8 is interested in this solution, I created a fork that supports the file structure and class names of these new versions. Also works with Ionic.
cordova plugin add --save https://github.com/c00/cordova-multidex
Note that this is only relevant if you are still supporting a minSdk less than 21. At 21, multidexing is no longer needed as there is some built-in fix for it. So in that case, just remove the multidex plugin (if you had it) and things should work.
Try this
cordova plugin add --save https://github.com/jwall149/cordova-multidex
To fix this —
Install couple of androidx plugins to solve the issue. So simply run the following commands in your project root:
Add plugin to enable AndroidX in the project
1. ionic cordova plugin add cordova-plugin-androidx
2. Add plugin to patch existing plugin source that uses the Android Support Library to use AndroidX
ionic cordova plugin add cordova-plugin-androidx-adapter
3. Now run the following commands in your project root:
cordova clean
ionic cordova build android
https://medium.com/#AnkitMaheshwariIn/ionic-android-error-while-merging-dex-archives-unable-to-merge-dex-in-ionic-3f6272899aab
This is a solution to the above error that I want to document. I found other similar posts, but none described how this error can be associated with Cordova or Ionic.
If you are not careful, there can be a mismatch between the version of Gradle that Android Studio uses and the version of Gradle that Cordova / cordova-android specifies in its auto-generated application code. As you know, running
$ cordova platform add android
(or $ ionic platform add android, if you are building an Ionic app) creates the native application code at the-project/platforms/android.
Inside that folder, the file: /the-project/platforms/android/cordova/lib/builders/GradleBuilder.js exports a variable as shown below:
var distributionUrl = process.env['CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL'] || 'http\\://services.gradle.org/distributions/gradle-x.y-all.zip';
Where x and y depened on which version of Cordova / cordova-android are being used to build the native application code.
When you run
$ cordova build android
The version of Gradle specified in the distributionUrl var is the version used for the build.
Now here comes the tricky part. When you import the project into Android Studio, you will most likely get a message strongly recommending that you upgrade Gradle to a newer version, as shown below:
If you do this, Android Studio will download a new version of Gradle and store it locally and configure the project to use the newly download local Gradle distribution, which is the radio option below the selected “Use default grade wrapper”, which I ended up deselecting because this will cause errors.
This will cause problems because Android Studio and Cordova will now be attempting to build the application with different versions of Gradle and you will get build errors within Android Studio and also with
$ cordova build android
in the command line. The solution with Cordova apps is to always keep the Android Studio project set to "Use default gradle wrapper" and ignore the tempting messages to upgrade. If you do want to use a newer version of Gradle, you can always change the distributionUrl var in the file mentioned above (however Cordova strongly discourages modifying code within the platforms folder since it is easily overwritten). At the time of writing this, I cannot tell is there is a way to set the Gradle version at the
$ cordova platform add android
step, which is when you would want to do it so you are never directly modifiying code inside of the-project/platforms
For me, the following commands solved the problem:
cordova platform remove android
cordova platform add android
ionic build android
I'd love to just leave this as a comment, but I'm apparently not reputable enough...
After reading your documentation, I wasn't able to resolve my issue with your suggestion of keeping the Android Studio to "Use default gradle wrapper". What I did find is that setting the session variable CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL before building got me a bit further:
root#dev:$ export CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL="https\://services.gradle.org/distributions/gradle-2.14.1-all.zip"
root#dev:$ cordova build android
The next thing I had to do was edit <project>/platforms/android/build.gradle and <project>/platforms/android/CordovaLib/build.gradle and make sure they both pointed to a valid gradle plugin version.
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
}
...and in <project>/platforms/android/CordovaLib/build.gradle I added jcenter in the repositories (because maven.org did not seem to have 2.2.0)
repositories {
mavenCentral();
jcenter()
}
I was able to build then.
Switching back to "Use default gradle wrapper" didn't work for me on my ionic 1 project, but running
ionic platform remove android
ionic platform add android
Worked for me
Another way to fix issue, that also works on Windows:
cordova build android --release --CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
you can change the value in platform/android/cordova/lib/builders/GradleBuilder.js
the value you changed, it will be replaced by the lastest gradle zip when you reinstall android platform, so you don't need to worry about change it
var distributionUrl = process.env['CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL'] || 'https\\://services.gradle.org/distributions/gradle-2.14.1-all.zip';
or like the others ans
export CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL="https\://services.gradle.org/distributions/gradle-2.14.1-all.zip"
I want to extend #bungler answer.
I got confused with version of gradle & compatible version of android plugin for gradle. Following link has the list of compatibale versions mapping:
Gradle vs Android plugin for gradle - Compatible version list
For current version of gradle 3.3+, compatible version of android plugin is 2.3.3
So final settings will look like following:
For Mac
STEP 1: Add following in env variables:
option a) update env variable:
export CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL="https\://services.gradle.org/distributions/gradle-3.3-all.zip"
or
option b ) you can download the gradle file and place it in <project>/platforms/android/gradle/ and update env variable:
export CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL="../gradle-3.3-all.zip"
STEP 2: Update following in <project>/platforms/android/CordovaLib/build.gradle
buildscript {
...
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
}
This worked for me.
For follow error:
Minimum supported Gradle version is 4.1. Current version is 3.3. If
using t he gradle wrapper, try editing the distributionUrl in
E:\ionic\MyIonicProject\gr adle\wrapper\gradle-wrapper.properties to
gradle-4.1-all.zip for gradle 4.1
This command worked for me:
ionic cordova platform update android
In follow up to Chuck Holbrooks answer, with following solution I get an error when trying to add android platform again saying it is already added.
ionic cordova platform remove android
ionic cordova platform add android
My working Solution:
ionic cordova platform remove android
ionic cordova platform check android
ionic cordova platform add android
if you run the following it will fix the problem building APKs from the command line
ionic cordova platform remove android
ionic cordova platform add android
however, after you run/build it in android studio the version mismatch error returns...
instead to fix this, in android studio you should NOT update the project gradle versioning but instead go to
file > project structure > SDK location > Gradle settings...
and then tell it to use Gradle from a specified location which should be
C:/Gradle/gradle-7.4.2 or whatever version you have.
By doing this you will be able to build APKs from the command line using ionic as well as from within android studio.
I have made an Android app via the Cordova CLI. These are the steps I have taken :
cordova create myApp com.myCompany.myApp myApp
cd myApp
cordova plugin add cordova-plugin-camera --save
cordova platform add android --save
cordova requirements android
cordova build android --verbose
cordova run android
Thanks to : https://www.npmjs.com/package/cordova
This runs fine. So now I try and add this plugin : https://github.com/appfeel/admob-google-cordova
So I do :
cordova plugin add cordova-admob
This doesn't work as it comes back with this error :
Warning, could not copy necessary files for angular browser platfrom.
Please ensure 'www/lib/angular-admob.js' exists ...
So I created an empty file named lib in my www folder. Remove the plugin :
cordova plugin remove cordova-admob
Then re-add :
cordova plugin add cordova-admob
This seemed to work. So now I build and get this error :
Now I have searched for the problem and come across this : Error retrieving parent for item: No resource found that matches the given name after upgrading to AppCompat v23
The answer is as follows :
Your compile SDK version must match the support library's major
version.
Since you are using version 23 of the support library, you need to
compile against version 23 of the Android SDK.
Alternatively you can continue compiling against version 22 of the
Android SDK by switching to the latest support library v22.
I'm not sure how to do this with the Cordova files I have, so my question is, how do I make sure that both the plugin and the android sdk are on the same versions ? If this even is my problem.
Is it possible to build a crosswalk-cordova app inside of android studio?
It looks like you need to use ANT at this point.
Does anyone know if this is on the roadmap now that android studio is out of beta?
Our team just built an android wear app so we need to use android studio to create a build and we'd like to start using crosswalk.
I put together some instructions here: https://diego.org/2015/01/07/embedding-crosswalk-in-android-studio/
You can do this with gradle by adding the maven repo:
repositories {
maven {
url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2'
}
}
And then the version of crosswalk that you want:
compile 'org.xwalk:xwalk_core_library:10.39.235.15'
Sample Code: https://github.com/dougdiego/CrosswalkDemo
I was able to get this working. You need to re-arrange the project structure a bit and use "modules" I created a CordovaLib module and a xwalk_core_library module both "Android Libraries" and i referenced CordovaLib from my main project and set xwalk_core_library as a dependability for cordovalib.
Make sure to create the xwalk_core_library under the package name org.xwalk.core.
See screen shot for project stucture and the xwalk_core_library gradle file.
Put the .so files into a jniLibs directory and the android build correctly packages them into your app.
I followed this article to help with building. I plan on setting up seperate builds for x86 and arm.
http://ph0b.com/android-studio-gradle-and-ndk-integration/#mygradlefile
I have this working in this github project. Let me know if you run into any issues.
https://github.com/twilly86/CrossWalkAndroidStudio
In my case, the project with cordova android platform version 4.1.1 (For example Cordova CLI version 5.2.0) works, the Android Studio can build the project.
However, the project with cordova android platform version 5.1.1 (For example Cordova CLI version 6.2.0) has the issue, the Android Studio can not build the project because the Gradle sync brings the error such as
exception during working with external system: ndk
The critical difference between 4.1.1 and 5.1.1 is the build.gradle file.
In 4.1.1 the build.gradle file choose appropriate gradle version and android plugin version. (like gradle version 2.2 and plugin version 1.0.0+).
In 5.1.1 the build.gradle file does not do such a thing.
I fix this issue by manually setting the gradle version to 2.2 and plugin version 1.0.0. This can be done in the Android studio by opening the dialog
File > Project Structure > Project.