我目前正在测试带有AdMob测试广告的混合Cordova / Android应用。该应用程序使用了一个自定义(即内部)插件,可以从中访问Google Play服务AdMob API。 plugin.xml
文件的相关位如下
<platform name="android">
<preference name="PLAY_SERVICES_VERSION" default="17.2.0"/>
<preference name="ADMOB_APP_ID" default="ca-app-pub-...."/>
<framework src="com.android.support:appcompat-v7:27.1.0" />
<framework src="com.google.android.gms:play-services-ads:17.2.0"/>
该应用的config.xml
文件声明以下内容
<preference name="android-minSdkVersion" value="23" />
<preference name="android-targetSdkVersion" value="28" />
讨论here之后,将加载并显示奖励视频广告的Java代码。
虽然这行得通,但令我感到困扰的是,我使用的是相当古老的play-services-ads
API。问题是,如果我尝试根据说明shown here升级到最新的API。我修改过的plugin.xml
文件反映了使用最新API所需的更改
<platform name="android">
<preference name="PLAY_SERVICES_VERSION" default="18.3.0"/>
<preference name="ADMOB_APP_ID" default="ca-app-pub-..."/>
<framework src="com.android.support:appcompat-v7:28.0.0" />
<framework src="com.google.android.gms:play-services-ads:18.3.0"/>
问题是我不再能够编译该应用程序。科尔多瓦CLI报告了一系列问题,我将在下面显示
以退出代码1填充错误输出: 注意:path \ to \ app \ platforms \ android \ CordovaLib \ src \ org \ apache \ cordova \ engine \ SystemCookieManager.java使用或覆盖已弃用的API。 注意:有关详细信息,请使用-Xlint:deprecation重新编译。 路径\到\ app \平台\ android \ app \ src \ main \ AndroidManifest.xml:22:18-86错误: 来自[androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86的属性application @ appComponentFactory value =(androidx.core.app.CoreComponentFactory) 也出现在[com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91 value =(android.support.v4.app.CoreComponentFactory)。 建议:在AndroidManifest.xml:4:5-21:19的元素上添加'tools:replace =“ android:appComponentFactory”'以进行覆盖。
失败:构建失败,并出现异常。
清单合并失败:来自[androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86的属性application @ appComponentFactory value =(androidx.core.app.CoreComponentFactory) 也出现在[com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91 value =(android.support.v4.app.CoreComponentFactory)。 建议:在AndroidManifest.xml:4:5-21:19的元素上添加'tools:replace =“ android:appComponentFactory”'以进行覆盖。
我将问题缩小到gms:play-services-ads
,似乎引入了与旧式android库不兼容的androidx
库。上面的Gradle的有用建议-** add tools:replace =“ android:appComponentFactory **没用,因为tools:replace
节点的application
属性未被识别。
我已经实施的有效解决方案如下
我在build-extras.gradle
下用行
path/to/myapp/platforms/android
文件
android.useAndroidX = true android.enableJetifier = true
作为权宜之计,我使用了this plugin来处理androidx和android库之间的不兼容性。虽然这样做有效,但我不太热衷于使用其他插件。我怀疑此插件所做的全部工作是确保AndroidManifest.xml是正确的,但我看不到如何。对于能够解释不需要其他插件就能使事情正常工作的所有人,我将深表感谢。
答案 0 :(得分:7)
请阅读: https://cordova.apache.org/announcements/2020/06/29/cordova-android-9.0.0.html
可以肯定:
然后:
在您的 config.xml 中添加以下内容:
<preference name="AndroidXEnabled" value="true" />
<preference name="GradlePluginKotlinEnabled" value="true" />
<preference name="GradlePluginKotlinCodeStyle" value="official" />
<preference name="GradlePluginKotlinVersion" value="1.3.50" />
(AndroidXEnabled 首选项在gradle.properties中添加jetifyer和androidX)
你的构建现在应该可以工作了
答案 1 :(得分:0)
该插件的作用是搜索node_modules中的所有插件,并修补所有插件代码的用法和依赖项,以使用等效的Android X。
因此,您可以更新所有使用旧的android支持库而不是android X的插件,或者使用诸如jetifier之类的工具执行与插件相同的工作,或者继续使用该插件。
答案 2 :(得分:0)
这是做这件事的简便方法
“为了防止由于包含不同版本的Play服务库组件而导致的构建失败。” https://github.com/dpa99c/cordova-android-play-services-gradle-release
“此Cordova / Phonegap插件可在Cordova项目中启用AndroidX” https://github.com/dpa99c/cordova-plugin-androidx
“如果您的Cordova项目包含同时引用Android支持库和AndroidX的插件/库,则您的Android构建将失败,因为两者不能同时存在于Android构建中。” https://github.com/dpa99c/cordova-plugin-androidx-adapter
Ps:我不是维护者
答案 3 :(得分:0)
为了让遇到此线程的任何人受益-如果您有一个带有多个第三方插件的Cordova应用程序,则最好使用我上面提到的dpa99 androidx adapter。如果像我一样,如果您仅依靠自己的插件切换到使用AndroidX来代替旧版的Android支持库,那将很容易。
第1步
在path/to/project/platforms/android
中创建一个名为build-extras.gradle
的文件,并对其进行编辑以包含以下内容
android.useAndroidX=true
android.enableJetifier=false
第一行不言自明。要了解enableJetifier
,请先考虑以下语句
Google documentation中的独立的Jetifier工具迁移依赖于支持库的库,改为依赖等效的AndroidX软件包。
。考虑到您正在考虑自己旋转,因为您不使用其他外部的Cordova插件,因此不需要启用Jetifier。
第2步
完成此操作后,剩下要做的就是替换
<framework src="com.android.support:appcompat-v7:28.0.0" />
您自己的plugin.xml
文件中的
<framework src="androidx.appcompat:appcompat:1.0.0" />
第3步
最后继续替换所有较早的本机Android库-例如播放服务广告-您当前使用的最新版本现在都在使用AndroidX。现在运行cordova build android
,您已完成转换!