Тема перехода на Androidx сейчас витает в воздухе. Уже есть коротенькая статья на английском от Daniel Lew, есть доклад. Но все они довольно поверхностно рассматривают сценарий перехода описанный в документации Google.
Я же хочу поделиться своим опытом. В моем проекте используются Moxy и Cicerone, считаю свой опыт интересным, потому что в официальных телеграмм-каналах этих библиотек периодически всплывает вопрос, когда же они будут переведены на Androidx.
Для того чтобы перевести проект на Androidx нужно выполнить несколько простых шагов:
1. Установить compileSdkVersion 28 и targetSdkVersion 28, обновить все саппорт-библиотеки до последних версий.
2. В файле gradle.properties добавить строки:
3. Если вы уже используете Android Studio 3.2 то воспользуйтесь рефакторингом:
Он сделает для вас большую (или меньшую) часть работы.
Если вы, по какой-то причине не используете Git, или другую систему контроля версий, то на этом этапе у вас будет шанс сделать архив проекта:
Жмем кнопку Migrate, выбираем куда сохранять архив, и через некоторое время, получаем результат проверки проекта перед рефакторингом:
Здесь мы видим, какие зависимости в build.gradle и в директивах импорта будут заменены. На примере класса MainActivity, как можно видеть на скриншоте выше, будет заменена одна зависимость: android.support.v4.view.GravityCompat, но, если мы откроем этот класс, то увидим, что фактически там есть еще три зависимости которые надо заменить:
Я не понял, в чем причина такого избирательного поведения, но эти зависимости придется исправлять вручную. Жмем «Do Refactor».
Итак, поскольку студия не смогла заменить все зависимости (возможно у вас смогла, тогда вас можно поздравить), при попытке собрать проект, вы увидите похожий список ошибок:
Открыв класс с ошибками, мы увидим примерно такую картину:
Удаляем устаревшие зависимости, и по хоткею Alt+Enter импортируем классы из пакета androidx
Таким образом исправляем все классы. Если ошибка не связана с «импортом», не обращайте на неё внимание, скорее всего она из-за тех же проблем в другом классе.
Например:
Здесь ошибки связаны с тем, что в классе TimelineView тоже нужно устранить проблемы с импортом. Когда все ошибки будут исправлены, снова выполняем билд проекта, и возможно, снова получаем список ошибок, только уже в других классах, процесс итеративно продолжаем.
На ошибки с классами, которые генерируются (Dagger или DataBinding), на этом этапе не обращайте внимания. Если ошибок в ваших классах не осталось, а студия ругается только на генерированный код, то нужно выполнить Clean Project и Rebuild Project.
Если это не помогает, можно попробовать очистить кэш студии:
Очистить кэш вам придется, как минимум один раз, чтобы корректно создались классы которые генерируют DataBinding или Room.
Вообще, флаг android.enableJetifier=true мы устанавливали как раз для того, чтобы на этапе сборки проекта, зависимости внешних библиотек подменялись на соответствующие зависимости AndroidX автоматически, но, у меня этого почему-то не происходит.
В любом случае, прежде чем заниматься тем, что описано ниже, убедитесь, что у вас есть эта проблема, и что последние версии используемых вами библиотек еще не переведены на AndroidX.
MainActivity в моем проекте наследуется от MvpAppCompatActivity это класс Moxy, которая, на момент написания статьи, еще не переведена на AndroidX. Чтобы решить эту проблему, я скопировал класс к себе в проект, в отдельный пакет androidx, и исправил зависимости в нем. Имя класса лучше оставить без изменений, так будет проще обновлять зависимости.
Ту же процедуру нужно проделать и для фрагментов, для класса MvpAppCompatFragment.
Обратите внимание, что в этих классах есть дженерик, в поле mMvpDelegate, не забудьте поправить зависимость в нем, её легко не заметить, потому что это зависимость от класса Moxy, а не от класса саппорт-библиотеки.
Для решения проблем с Cicerone мне пришлось создать у себя в проекте копию класса SupportAppScreen и SupportAppNavigator. Обратите внимание, что класс SupportAppNavigator зависит от SupportAppScreen. Не забудьте исправить эту зависимость на свою копию.
Переход на AndroidX, увлекательное занятие, и возможно, если у вас нет острой необходимости, стоит немного повременить с ним. Ведь потом, когда большая часть граблей будет убрана с вашего пути, сделать это будет легче и быстрее. Но лично я доволен, что прошел этот путь, шишки на лбу заживут, а полезный опыт останется со мной.
Я же хочу поделиться своим опытом. В моем проекте используются Moxy и Cicerone, считаю свой опыт интересным, потому что в официальных телеграмм-каналах этих библиотек периодически всплывает вопрос, когда же они будут переведены на Androidx.
Just Migrate to AndroidX...
Для того чтобы перевести проект на Androidx нужно выполнить несколько простых шагов:
1. Установить compileSdkVersion 28 и targetSdkVersion 28, обновить все саппорт-библиотеки до последних версий.
2. В файле gradle.properties добавить строки:
android.useAndroidX=true
android.enableJetifier=true
3. Если вы уже используете Android Studio 3.2 то воспользуйтесь рефакторингом:
Он сделает для вас большую (или меньшую) часть работы.
Если вы, по какой-то причине не используете Git, или другую систему контроля версий, то на этом этапе у вас будет шанс сделать архив проекта:
Жмем кнопку Migrate, выбираем куда сохранять архив, и через некоторое время, получаем результат проверки проекта перед рефакторингом:
Здесь мы видим, какие зависимости в build.gradle и в директивах импорта будут заменены. На примере класса MainActivity, как можно видеть на скриншоте выше, будет заменена одна зависимость: android.support.v4.view.GravityCompat, но, если мы откроем этот класс, то увидим, что фактически там есть еще три зависимости которые надо заменить:
Я не понял, в чем причина такого избирательного поведения, но эти зависимости придется исправлять вручную. Жмем «Do Refactor».
Если не используете Android Studio 3.2, то все зависимости правим вручную
Надо будет изменить зависимости в build.gradle (для наглядности я закомментировал старые зависимости):
С полным списком замен можно ознакомиться здесь.
Затем выполните синхронизацию проекта с Gradle, и получите кучу ошибок. Это директивы импорта в ваших классах, ссылаются на старые пакеты, нужно их поменять в соответствии с этой таблицей.
С полным списком замен можно ознакомиться здесь.
Затем выполните синхронизацию проекта с Gradle, и получите кучу ошибок. Это директивы импорта в ваших классах, ссылаются на старые пакеты, нужно их поменять в соответствии с этой таблицей.
Итак, поскольку студия не смогла заменить все зависимости (возможно у вас смогла, тогда вас можно поздравить), при попытке собрать проект, вы увидите похожий список ошибок:
Открыв класс с ошибками, мы увидим примерно такую картину:
Удаляем устаревшие зависимости, и по хоткею Alt+Enter импортируем классы из пакета androidx
Таким образом исправляем все классы. Если ошибка не связана с «импортом», не обращайте на неё внимание, скорее всего она из-за тех же проблем в другом классе.
Например:
Здесь ошибки связаны с тем, что в классе TimelineView тоже нужно устранить проблемы с импортом. Когда все ошибки будут исправлены, снова выполняем билд проекта, и возможно, снова получаем список ошибок, только уже в других классах, процесс итеративно продолжаем.
На ошибки с классами, которые генерируются (Dagger или DataBinding), на этом этапе не обращайте внимания. Если ошибок в ваших классах не осталось, а студия ругается только на генерированный код, то нужно выполнить Clean Project и Rebuild Project.
Если это не помогает, можно попробовать очистить кэш студии:
Очистить кэш вам придется, как минимум один раз, чтобы корректно создались классы которые генерируют DataBinding или Room.
Внешние библиотеки
Вообще, флаг android.enableJetifier=true мы устанавливали как раз для того, чтобы на этапе сборки проекта, зависимости внешних библиотек подменялись на соответствующие зависимости AndroidX автоматически, но, у меня этого почему-то не происходит.
В любом случае, прежде чем заниматься тем, что описано ниже, убедитесь, что у вас есть эта проблема, и что последние версии используемых вами библиотек еще не переведены на AndroidX.
Moxy
MainActivity в моем проекте наследуется от MvpAppCompatActivity это класс Moxy, которая, на момент написания статьи, еще не переведена на AndroidX. Чтобы решить эту проблему, я скопировал класс к себе в проект, в отдельный пакет androidx, и исправил зависимости в нем. Имя класса лучше оставить без изменений, так будет проще обновлять зависимости.
Ту же процедуру нужно проделать и для фрагментов, для класса MvpAppCompatFragment.
Обратите внимание, что в этих классах есть дженерик, в поле mMvpDelegate, не забудьте поправить зависимость в нем, её легко не заметить, потому что это зависимость от класса Moxy, а не от класса саппорт-библиотеки.
Cicerone
Для решения проблем с Cicerone мне пришлось создать у себя в проекте копию класса SupportAppScreen и SupportAppNavigator. Обратите внимание, что класс SupportAppNavigator зависит от SupportAppScreen. Не забудьте исправить эту зависимость на свою копию.
Выводы
Переход на AndroidX, увлекательное занятие, и возможно, если у вас нет острой необходимости, стоит немного повременить с ним. Ведь потом, когда большая часть граблей будет убрана с вашего пути, сделать это будет легче и быстрее. Но лично я доволен, что прошел этот путь, шишки на лбу заживут, а полезный опыт останется со мной.
Only registered users can participate in poll. Log in, please.
А вы уже перешли на AndroidX?
23.24% Да, были похожие проблемы.33
2.11% Да, и это еще не главные грабли, поделюсь в комментариях.3
19.01% Да, но всё было гораздо проще.27
11.97% Нет, но как раз сейчас этим займусь.17
26.76% Нет, подожду когда это будет сделать проще.38
16.9% Нет, вообще не понимаю зачем это, и так всё работает.24
142 users voted. 28 users abstained.