升级 cordova-android 10 后构建失败
Build failing after upgrade cordova-android 10
当我将 cordova-android@9.0.0
升级到 cordova-android@10.1.1
时 运行 cordova build android --release --buildconfig=build.json
我遇到了构建问题
问题:
* What went wrong:
Some problems were found with the configuration of task ':app:processReleaseGoogleServices' (type 'GoogleServicesTask').
- In plugin 'com.google.gms.googleservices.GoogleServicesPlugin' type 'com.google.gms.googleservices.GoogleServicesTask' field 'intermediateDir' without corresponding getter has been annotated with @OutputDirectory.
Reason: Annotations on fields are only used if there's a corresponding getter for the field.
Possible solutions:
1. Add a getter for field 'intermediateDir'.
2. Remove the annotations on 'intermediateDir'.
Please refer to https://docs.gradle.org/7.1.1/userguide/validation_problems.html#ignored_annotations_on_field for more details about this problem.
- In plugin 'com.google.gms.googleservices.GoogleServicesPlugin' type 'com.google.gms.googleservices.GoogleServicesTask' field 'packageNameXOR1' without corresponding getter has been annotated with @Input.
Reason: Annotations on fields are only used if there's a corresponding getter for the field.
Possible solutions:
1. Add a getter for field 'packageNameXOR1'.
2. Remove the annotations on 'packageNameXOR1'.
Please refer to https://docs.gradle.org/7.1.1/userguide/validation_problems.html#ignored_annotations_on_field for more details about this problem.
- In plugin 'com.google.gms.googleservices.GoogleServicesPlugin' type 'com.google.gms.googleservices.GoogleServicesTask' field 'packageNameXOR2' without corresponding getter has been annotated with @Input.
Reason: Annotations on fields are only used if there's a corresponding getter for the field.
Possible solutions:
1. Add a getter for field 'packageNameXOR2'.
2. Remove the annotations on 'packageNameXOR2'.
Please refer to https://docs.gradle.org/7.1.1/userguide/validation_problems.html#ignored_annotations_on_field for more details about this problem.
- In plugin 'com.google.gms.googleservices.GoogleServicesPlugin' type 'com.google.gms.googleservices.GoogleServicesTask' field 'quickstartFile' without corresponding getter has been annotated with @InputFile, @Optional.
Reason: Annotations on fields are only used if there's a corresponding getter for the field.
Possible solutions:
1. Add a getter for field 'quickstartFile'.
2. Remove the annotations on 'quickstartFile'.
Please refer to https://docs.gradle.org/7.1.1/userguide/validation_problems.html#ignored_annotations_on_field for more details about this problem.
- In plugin 'com.google.gms.googleservices.GoogleServicesPlugin' type 'com.google.gms.googleservices.GoogleServicesTask' field 'searchedLocation' without corresponding getter has been annotated with @Input.
Reason: Annotations on fields are only used if there's a corresponding getter for the field.
Possible solutions:
1. Add a getter for field 'searchedLocation'.
2. Remove the annotations on 'searchedLocation'.
Please refer to https://docs.gradle.org/7.1.1/userguide/validation_problems.html#ignored_annotations_on_field for more details about this problem.
我已经试过了:
- 更新了一些过时的依赖项
- 移除
cordova-android-play-services-gradle-release
cordova-android-support-gradle-release
cordova-support-google-services
- 添加
config.xml
<preference name="GradlePluginGoogleServicesEnabled" value="true" />
和
<preference name="GradlePluginGoogleServicesVersion" value="4.3.8" />
但是当我这样做时,我又遇到了另一个错误:
* What went wrong:
A problem occurred evaluating project ':app'.
> Failed to apply plugin 'com.google.gms.google-services'.
> Cannot add extension with name 'googleServices', as there is an extension already registered with that name.
离子 CLI:5.4.16
离子框架:ionic-angular 3.9.8
@ionic/app-scripts: 3.2.4
科尔多瓦 CLI:10.0.0
科尔多瓦平台:android 10.1.1
节点JS:12.19.0
Android SDK 工具:26.1.1
非常感谢您的问题和问题描述,因为它帮助我从 cordova-android 9.1.0 升级到 10.1.1 :-)。
而且我想我可以解决你的问题。抛出这个错误,因为google服务插件在gradle文件中注册了两次(应用插件:'com.google.gms.google-services'),例如:platforms/android/app/build.gradle.您只需 comment/remove 这些进口之一。
因为每次都手动清理文件很烦人,所以我创建了一个 bash 脚本(= working on Mac OS),它会自动注释第二次导入:fix_android.sh
#!/usr/bin/env bash
echo "Executing fix_android.sh"
## comment duplicate import of com.google.gms.google-services plugin
#file=$(pwd)"/platforms/android/app/build.gradle"
file="platforms/android/app/build.gradle"
#echo ${file}
from="apply plugin: 'com.google.gms.google-services'"
to="\/\/apply plugin: 'com.google.gms.google-services'"
if [ -f "$file" ]; then
if grep -lr "$to" "$file"; then
echo "File already corrected!"
else
change=`sed "s/$from/$to/" < "$file"`
echo "$change" > "$file"
#echo "$change"
echo "Commented duplicate import!"
fi
else
echo ${file}" not found!"
ls -al platforms/android/app
fi
为了在构建之前自动启动脚本,我在 package.json:
中使用离子构建 scripts/hooks
"scripts": {
...
"ionic:build:before": "./scripts/fix_android.sh",
"ionic:build:after": "",
...
这是我的实际项目&系统配置
就我而言,none 提供的答案很有帮助。
在这里 查看配置中的解决方案,也许对某些人会有所帮助。
我有 9.1.0 版本的 'cordova-android' 不支持 Android API 30+ Android API Levels and Android Versions
我是如何解决问题的,或者我是如何破解解决方案的:
运行:
- cordova 平台 rm android
- cordova 平台添加 android
这应该在 platforms\android 中生成一个“build.gradle”文件
然后,手动更改代码的“project.ext”部分并指定您想要的版本,在我的例子中我需要支持 30 API 版本:
project.ext {
defaultBuildToolsVersion="30.0.0" //String
defaultMinSdkVersion=23 //Integer - Minimum requirement is Android 5.1
defaultTargetSdkVersion=30 //Integer - We ALWAYS target the latest by default
defaultCompileSdkVersion=30 //Integer - We ALWAYS compile with the latest by default
}
您可以根据需要修改@Mike建议的sh脚本。
顺便说一句,当我试图解决 cordova-android 版本 10 上的问题时 - 此代码块甚至没有出现在“build.gradle”中。
什么也可以提供帮助:
- 删除 cordova-plugin-whitelist - 版本 10 不支持它。
- 在 SDK 平台管理器中 - 需要下载 API 级别;
- 在 SDK 工具管理器中 - 下载所需的构建工具版本;
当我将 cordova-android@9.0.0
升级到 cordova-android@10.1.1
时 运行 cordova build android --release --buildconfig=build.json
问题:
* What went wrong:
Some problems were found with the configuration of task ':app:processReleaseGoogleServices' (type 'GoogleServicesTask').
- In plugin 'com.google.gms.googleservices.GoogleServicesPlugin' type 'com.google.gms.googleservices.GoogleServicesTask' field 'intermediateDir' without corresponding getter has been annotated with @OutputDirectory.
Reason: Annotations on fields are only used if there's a corresponding getter for the field.
Possible solutions:
1. Add a getter for field 'intermediateDir'.
2. Remove the annotations on 'intermediateDir'.
Please refer to https://docs.gradle.org/7.1.1/userguide/validation_problems.html#ignored_annotations_on_field for more details about this problem.
- In plugin 'com.google.gms.googleservices.GoogleServicesPlugin' type 'com.google.gms.googleservices.GoogleServicesTask' field 'packageNameXOR1' without corresponding getter has been annotated with @Input.
Reason: Annotations on fields are only used if there's a corresponding getter for the field.
Possible solutions:
1. Add a getter for field 'packageNameXOR1'.
2. Remove the annotations on 'packageNameXOR1'.
Please refer to https://docs.gradle.org/7.1.1/userguide/validation_problems.html#ignored_annotations_on_field for more details about this problem.
- In plugin 'com.google.gms.googleservices.GoogleServicesPlugin' type 'com.google.gms.googleservices.GoogleServicesTask' field 'packageNameXOR2' without corresponding getter has been annotated with @Input.
Reason: Annotations on fields are only used if there's a corresponding getter for the field.
Possible solutions:
1. Add a getter for field 'packageNameXOR2'.
2. Remove the annotations on 'packageNameXOR2'.
Please refer to https://docs.gradle.org/7.1.1/userguide/validation_problems.html#ignored_annotations_on_field for more details about this problem.
- In plugin 'com.google.gms.googleservices.GoogleServicesPlugin' type 'com.google.gms.googleservices.GoogleServicesTask' field 'quickstartFile' without corresponding getter has been annotated with @InputFile, @Optional.
Reason: Annotations on fields are only used if there's a corresponding getter for the field.
Possible solutions:
1. Add a getter for field 'quickstartFile'.
2. Remove the annotations on 'quickstartFile'.
Please refer to https://docs.gradle.org/7.1.1/userguide/validation_problems.html#ignored_annotations_on_field for more details about this problem.
- In plugin 'com.google.gms.googleservices.GoogleServicesPlugin' type 'com.google.gms.googleservices.GoogleServicesTask' field 'searchedLocation' without corresponding getter has been annotated with @Input.
Reason: Annotations on fields are only used if there's a corresponding getter for the field.
Possible solutions:
1. Add a getter for field 'searchedLocation'.
2. Remove the annotations on 'searchedLocation'.
Please refer to https://docs.gradle.org/7.1.1/userguide/validation_problems.html#ignored_annotations_on_field for more details about this problem.
我已经试过了:
- 更新了一些过时的依赖项
- 移除
cordova-android-play-services-gradle-release
cordova-android-support-gradle-release
cordova-support-google-services
- 添加
config.xml
<preference name="GradlePluginGoogleServicesEnabled" value="true" />
和<preference name="GradlePluginGoogleServicesVersion" value="4.3.8" />
但是当我这样做时,我又遇到了另一个错误:
* What went wrong:
A problem occurred evaluating project ':app'.
> Failed to apply plugin 'com.google.gms.google-services'.
> Cannot add extension with name 'googleServices', as there is an extension already registered with that name.
离子 CLI:5.4.16
离子框架:ionic-angular 3.9.8
@ionic/app-scripts: 3.2.4
科尔多瓦 CLI:10.0.0
科尔多瓦平台:android 10.1.1
节点JS:12.19.0
Android SDK 工具:26.1.1
非常感谢您的问题和问题描述,因为它帮助我从 cordova-android 9.1.0 升级到 10.1.1 :-)。
而且我想我可以解决你的问题。抛出这个错误,因为google服务插件在gradle文件中注册了两次(应用插件:'com.google.gms.google-services'),例如:platforms/android/app/build.gradle.您只需 comment/remove 这些进口之一。
因为每次都手动清理文件很烦人,所以我创建了一个 bash 脚本(= working on Mac OS),它会自动注释第二次导入:fix_android.sh
#!/usr/bin/env bash
echo "Executing fix_android.sh"
## comment duplicate import of com.google.gms.google-services plugin
#file=$(pwd)"/platforms/android/app/build.gradle"
file="platforms/android/app/build.gradle"
#echo ${file}
from="apply plugin: 'com.google.gms.google-services'"
to="\/\/apply plugin: 'com.google.gms.google-services'"
if [ -f "$file" ]; then
if grep -lr "$to" "$file"; then
echo "File already corrected!"
else
change=`sed "s/$from/$to/" < "$file"`
echo "$change" > "$file"
#echo "$change"
echo "Commented duplicate import!"
fi
else
echo ${file}" not found!"
ls -al platforms/android/app
fi
为了在构建之前自动启动脚本,我在 package.json:
中使用离子构建 scripts/hooks"scripts": {
...
"ionic:build:before": "./scripts/fix_android.sh",
"ionic:build:after": "",
...
这是我的实际项目&系统配置
就我而言,none 提供的答案很有帮助。
在这里
我有 9.1.0 版本的 'cordova-android' 不支持 Android API 30+ Android API Levels and Android Versions
我是如何解决问题的,或者我是如何破解解决方案的: 运行:
- cordova 平台 rm android
- cordova 平台添加 android
这应该在 platforms\android 中生成一个“build.gradle”文件 然后,手动更改代码的“project.ext”部分并指定您想要的版本,在我的例子中我需要支持 30 API 版本:
project.ext {
defaultBuildToolsVersion="30.0.0" //String
defaultMinSdkVersion=23 //Integer - Minimum requirement is Android 5.1
defaultTargetSdkVersion=30 //Integer - We ALWAYS target the latest by default
defaultCompileSdkVersion=30 //Integer - We ALWAYS compile with the latest by default
}
您可以根据需要修改@Mike建议的sh脚本。
顺便说一句,当我试图解决 cordova-android 版本 10 上的问题时 - 此代码块甚至没有出现在“build.gradle”中。
什么也可以提供帮助:
- 删除 cordova-plugin-whitelist - 版本 10 不支持它。
- 在 SDK 平台管理器中 - 需要下载 API 级别;
- 在 SDK 工具管理器中 - 下载所需的构建工具版本;