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

djm8l2ofjlympspc-hsencm6u7c.jpeg

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


rw51kp3fn95hnz5fy6jy8nitbwu.jpeg

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

gwymzhfrbvncjzq1r2e51thf2fi.jpeg

nxujremjuvxwx4wcpgsz-v32178.jpeg

Доклады
Расписание, на мой взгляд, было составлено очень хорошо, так как в любое время находились интересные доклады. К тому же постоянно проходили воркшопы.
А вот от уровня докладов я ожидал большего. Многие из них были без какой-либо практической составляющей, например, просто описание какого-то API или функционала. Уровень докладов на московских конференциях как минимум не ниже. Было несколько довольно сильных и актуальных выступлений. Далее я напишу о тех, которые мне показались наиболее интересными.

Подробнее о докладах

Keynote — Trash Talk: The Evolution of Garbage Collection on Android
Чет Хаазе и Ромен Ги (Chet Haase and Romain Guy), Google

Началась конференция с очень хорошего доклада про модель памяти в Android. Ребята рассказали, как она изменялась от версии к версии, по каким причинам это происходило. Не буду здесь раскрывать детали, но рекомендую к просмотру видео.

Modularization — How Hard Can It Be?
Элин Нильсон (Elin Nilsson), Spotify

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

ymdnpjpzhdg_ehz8oxunhp1vmfm.jpeg

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

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

x2ast39dlcvykg_dcr9mogbp5cs.jpeg

Modern Data Binding
Йигит Бойар и Хосе Альсерека (Yigit Boyar and Jose Alcerreca), Google

Интересно было послушать доклад про инструменты от Google из уст самих разработчиков. В принципе, ничего нового они не сказали, желания использовать Data Binding тоже не появилось, но за попытку спасибо. Ссылка на доклад

Deep Dive into the Android Gradle Plugin
Джон Родригес (John Rodriguez), Square Cash

Этот доклад был одним из последних на конференции, и я уже был не готов воспринимать интересную и познавательную информацию, но тут вышел Джон и сделал хороший и довольно хардкорный доклад про интересные нюансы Android Gradle Plugin. Его тоже рекомендую к просмотру.

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 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 можно взять по этой ссылке. Версию для Dagger где-то здесь.

Во-вторых, иногда появляется необходимость инжектить зависимости в кастомные вью, которые объявлены в 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();
    }
}

Мне понравилось, как легко выглядят реализации этих злободневных решений. Тоже советую к просмотру.

Несомненно, я почерпнул что-то интересное для себя из докладов конференции, пообщался с коллегами из разных компаний, что является большим плюсом именно международной конференции, и именно ради нетворкинга стоит ехать на них. В качестве бонуса в этот раз было и посещение Лондона. Если говорить о докладах, то проще посмотреть их онлайн или посетить одну из многочисленных российских конференций.

© Habrahabr.ru