Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Разработка под Android: что дальше?

Разработка под Android: что дальше?

Презентация с заключительной лекции в школе мобилизации Яндекса.

Artur Vasilov

August 08, 2018
Tweet

More Decks by Artur Vasilov

Other Decks in Programming

Transcript

  1. Instant Apps › Мгновенные приложения для веба (<3 Мб .apk)

    › Выполнение основного сценария работы с приложением › Много ограничений developer.android.com/topic/google-play-instant/ 6
  2. Android Go › Лайт-версия Android Oreo для слабых устройств (<=1

    Гб RAM, <= 8 Гб хранилища) › Специально адаптированные приложения android.com/versions/go-edition/ 9
  3. Android Go – требования к приложению › Быстрая работа ›

    Занимаемое место в постоянном хранилище после установки <40 Мб › Потребление оперативной памяти <50 Мб RAM › … medium.com/googleplaydev/how-to-optimize-your-app-for-android-go-edition-f0d2bedf9e03 10
  4. Instant App (I/O 16) Android Go (I/O 17) Dynamic features

    (I/O 18) Многомодульная архитектура 11
  5. Dynamic feature › Подгружаемые в рантайме модули для фичей ›

    Возможность сильно экономить в размере основного .apk developer.android.com/guide/app-bundle/configure 12
  6. Многомодульная архитектура Instant App (I/O 16) Android Go (I/O 17)

    Dynamic features (I/O 18) ??? ??? ??? Скорость сборки Gradle plugin 3.0 13
  7. Подключаем feature-модули dependencies { // ... implementation project(':core') implementation project(':feature1')

    implementation project(':feature2') implementation project(':feature3') implementation project(':feature4') } 15
  8. Не подключаем feature-модули! dependencies { // ... implementation project(':core’) implementation

    project(':feature1') // implementation project(':feature2') <-- don't need feature 2 implementation project(':feature3') implementation project(':feature4') } 16
  9. Кастомизируем сборку для Instant App / … def instantApp =

    project.property("build.instantApp") dependencies { // ... implementation project(':core') if (!instantApp) { implementation project(':feature2') } // ... } 17
  10. Кастомизируем сборку для Instant App / … def instantApp =

    project.property("build.instantApp") dependencies { // ... implementation project(':core') if (!instantApp) { implementation project(':feature2') } // ... } 18
  11. Но модуль ведь используется public class MainActivity extends AppCompatActivity {

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Feature2Api feature2Api = getFeature2Api(); feature2Api.loadData(); } } 19
  12. Так просто не работает › Мы не можем полностью отключить

    модуль, так как используем классы из него › Нужен более хитрый путь 20
  13. Возвращаем подключение модуля dependencies { // ... implementation project(':core') implementation

    project(':feature1') implementation project(':feature2') implementation project(':feature3') implementation project(':feature4') } 21
  14. Разные папочки с кодом def feature2Enabled = project.property("build.instantApp") sourceSets {

    main { if (feature2Enabled) { java.srcDirs += "src/impl/java" } else { java.srcDirs += "src/stub/java" } } } 22
  15. «Тяжелой» будет только impl часть dependencies { // ... if

    (feature2Enabled) { implementation deps.feature2_big_library } } 23
  16. Правила настройки feature-модуля › Все «внешние» классы / интерфейсы в

    папку main › Больше интерфейсов! › «Тяжелые» реализации / подключение библиотек только для конфигурации impl 24
  17. Модули › feature-модули могут зависеть от core / network /

    storage / … › feature-модули должны быть самодостаточны › Связь между feature-модулями через связующий модуль (-и) 29
  18. Плюсы многомодульной архитектуры › Поддержка Instant App / Android Go

    / … › Отключаемость и динамическая доставка фичей › Архитектура – новый уровень расслоения 34
  19. Плюсы многомодульной архитектуры › Поддержка Instant App / Android Go

    / … › Отключаемость и динамическая доставка фичей › Архитектура – новый уровень расслоения › Переиспользование модулей › Скорость сборки 35
  20. Многомодульная архитектура Instant App (I/O 16) Android Go (I/O 17)

    Dynamic features (I/O 18) Переиспользование кода Отключаемость фичей Архитектура Скорость сборки Gradle plugin 3.0 ??? ??? ??? 44
  21. 46

  22. Список фичей › Работа с сетью / API › Экраны:

    список, детальная информация, проигрывание видео › core (utils) функциональность 47
  23. 52

  24. Многомодульная архитектура – итого ▌ Это будущее, и оно уже

    здесь ▌ Количество плюсов очень большое ▌ Практикуемся с разбиением и Dagger-ом 56
  25. Ссылки ▌ Хороший пост от Instagram › instagram-engineering.com/app-modularization-and-module- lazy-loading-at-instagram-and-beyond-46b9daa3fea4 ▌

    Доклад от Владимира Тагакова с DroidParty › youtube.com/watch?v=pMEAD6jjbaI ▌ Пример › github.com/ArturVasilov/MultiModuleMovie ▌ … 57
  26. Android Vitals › Креши / ANR › Батарейка › Производительность

    › … medium.com/googleplaydev/how-to-fix-app-quality-issues-with-android-vitals-and-improve-performance-on- the-play-store-part-498dde9f4ef6 64
  27. Проблемы с батарейкой › Зависшие WakeLock-и (как свои, так и

    от JobService) › Частые синхронизации / пробуждения › Ошибки в коде › … 66
  28. Инструменты для отладки проблем с батарейкой › Профайлер батарейки в

    Android Studio 3.2 › Battery Historian › Что-то свое кастомное 67
  29. Battery Historian › По багрепорту показывает, куда и когда была

    потрачена батарея на устройстве › Показывает фоновые задачи в каждом приложении › Ставится на docker developer.android.com/studio/profile/battery-historian 68
  30. Инструменты отладки производительности ▌ Для всего › dumpsys / Systrace

    / Android Studio Profiler ▌ Для проблем с UI › HierarchyViewer / overdraw / GPU rendering / … 72
  31. dumpsys › Огромное количество информации о системе, работающих сервисах, потребляемой

    памяти, вьюшках и о многом другом › Запуск через adb, ничего специального не требуется 73
  32. Systrace › html-отчет с временем выполнения различных действий в разных

    потоках › Возможность замерять свои секции › Предупреждения о UI-проблемах › Информация о загруженности ядер процессора 74
  33. Краш или не краш? MainActivity.java @Override protected void onCreate(Bundle savedInstanceState)

    { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(() -> { TextView textView = findViewById(R.id.text); textView.setText("Hello, World!"); }).start(); } 81
  34. Android: отрисовка View Создание View из кода или xml Расчет

    размеров View относительно себя и родителя Расчет позиции View и всех детей (для ViewGroup) Рисование View на экране create / inflate measure layout draw 84
  35. Android: отрисовка View Создание View из кода или xml (долго)

    Расчет размеров View относительно себя и родителя (долго) Расчет позиции View и всех детей (для ViewGroup) (долго) Рисование View на экране create / inflate measure layout draw 85
  36. Litho (Facebook) › Необычный для Android-а подход к рисованию ›

    Декларативный UI-framework › В первую очередь предназначена для списков › Возможность переноса почти всех операций с View в background fblitho.com 86
  37. Litho specs @LayoutSpec public class HelloWorldSpec { @OnCreateLayout static Component

    onCreateLayout(ComponentContext c) { return Text.create(context) .text("Hello World") .textSizeDip(50) .build(); } } 87
  38. Litho components lifecycle › UI в Litho – фиксированный набор

    неизменяемых объектов › Можно рассчитать все размеры и позиции заранее! 88
  39. Litho: оптимизация ViewGroup › Litho высчитывает размеры и положение View

    полностью сама (с помощью Yoga) › ViewGroup не нужны! fblitho.com 91
  40. Litho: итого › Очень интересное решение: стоит присмотреться › Ни

    в коем случае не призыв использовать! › Но почему бы и не попробовать? 92
  41. А что там еще в Android? › Kotlin, Architecture, Jetpack,

    Performance › Android Things, Auto, Wear и т.д. › Кроссплатформенная разработка 96
  42. Кроссплатформенная разработка в Android ▌ React Native › medium.com/airbnb-engineering/react-native-at-airbnb- f95aa460be1c

    ▌ Kotlin Native › kotlinlang.org/docs/reference/native-overview.html ▌ Flutter › flutter.io 99