apache / cordova-android

Apache Cordova Android
https://cordova.apache.org/
Apache License 2.0
3.59k stars 1.52k forks source link

<preference name="android-targetSdkVersion" value="30" /> not working and keep asking for 29 #1178

Closed almothafar closed 2 years ago

almothafar commented 3 years ago

Bug Report

Problem

It seems setting targetSdkVersion to 30 not working, it sounds like the same issue as the one closed #846 , I set <preference name="android-targetSdkVersion" value="30" /> in config.xml and I installed only platform-30 it keeps asking me to install version 29:

#13 394.1 Checking the license for package Android SDK Platform 29 in /opt/android-sdk-linux/licenses
#13 394.1 License for package Android SDK Platform 29 accepted.
#13 394.1 Preparing "Install Android SDK Platform 29 (revision: 5)".
#13 394.1 Warning: Failed to read or create install properties file.
#13 394.2
#13 394.2 FAILURE: Build failed with an exception.
#13 394.2
#13 394.2 * What went wrong:
#13 394.2 Could not determine the dependencies of task ':app:bundleReleaseResources'.
#13 394.2 > Failed to install the following SDK components:
#13 394.2       platforms;android-29 Android SDK Platform 29
#13 394.2   Install the missing components using the SDK manager in Android Studio.

There is no other information to put but it is the same issue as #846 nothing new.

Version information

What are relevant versions you are using? Latest everything, Cordova 10 and cordova-android 9.0.0

Checklist

goodjun commented 3 years ago

you can try

cordova platform add android@version
almothafar commented 3 years ago

@goodjun You totally missed the point, I have it already on the latest version (9.0.0) the problem is that the build process is ignoring the target platform, which is can be set and changed manually from Android studio but not in the command line, as for me I do that using Dockerfile.

You can refer to https://github.com/capellasolutions/ionic-cordova-docker use develop branch if you want to see this issue.

breautek commented 3 years ago

I think this might be a cosmetic issue. I was using this the other day and despite the cordova build output stating using android-29, the final output of both an apk or app bundle still produced api 30 package.

Are you able to confirm you see the same behavior?

almothafar commented 3 years ago

@breautek I edited my last comment to @goodjun

Also, the build itself doesn't complete at all, I just have platform-30 installed not 29, make sure you don't have both, and try to build, it keeps asking for 29 to be installed and trying to install it.

almothafar commented 3 years ago

@breautek Ok I got what you are saying, so it seems the value is not ignored:

image

That's If I installed 29, but If I installed platform 30, I get the error.

almothafar commented 3 years ago

I saw the following lines in generated build.gradle file (note that I installed build-tools version 30.0.3, not 29.0.2):

image

And in the project.properties file:

image

So is this the reason behind the issue?

Are these issues related? #660 and #686

almothafar commented 3 years ago

@breautek I just updated develop branch here https://github.com/capellasolutions/ionic-cordova-docker/tree/develop so you can run build-mobile.sh and choose Android when it asks for it and you will see that issue:

image

shanlin2dltk commented 3 years ago

Adding to the importance of resolving this issue is very soon Google store won't accept submission of sdk level less than 30.

AuTiiTo commented 3 years ago

We'll need to update this version in the near future.

breautek commented 3 years ago

Adding to the importance of resolving this issue is very soon Google store won't accept submission of sdk level less than 30.

This is not related to this issue. Targeting API 30 still works via android-targetSdkVersion preference, so that's not a problem. Additionally we will bump our default target SDKs on our major releases to match the requirement of Google Play store.

The issue described in this ticket is Cordova will still attempt to the default platform SDK (currently API 29) even when targetSdkVersion is set to a different API level. So the current workaround is to simply have both platform 29 & 30 installed.

I've had a chance to do some digging on the cause and I've found 3 things that Cordova tooling must do:

(1) Ensure compileSdkVersion matches targetSdkVersion

compileSdkVersion is the SDK that the application is compiled against, while the targetSdkVersion is an assertion that you've tested your application at the target SDK level for compatibility. If the platform API level is higher of the target, then the platform will enable backwards-compatibility behaviours.

There isn't any real reason to have a compileSdkVersion set that is different than the targetSdkVersion and doing so can cause an unstable application. Currently, the android-targetSdkVersion overrides but doesn't modify compileSdkVersion creating this possibility. Cordova should force compileSdkVersion and targetSdkVersion to be equal.

There is currently no config.xml preference to set the compileSdkVersion, and the lack of this feature should remain. There is a cdvCompileSdkVersion cordova gradle flag, which I think should become deprecated and potentially removed in cordova-android@10 and replaced with a cdvTargetSdkVersion flag to match the config.xml's android-targetSdkVersion preference.

(2) Ensure android/project.properties has the correct target

Currently, Cordova does not modify the target attribute inside /platforms/android/project.properties and it remains set to android-29 which will cause the Android Gradle Plugin (AGP) to download Platform 29.

(3) Ensure android/CordovaLib/project.properties has the correct target

Currently, Cordova does not modify the target attribute inside /platforms/android/CordovaLib/project.properties and it remains set to android-29 which will cause AGP to download Platform 29.

Additionally, a warning should be printed for when the SDK is overridden and uses a value other than the Cordova default target SDK, similar to the min sdk override warning. Using an alternate SDK level is not really a supported feature, so this preference is more-or-less "use at your own risk" (and really should be documented as such).

All 3 actions must be done in order for the AGP to not download API 29.

I cannot give any timeline for when I'll personally be able to do the above, but I'll support any PR that does what is described above.

ICYMI: You can workaround this issue by installing both Platform 29 & 30. You can still build APKs targeted against API 30.

almothafar commented 3 years ago

You can workaround this issue by installing both Platform 29 & 30. You can still build APKs targeted against API 30.

Actually, is enough to install platform-29, installing platform 30 won't be effective and pointless anyway because of other gradle project properties files, that what I was able to do and build using my docker file even with android-targetSdkVersion set t 30 as it is moved to cdvTargetSdkVersion

breautek commented 3 years ago

installing platform 30 won't be effective and pointless anyway because of other gradle project properties files,

As noted in my notes above but the workaround will still build a target 30 SDK, which will still enable API changes that API 30 will introduce.

If using API 30 platform SDK is a requirement, a temporary full workaround is to modify the following:

/platforms/android/project.properties:

target=android-30

/platforms/android/CordovaLib/project.properties:

target=android-30

Currently the compile SDK version is can be overrided using the cdvCompileSdkVersion flag e.g:

cordova build android --release -- --gradleArg=-PcdvCompileSdkVersion=30

Lastly, of course you still need the android-targetSdkVersion preference in your config.xml file:

<preference name="android-targetSdkVersion" value="30" />

Cordova may overwrite changes to files inside /platforms/ so I'd advise crafting a before_build hook.

AuTiiTo commented 3 years ago

hi again guys. I did all the steps, how can I ensure that the platform is correct? I searched and found that the command "gradle cdvPrintProps" show this properties:

task cdvPrintProps { doLast { println('cdvCompileSdkVersion=' + cdvCompileSdkVersion) println('cdvBuildToolsVersion=' + cdvBuildToolsVersion) println('cdvVersionCode=' + cdvVersionCode) println('cdvVersionCodeForceAbiDigit=' + cdvVersionCodeForceAbiDigit) println('cdvMinSdkVersion=' + cdvMinSdkVersion) println('cdvMaxSdkVersion=' + cdvMaxSdkVersion) println('cdvTargetSdkVersion=' + cdvTargetSdkVersion) println('cdvBuildMultipleApks=' + cdvBuildMultipleApks) println('cdvReleaseSigningPropertiesFile=' + cdvReleaseSigningPropertiesFile) println('cdvDebugSigningPropertiesFile=' + cdvDebugSigningPropertiesFile) println('cdvBuildArch=' + cdvBuildArch) println('computedVersionCode=' + android.defaultConfig.versionCode) android.productFlavors.each { flavor -> println('computed' + flavor.name.capitalize() + 'VersionCode=' + flavor.versionCode) } } }

but it's showed me an error. Did you has another suggestion to see it? Thanks again for all the effort :)

almothafar commented 3 years ago

I was able finally to build it using before_build hook https://github.com/capellasolutions/ionic-cordova-docker/tree/develop/example-app/scripts

Until this issue is resolved here, maybe in cordova-android 10 or 9.something

breautek commented 3 years ago

@almothafar I believe I have a working fix https://github.com/apache/cordova-android/pull/1212

Because the PR is based off of the new master which is a development version of cordova-android@10, which contains the SDK 30 by default, you can test it by setting android-targetSdkVersion to 29.

You should set that API 29 and only API 29 is ever downloaded/used with that PR.

chamaraindrajith commented 2 years ago

Tested and it worked.

I changed on config.xml to :

<preference name="android-targetSdkVersion" value="30" />

but it didn’t work so, I remove the platform by using :

cordova platform remove android

then add the latest cordova android version :

cordova platform add android@latest

finally build the project :

cordova build android

It worked! Amazing.

You can check it by going to this file. \platforms\android\app\build\intermediates\merged_manifests\debug\AndroidManifest.xml

sksk008 commented 2 years ago

Cordova released cordova android 10.0.0 on 20/7/2021 so now we can add android api 30 in our project. and its not asking for android 29.

ionic cordova platform remove android ionic cordova platform add android@10.0.0

Pumayk26 commented 2 years ago

Tested and it worked.

I changed on config.xml to :

<preference name="android-targetSdkVersion" value="30" />

but it didn’t work so, I remove the platform by using :

cordova platform remove android

then add the latest cordova android version :

cordova platform add android@latest

finally build the project :

cordova build android

It worked! Amazing.

You can check it by going to this file. \platforms\android\app\build\intermediates\merged_manifests\debug\AndroidManifest.xml

Hi Chamara... Did you able to compile your ionic app with sdk 30..? Am getting this annoying error message again and again...

C:\Users\User_App\platforms\android\app\src\main\java\org\apache\cordova\whitelist\WhitelistPlugin.java:63: error: cannot find symbol allowedRequests = new Whitelist(); ^ symbol: class Whitelist location: class org.apache.cordova.whitelist.WhitelistPlugin Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.

almothafar commented 2 years ago

Tested and it worked. I changed on config.xml to : <preference name="android-targetSdkVersion" value="30" /> but it didn’t work so, I remove the platform by using : cordova platform remove android then add the latest cordova android version : cordova platform add android@latest finally build the project : cordova build android It worked! Amazing. You can check it by going to this file. \platforms\android\app\build\intermediates\merged_manifests\debug\AndroidManifest.xml

Hi Chamara... Did you able to compile your ionic app with sdk 30..? Am getting this annoying error message again and again...

C:\Users\User_App\platforms\android\app\src\main\java\org\apache\cordova\whitelist\WhitelistPlugin.java:63: error: cannot find symbol allowedRequests = new Whitelist(); ^ symbol: class Whitelist location: class org.apache.cordova.whitelist.WhitelistPlugin Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.

remove whitelist plugin using cordova plugin rm cordova-plugin-whitelist it is mentioned on that plugin page https://github.com/apache/cordova-plugin-whitelist

Pumayk26 commented 2 years ago

Tested and it worked. I changed on config.xml to : <preference name="android-targetSdkVersion" value="30" /> but it didn’t work so, I remove the platform by using : cordova platform remove android then add the latest cordova android version : cordova platform add android@latest finally build the project : cordova build android It worked! Amazing. You can check it by going to this file. \platforms\android\app\build\intermediates\merged_manifests\debug\AndroidManifest.xml

Hi Chamara... Did you able to compile your ionic app with sdk 30..? Am getting this annoying error message again and again... C:\Users\User_App\platforms\android\app\src\main\java\org\apache\cordova\whitelist\WhitelistPlugin.java:63: error: cannot find symbol allowedRequests = new Whitelist(); ^ symbol: class Whitelist location: class org.apache.cordova.whitelist.WhitelistPlugin Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.

remove whitelist plugin using cordova plugin rm cordova-plugin-whitelist it is mentioned on that plugin page https://github.com/apache/cordova-plugin-whitelist

Thanks a lot... Am a noob to this ionic cordova stuff... You made my day dear... :) Thanks again

breautek commented 2 years ago

remove whitelist plugin using cordova plugin rm cordova-plugin-whitelist it is mentioned on that plugin page

We are in an odd state right now because the current cordova CLI will auto-add the whitelist plugin when you create a new cordova project, which is deprecated and incompatible with the latest major version of cordova-android. The next major cordova CLI will solve this problem.

danicholls commented 2 years ago

If you stick with Cordova 9.1.0 and update config.xml to target Android SDK version 30, you'll need to sign like this: https://stackoverflow.com/a/69473649 -- then all should be well.

discovermoi commented 1 year ago

I was able finally to build it using before_build hook https://github.com/capellasolutions/ionic-cordova-docker/tree/develop/example-app/scripts

Until this issue is resolved here, maybe in cordova-android 10 or 9.something

Hi, Unable to access the link..

almothafar commented 1 year ago

I was able finally to build it using before_build hook https://github.com/capellasolutions/ionic-cordova-docker/tree/develop/example-app/scripts Until this issue is resolved here, maybe in cordova-android 10 or 9.something

Hi, Unable to access the link..

I removed it when this issue was resolved you can see the commit here https://github.com/capellasolutions/ionic-cordova-docker/commit/626ff047863bfc1b1b15ee0cc025f010d98e0ce8

This is the repo, master branch works, develop is not working right now: https://github.com/capellasolutions/ionic-cordova-docker