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

Droidcon London. Как это было

Droidcon London. Как это было - 1

На днях в Лондоне прошла конференция 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 фунтов в день.

Droidcon London. Как это было - 2

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

Droidcon London. Как это было - 3

Droidcon London. Как это было - 4

Доклады
Расписание, на мой взгляд, было составлено очень хорошо, так как в любое время находились интересные доклады. К тому же постоянно проходили воркшопы.
А вот от уровня докладов я ожидал большего. Многие из них были без какой-либо практической составляющей, например, просто описание какого-то 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].

Droidcon London. Как это было - 5

Redux on Android
Ниш Тахир (Nish Tahir), WillowTree

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

Droidcon London. Как это было - 6

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 это едва ощутимая работа.

Так выглядят реализации Binder в версии ButterKnife с рефлексией

@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 умеет создавать вью с этими сложными конструкторами.

Как это выглядит в коде:

MainActivity.java

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.

GalleryView

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.

Пример использования:

UserPresenter.java

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);
    }

    ...
}

UserActivity.java

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