Pull to refresh

Переходим на Androidx или увлекательное путешествие по граблям

Reading time3 min
Views25K
Тема перехода на Androidx сейчас витает в воздухе. Уже есть коротенькая статья на английском от Daniel Lew, есть доклад. Но все они довольно поверхностно рассматривают сценарий перехода описанный в документации Google.

Я же хочу поделиться своим опытом. В моем проекте используются 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, и получите кучу ошибок. Это директивы импорта в ваших классах, ссылаются на старые пакеты, нужно их поменять в соответствии с этой таблицей.

Итак, поскольку студия не смогла заменить все зависимости (возможно у вас смогла, тогда вас можно поздравить), при попытке собрать проект, вы увидите похожий список ошибок:


Открыв класс с ошибками, мы увидим примерно такую картину:


Удаляем устаревшие зависимости, и по хоткею 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.
Tags:
Hubs:
Total votes 8: ↑7 and ↓1+6
Comments3

Articles