- PVSM.RU - https://www.pvsm.ru -

На днях в Лондоне прошла конференция droidcon. Её не обошли стороной такие модные темы, как Redux, MVI, оптимизация скорости сборки и возможности Gradle. Открывал мероприятие доклад Чета Хаазе (Chet Haase) и Ромена Ги (Romain Guy) про фрагментацию памяти и отличия Garbage Collector между версиями Android, а Джейк Уортон (Jake Wharton) выступил с презентацией про Dagger.
В этом обзоре я хочу поделиться своими впечатлениями от конференции и деталями этих докладов.
Я много слышал о лондонской droidcon, но до сих пор не удавалось её посетить, так как она выходит значительно дороже, чем, например, droidcon Berlin, не говоря уже о московских конференциях. В тоже время уровень российских конференций, таких как droidcon, Mobius, AppsConf, в последние годы сильно вырос, и мне хотелось сравнить атмосферу, уровень организации и докладов с зарубежными аналогами.
Но обо всем по порядку.
Билеты
Если покупать билет заранее, то можно взять его и за 230 фунтов + VAT. Окончательная цена была на них около 700 фунтов, включая VAT. Довольно дорого, если сравнивать с билетами на российские конференции, но в среднем для Европы это адекватная цена. Перелёт обойдётся примерно в 30 тысяч рублей, но есть возможность сэкономить, так как сейчас туда летает «Победа», и можно купить билет приблизительно за 6000 рублей в одну сторону.
Проживание
Жили мы в 15 минутах ходьбы от места проведения. Отель среднего уровня, около 150 фунтов в день. На самом деле, если вы не слишком требовательны, то можно жить и в каком-нибудь хостеле в центре города за 20 фунтов в день.

Организация
В плане организации конференция была на достаточно высоком уровне. Понравилась и сама площадка: просторный холл для общения и морального отдыха, комфортные аудитории, в которых читались доклады. В холле было много стендов различных компаний, где можно было взять пару ручек и футболок. Вечером первого дня организаторы устраивали вечеринку. Были бесплатные напитки и музыка, мы же пошли гулять по Лондону.


Доклады
Расписание, на мой взгляд, было составлено очень хорошо, так как в любое время находились интересные доклады. К тому же постоянно проходили воркшопы.
А вот от уровня докладов я ожидал большего. Многие из них были без какой-либо практической составляющей, например, просто описание какого-то API или функционала. Уровень докладов на московских конференциях как минимум не ниже. Было несколько довольно сильных и актуальных выступлений. Далее я напишу о тех, которые мне показались наиболее интересными.
Подробнее о докладах
Keynote — Trash Talk: The Evolution of Garbage Collection on Android
Чет Хаазе и Ромен Ги (Chet Haase and Romain Guy), Google
Началась конференция с очень хорошего доклада про модель памяти в Android. Ребята рассказали, как она изменялась от версии к версии, по каким причинам это происходило. Не буду здесь раскрывать детали, но рекомендую к просмотру видео [1].
Modularization — How Hard Can It Be?
Элин Нильсон (Elin Nilsson), Spotify
Не совсем технический, а больше мотивационный, но от этого не менее интересный доклад. Элин рассказала о причинах, которые заставили их задуматься о разделении монолитного приложения на модули, как тяжело оно проходило и что из этого вышло в плане количества кода, процессов и скорости сборки. Ссылка на доклад [2].

Redux on Android
Ниш Тахир (Nish Tahir), WillowTree
Не скажу, что этот доклад как-то открыл глаза на Redux, но, по-моему, автор хорошо раскрыл суть этого решения, рассказал о проблемах и о том, стоит ли выбирать Redux как основной архитектурный паттерн и в каких случаях это оправданно. Ссылка на доклад [3]

Modern Data Binding
Йигит Бойар и Хосе Альсерека (Yigit Boyar and Jose Alcerreca), Google
Интересно было послушать доклад про инструменты от Google из уст самих разработчиков. В принципе, ничего нового они не сказали, желания использовать Data Binding тоже не появилось, но за попытку спасибо. Ссылка на доклад [4]
Deep Dive into the Android Gradle Plugin
Джон Родригес (John Rodriguez), Square Cash
Этот доклад был одним из последних на конференции, и я уже был не готов воспринимать интересную и познавательную информацию, но тут вышел Джон и сделал хороший и довольно хардкорный доклад про интересные нюансы Android Gradle Plugin. Его тоже рекомендую к просмотру [5].
Helping Dagger Help You
Джейк Уортон (Jake Wharton), Google
Хороший доклад получился у Джека Уортона. Вместе со Square они сделали несколько удобных библиотек для использования с Dagger, которые решают ряд проблем разработчиков.
Вo-первых, сейчас много внимания уделяется проблеме скорости сборки. Для Dagger и ButterKnife это особенно актуально, так как они используют annotation processor и kapt. Square презентовали решение, при котором реализации Dagger и ButterKnife работают на рефлексии вместо кодогенерации. Это немного уменьшает скорость приложения runtime, но зато экономится время на compile time, и в рамках dev-билдов это вполне оправданно, так как для последних моделей Pixel и Samsung это едва ощутимая работа.
@NonNull @UiThread
public static Unbinder bind(@NonNull Object target, @NonNull View source) {
List<Unbinder> unbinders = new ArrayList<>();
Class<?> targetClass = target.getClass();
if ((targetClass.getModifiers() & PRIVATE) != 0) {
throw new IllegalArgumentException(targetClass.getName() + " must not be private.");
}
while (true) {
for (Field field : targetClass.getDeclaredFields()) {
int unbinderStartingSize = unbinders.size();
Unbinder unbinder;
unbinder = parseBindView(target, field, source);
if (unbinder != null) unbinders.add(unbinder);
unbinder = parseBindViews(target, field, source);
if (unbinder != null) unbinders.add(unbinder);
unbinder = parseBindDrawable(target, field, source);
if (unbinder != null) unbinders.add(unbinder);
unbinder = parseBindString(target, field, source);
if (unbinder != null) unbinders.add(unbinder);
...
}
for (Method method : targetClass.getDeclaredMethods()) {
Unbinder unbinder;
unbinder = parseOnCheckedChanged(target, method, source);
if (unbinder != null) unbinders.add(unbinder);
unbinder = parseOnClick(target, method, source);
if (unbinder != null) unbinders.add(unbinder);
...
}
targetClass = targetClass.getSuperclass();
}
return new CompositeUnbinder(unbinders);
}
Библиотеку для ButterKnife можно взять по этой [6] ссылке. Версию для Dagger где-то здесь [7].
Во-вторых, иногда появляется необходимость инжектить зависимости в кастомные вью, которые объявлены в XML. Раньше приходилось инжектить их через set-методы ипрокидывать через классы извне, например, в презентере, когда он аттачится к вью. Сейчас для этого есть удобный способ: зависимости можно прокидывать через конструктор сразу за обязательными параметрами, а кастомный LayoutInfater умеет создавать вью с этими сложными конструкторами.
Как это выглядит в коде:
public final class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MainComponent component = DaggerMainActivity_MainComponent.create();
InflationInjectFactory factory = component.getInjectFactory();
getLayoutInflater().setFactory(factory);
setContentView(R.layout.main_activity);
GalleryPresenter presenter = component.getGalleryPresenter();
GalleryView view = findViewById(R.id.gallery);
presenter.attach(view);
}
@Component(modules = ViewModule.class)
interface MainComponent {
InflationInjectFactory getInjectFactory();
GalleryPresenter getGalleryPresenter();
}
}
GalleryView прописывается в xml.
public final class GalleryView extends LinearLayout {
private final ViewUpdater mViewUpdater;
@InflationInject
public GalleryView(@Assisted Context context, @Assisted AttributeSet attrs, ViewUpdater viewUpdater) {
super(context, attrs);
mViewUpdater = viewUpdater;
}
}
В-третьих, в Square по-своему подошли к проблеме, которую решает AutoValue, а именно к созданию фабрик для классов с тяжелыми конструкторами. Только это решение максимально интегрировано в логику Dagger.
Пример использования:
public final class UserPresenter {
private final LoadUserInteractor mLoadUserInteractor;
private final String mUserId;
@AssistedInject
UserPresenter(@Assisted LoadUserInteractor loadUserInteractor, @Exclamation String userid) {
mLoadUserInteractor = loadUserInteractor;
mUserId = userid;
}
@AssistedInject.Factory
public interface Factory {
UserPresenter create(String greeting);
}
...
}
public final class UserActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_view);
UserPresenter.Factory factory = DaggerUserActivity_ UserComponent.create().getUserPresenterFctory();
UserPresenter presenter = factory.create(getIntent().getStringExtra("user_id"));
presenter.attach();
...
}
@Component(modules = UserModule.class)
interface UserComponent {
UserPresenter.Factory getUserPresenterFctory();
}
}
Мне понравилось, как легко выглядят реализации этих злободневных решений. Тоже советую к просмотру [8].
Несомненно, я почерпнул что-то интересное для себя из докладов конференции, пообщался с коллегами из разных компаний, что является большим плюсом именно международной конференции, и именно ради нетворкинга стоит ехать на них. В качестве бонуса в этот раз было и посещение Лондона. Если говорить о докладах, то проще посмотреть их онлайн или посетить одну из многочисленных российских конференций.
Автор: metrolog_ma
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/android/297843
Ссылки в тексте:
[1] видео: https://skillsmatter.com/skillscasts/11125-android-keynote-a-keynote-presentation-about-android
[2] доклад: https://skillsmatter.com/skillscasts/12186-modularization-how-hard-can-it-be
[3] доклад: https://skillsmatter.com/skillscasts/12453-redux-on-android
[4] доклад: https://skillsmatter.com/skillscasts/12713-modern-data-binding
[5] просмотру: https://skillsmatter.com/skillscasts/12718-deep-dive-into-the-android-gradle-plugin#video
[6] этой: https://github.com/JakeWharton/butterknife/tree/master/butterknife-reflect
[7] здесь: https://github.com/JakeWharton/SdkSearch/tree/master/dagger-reflect
[8] просмотру: https://skillsmatter.com/skillscasts/11617-helping-dagger-help-you#video
[9] Источник: https://habr.com/post/428562/?utm_campaign=428562
Нажмите здесь для печати.