使用不同版本的 MotionLayout 和 ConstraintLayout 依赖项

Use MotionLayout and ConstraintLayout dependencies with different versions

我已经使用 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.

我遇到了类似的问题 - 避免 class 冲突的唯一可能方法是使用不同的包名称重建依赖项之一。这可以通过下载其中一个库的代码并在您的 PC 上手动重新编译来完成。例如来自 here.

但我建议您使用 ConstraintLayout 库版本 2.0

implementation 'com.android.support.constraint:constraint-layout:2.0.0-beta2'

implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2'

如果您使用的是 AndroidX。

Is 同时包含 ConstraintLayoutMotionLayout,因此它们不会在您的代码中造成冲突。不过,您当前的代码可能需要进行一些小的调整。

希望对您有所帮助。

编辑: 我从 aosp 创建了 a sample where I use jetifier gradle plugin 以重写包名称并演示如何在同一个项目中同时使用 1.1.32.0.0-beta 版本。

您可以使用带有 custom config file 的 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": {}
  }
}

您可以检查 original config file 以找出文件格式。

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

应该也可以通过编写 gradle 插件来自动执行该过程。

编辑:重新打包 constraintlayout-1.1.3 可能更好,这样您可以在新版本发布时轻松更新 MotionLayout