使用不同版本的 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 同时包含 ConstraintLayout
和 MotionLayout
,因此它们不会在您的代码中造成冲突。不过,您当前的代码可能需要进行一些小的调整。
希望对您有所帮助。
编辑:
我从 aosp 创建了 a sample where I use jetifier gradle plugin 以重写包名称并演示如何在同一个项目中同时使用 1.1.3
和 2.0.0-beta
版本。
您可以使用带有 custom config file 的 jetifier 来重写包名。 运行 它在 constraintlayout-2.0.0-beta2.aar
和 constraintlayout-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.aar
和myconstraintlayout-solver-2.0.0-beta2.jar
了。显然,您必须在项目中更改 MotionLayout
的包名称。
应该也可以通过编写 gradle 插件来自动执行该过程。
编辑:重新打包 constraintlayout-1.1.3
可能更好,这样您可以在新版本发布时轻松更新 MotionLayout
。
我已经使用 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 同时包含 ConstraintLayout
和 MotionLayout
,因此它们不会在您的代码中造成冲突。不过,您当前的代码可能需要进行一些小的调整。
希望对您有所帮助。
编辑:
我从 aosp 创建了 a sample where I use jetifier gradle plugin 以重写包名称并演示如何在同一个项目中同时使用 1.1.3
和 2.0.0-beta
版本。
您可以使用带有 custom config file 的 jetifier 来重写包名。 运行 它在 constraintlayout-2.0.0-beta2.aar
和 constraintlayout-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.aar
和myconstraintlayout-solver-2.0.0-beta2.jar
了。显然,您必须在项目中更改 MotionLayout
的包名称。
应该也可以通过编写 gradle 插件来自动执行该过程。
编辑:重新打包 constraintlayout-1.1.3
可能更好,这样您可以在新版本发布时轻松更新 MotionLayout
。