首页 > 解决方案 > 使用不同版本的 MotionLayout 和 ConstraintLayout 依赖项

问题描述

我已经使用 1.1.2 版的 ConstraintLayout 有一段时间了。它工作得很好。然后出现了新的 MotionLayout,我想为什么不尝试一下。一切似乎都很好。

但是我在生产中使用它时犯了一个错误。过了一段时间,我才注意到有关 ConstraintLayout 的一些错误报告无法正常工作。但是已经有一些屏幕依赖于 MotionLayout,删除它们会导致大量的重构。

是否可以将 MotionLayout(v2.0.0-alpha-05/beta-02) 和 ConstraintLayout(v1.1.3) 用于同一个项目,以便与 MotionLayout 一起使用的屏幕将具有 v2.0.0 和仅与 ConstraintLayout 一起使用的屏幕会有v1.1.3吗?是否有一些打包工具可以将 MotionLayout 移动到不同的包中?我尝试使用 shadowJar gradle 插件但失败了,因为 MotionLayout 是 *.aar 依赖而不是 *.jar。

标签: androidandroid-layoutkotlinandroid-gradle-pluginandroid-motionlayout

解决方案


编辑:我创建了一个示例,我使用来自 aosp 的jetifier gradle 插件来重写包名称并演示如何在同一个项目中同时使用它们1.1.32.0.0-beta版本。

您可以使用带有自定义配置文件的 jetifier来重写包名称。只需在两者上运行它constraintlayout-2.0.0-beta2.aarconstraintlayout-solver-2.0.0-beta2.jar就像这样:

./jetifier-standalone  -i constraintlayout-2.0.0-beta2.aar -o myconstraintlayout-2.0.0-beta2.aar -c config.json
./jetifier-standalone  -i constraintlayout-solver-2.0.0-beta2.jar -o myconstraintlayout-solver-2.0.0-beta2.jar -c config.json

config.json像这样的自定义配置在哪里:

{
  "restrictToPackagePrefixes": [
    "androidx/"
  ],
  "reversedRestrictToPackagePrefixes": [],
  "rules": [
    {
      "from": "androidx/(.*)",
      "to": "myandroidx/{0}"
    },
  ],
  "packageMap": [
    {
      "from": "androidx/constraintlayout/widget",
      "to": "myandroidx/constraintlayout/widget"
    }
  ],
  "pomRules": [],
  "versions": {
    "latestReleased": {}
  },
  "map": {
    "types": {}
  },
  "proGuardMap": {
    "rules": {
      "androidx/{any}": [
        "myandroidx/{any}"
      ]
    }
  },
  "stringsMap": {
    "types": {}
  }
}

您可以检查原始配置文件以找出文件格式。

之后,您可以在您的项目中使用myconstraintlayout-2.0.0-beta2.aar和。myconstraintlayout-solver-2.0.0-beta2.jar显然,您必须MotionLayout在项目中更改包名称。

应该可以通过编写一个 gradle 插件来自动化这个过程。

编辑:重新打包可能会更好constraintlayout-1.1.3,因此您可以在新版本发布时轻松更新MotionLayout它们。


推荐阅读