将Cordova Android项目迁移到AndroidX

时间:2019-12-20 17:23:56

标签: android cordova google-play-services androidx cordova-cli

我目前正在测试带有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”'以进行覆盖。

失败:构建失败,并出现异常。

  • 出了什么问题: 任务':app:processDebugManifest'的执行失败。
      

    清单合并失败:来自[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是正确的,但我看不到如何。对于能够解释不需要其他插件就能使事情正常工作的所有人,我将深表感谢。

4 个答案:

答案 0 :(得分:7)

请阅读: https://cordova.apache.org/announcements/2020/06/29/cordova-android-9.0.0.html

可以肯定:

  • 清除您的 gradle 缓存目录(在 home/.gradle/caches 中)
  • 删除和添加android平台
  • 按照上述文章检查您的要求

然后:

在您的 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,请先考虑以下语句

  

独立的Jetifier工具迁移依赖于支持库的库,改为依赖等效的AndroidX软件包。

Google documentation中的

。考虑到您正在考虑自己旋转,因为您不使用其他外部的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,您已完成转换!

相关问题