Используйте зависимости MotionLayout и ConstraintLayout с разными версиями - PullRequest
0 голосов
/ 25 сентября 2019

Я уже давно использую ConstraintLayout версии 1.1.2, и он работал отлично.Затем появился новый MotionLayout, и я подумал, почему бы не попробовать его.

И все казалось хорошо.Поэтому я допустил ошибку при использовании его в производстве.Только через некоторое время я заметил сообщения об ошибках, в которых ConstraintLayout работал некорректно.Но уже есть некоторые экраны, которые зависят от MotionLayout и просто удалить его потребуется много рефакторинга.

Могу ли я использовать MotionLayout (v2.0.0-alpha-05 / beta-02) и ConstraintLayout (v1.1.3) в одном проекте, чтобы экраны, для которых требуется MotionLayout, имели версию 2.0 и экраны с ConstraintLayoutтолько бы v1.1.3?Есть ли какой-нибудь упаковочный инструмент для перемещения MotionLayout в другую упаковку?Я попытался использовать плагин gradle shadowJar, но не смог, потому что MotionLayout является зависимостью * .aar, а не * .jar.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Редактировать : я создал образец , где я использую плагин gratif для jetifier из aosp, чтобы переписать имена пакетов и продемонстрировать, как использовать оба 1.1.3 и 2.0.0-beta версии в одном проекте.

Вы можете использовать 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": {}
  }
}

Вы можете проверить оригинальный файл конфигурации для определения формата файла.

После этого вы можете использовать myconstraintlayout-2.0.0-beta2.aar и myconstraintlayout-solver-2.0.0-beta2.jar в вашем проекте.Очевидно, вам придется изменить имя пакета на MotionLayout в вашем проекте.

Должна быть возможность автоматизировать процесс, написав также плагин gradle.

Редактировать: вероятно, лучшепереупаковка constraintlayout-1.1.3, так что вы можете легко обновить MotionLayout новыми версиями после их выпуска.

0 голосов
/ 28 сентября 2019

Я столкнулся с похожими проблемами - единственный возможный способ избежать коллизии классов - это перестроить одну из зависимостей с другим именем пакета.Это можно сделать, загрузив код одной из библиотек и перекомпилировав его вручную на своем ПК.Например, из здесь .

Но я бы порекомендовал вам использовать 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, поэтому они не будут создавать конфликт в вашем коде.Однако в вашем текущем коде могут потребоваться небольшие корректировки.

Надеюсь, это поможет.

...