Мобильная кроссплатформенная разработка.

Рынок мобильных операционных систем:

  • Android + iOS: 99% рынка
  • Android: ~2.5 млн. приложений в Google Play Store
  • iOS: ~1.8 млн. приложений в App Store
  • Еще варианты: Windows Phone, Аврора
  • Мобильные телефоны на основе ОС Linux: PinePhone
  • Рассмотрим: android + iOS.

Отдельные нативные приложения

  • Android: Java, Kotlin.
  • iOS: Objective-C, Swift.
  • Доступ к функциям ОС "из коробки" (календарь, файловая система, контакты и др.).
  • Высокая производительность.
  • "Родной" интерфейс.

Отдельные нативные приложения: недостатки.

  • Две кодовые базы: поддерживать две команды разработчиков.
  • Дорого.
  • Необходимо "выравнивать" приложения по функциональности.

Прогрессивное веб-приложение.

  • Трансформация сайта в веб-приложение.
  • Обычно на отдельном домене (определение по User-Agent).
  • Не нужно устанавливать отдельное приложение.
  • Нет доступа к функциям ОС.
  • Нет возможности использовать другие приложения (например, для входа).
  • Браузер для ОС достаточно много потребляет энергии.

Общая архитектура.

Соrdova.

  • Ресурс: https://cordova.apache.org/.
  • Появился в 2009.
  • Наследовался от PhoneGap.
  • Открытая лицензия.
  • Поддержка платформ: android, iOS, Windows Phone.
  • Технологии: HTML, CSS, JS
  • Любой UI фреймворк: React, Angular, Vue, jQuery.
  • Рендеринг с помощью WebView.
  • Ядро и набор плагинов.

Соrdova. Архитектурная схема.

Соrdova. Первое приложение.

:> sudo npm install -g cordova
:> cordova create MyApp
:> cd MyApp
:> ls
config.xml  package.json  www
:> cordova platform
Installed platforms:
  
Available platforms: 
  android ^9.0.0
  browser ^6.0.0
  electron ^1.0.0
> cordova platform add browser
> cordova run browser
startPage = index.html
Static file server running @ http://localhost:8000/index.html
CTRL + C to shut down

				    

Соrdova. Как выглядит приложение.

Набор UI компонент.

  • Сверстанные на HTML/JS/CSS элементы под платформу
  • Пример: Onsen UI

Xamarin.

  • Ресурс: https://dotnet.microsoft.com/apps/xamarin
  • Язык разработки: C#.
  • Платформы: Android, iOS, Windows Phone
  • UI отдельный для каждой платформы.
  • Достигается возможность сделать максимально нативно выглядящее приложение.
  • Бизнес логика - общая.
  • Разработка может идти на macOS, Windows.

Xamarin. Архитектура.

Native script.

  • Ресурс: https://nativescript.org/
  • Появился в 2014.
  • Платформы: android, iOS
  • Веб-фрейморки: Angular, Vue.
  • Готовый набор UI компонент.
  • Плагин для VS Code.

Native script. Архитектура.

React native.

  • Ресурс: https://reactnative.dev/
  • Появился в 2015.
  • Веб-фрейморк: React (JSX).
  • Могут быть отличия ios/android.
  • Поддерживается механизм hot-reload.

React native.

  • React (также известный как ReactJS) - это библиотека , используемая для создания интерфейса веб-сайта.
  • Как React, так и React Native используют смесь JavaScript и специального языка разметки JSX.
  • Однако синтаксис, используемый для отображения элементов в компонентах JSX, отличается между React и React Native.
  • Кроме того, React использует некоторые HTML и CSS, в то время как React Native позволяет использовать собственные элементы мобильного пользовательского интерфейса.

JSX

  • JSX – это синтаксическая обертка над JS.
  • Его нет в стандартах ECMAScript, так что инструменты вроде Babel и React занимаются его транспиляцией в обычный JavaScript код.
const profile = (
  <div>
    <img src="avatar.png" className="profile" />
    <h3>{[user.firstName, user.lastName].join(" ")}</h3>
  </div>
);				    
				    
const profile = React.createElement(
  "div",
  null,
  React.createElement("img", { src: "avatar.png", className: "profile" }),
  React.createElement("h3", null, [user.firstName, user.lastName].join(" "))
);
				    

Typescript

  • Является обратно совместимым с JavaScript и компилируется в последний.
  • Фактически, после компиляции программу на TypeScript можно выполнять в любом современном браузере или использовать совместно с серверной платформой Node.js.
  • TypeScript отличается от JavaScript возможностью явного статического назначения типов, поддержкой использования полноценных классов (как в традиционных объектно-ориентированных языках).
  • TypeScript является строго типизированным языком, и каждая переменная и константа в нем имеет определенный тип.
  • При этом в отличие от javascript мы не можем динамически изменить ранее указанный тип переменной.

React native. Архитектура.

React native. Пример.

import React from 'react';
import { Text, View } from 'react-native';

const YourApp = () => {
  return (
    <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
      <Text>
        Some text
      </Text>
    </View>
  );
}

export default YourApp;
				    

Flutter.

  • Ресурс: https://flutter.dev
  • Первый релиз 2018 год.
  • Язык программирования Dart (компилируется в машинный код).
  • Набор виджетов: Material для Android и Cupertino для iOS.
  • Взаимодействие с платформой через Platform Channels.
  • Свой CI/CD: https://codemagic.io/
  • Считается на данный момент самым перспективным.

Flutter. Архитектура.

Flutter. Dart.

  • Ресурс: https://dart.dev
  • АОТ-компиляция. В результате имеем АРМ или х86 код с высоким быстродействием на пользовательском устройстве.
  • JIT-компиляция. Дает возможность запускать проект в виртуальной машине на эмуляторе и реализовать hot reload длительностью менее одной секунды с сохранением состояния приложения.
  • Строгая система типов. Позволяет забыть о выборе между TS и Flow.
  • Tree shaking compiler. При сборке приложения удаляет весь неиспользуемый код.
  • Generational garbage collection. Быстрое выделение и очистка памяти.

AOT и JIT компиляции

  • Компилятор JIT запускается во время выполнения программы, компилируя ее на лету.
  • Первоначальные компиляторы, которые выполняются во время создания программы (до выполнения), называются опережающими компиляторами (AOT).
  • Только статические языки поддаются компиляции AOT в собственный машинный код, потому что машинным языкам обычно необходимо знать тип данных
  • Следовательно, динамические языки обычно интерпретируются или компилируются JIT.

AOT и JIT в dart

  • Поддерживает два вида компиляции AOT и JIT
  • Компиляция JIT используется во время разработки с использованием особенно быстрого компилятора.
  • Затем, когда приложение готово к выпуску, оно компилируется AOT.
  • быстрые циклы разработки и быстрое время выполнения и запуска.
  • Dart также предоставляет автономную виртуальную машину, которая использует сам язык Dart в качестве своего промежуточного языка (по сути, действуя как интерпретатор).

Dart. Архитектура.

Dart. Упреждающее планирование, разделение времени и общие ресурсы

  • Большинство компьютерных языков, поддерживающих несколько параллельных потоков выполнения (включая Java, Kotlin, Objective-C и Swift), используют вытеснение для переключения между потоками.
  • Каждому потоку выделяется "кусочек" времени для выполнения, и если он превышает выделенное время, поток прерывается с помощью переключения контекста.
  • Однако если вытеснение происходит при обновлении ресурса, совместно используемого потоками (например, памяти), это вызывает состояние гонки.
  • способ исправить состояние гонки — защитить общий ресурс с помощью блокировки

Dart. Упреждающее планирование, разделение времени и общие ресурсы

  • Потоки в Dart, называемые изолятами, не используют общую память, что устраняет необходимость в большинстве блокировок.
  • Изоляты общаются, передавая сообщения по каналам, что похоже на акторов в Erlang или web-workers в JavaScript.
  • Dart, как и JavaScript, является однопоточным, что означает, что он вообще не допускает вытеснения.
  • Вместо этого потоки явно уступают (используя async/await, Futures или Streams).
  • Однопоточность помогает разработчику гарантировать, что критически важные функции (включая анимацию и переходы) выполняются полностью, без вытеснения.

Dart. Статические анализ кода

  • Линтер - это инструмент для статического анализа кода, который находит и уведомляет об ошибках, предупреждениях, а также нарушениях стиля кода, чтобы разработчик их исправил.
  • В случае использования Flutter, это один из наиболее простых и полезных пунктов, чтобы сохранять код чистым.
  • lint: https://pub.dev/packages/lint
  • flutter_lints
  • very_good_analysis

Flutter. Локализация

  • Встроенная поддержка
  • Создаются файлы .arb для каждого языка, который будет в приложении.
  • Создаваемые файлы должны быть в папке l10n.
  • У файлов должно быть расширение .arb.
  • Название ключей должно начинаться с маленьких букв — специальные символы запрещены.
  • Не ставьте запятую в конце последней пары «ключ-значение».

Flutter. Локализация

app_en.arb
{
 “frieghtInRs”: “Freight (Rs)”,
 “gst” : “GST ({rate}%) (Rs)”,
 “@gst”:{
 “description”: “Enter % for gst”,
 “placeholders”: {
 “rate”: {
         “type”:”String”
         }
       }
    }, 
 “language”: “English”
}
				    
app_hi.arb
{
 “frieghtInRs”: “किराया (रु.)”,
 “gst” : “GST ({rate}%) (रु.)”,
 “language”: “Hindi”
}

Dart. Пример.

import 'package:flutter/material.dart';

void main() async {
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: MyApp(),
      ),
    ),
  );
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}


				    

Flutter. Окружения (Environments) с различными особенностями

Flutter. "За".

  • Собственный рендеринг, независимость от ОЕМ-виджетов и богатый инструментарий разработчика существенно ускоряет написание кода и поддержку двух платформ одновременно.
  • Web и desktop — в активной разработке.
  • За счет pixel perfect rendering, тестирование и устранение платформо-зависимых багов и нюансов верстки будет проходить существенно быстрее.
  • Быстродействие.
  • Одинаковый UI на всех устройствах. При необходимости написать приложение с уникальным дизайном, который должен быть одинаковым на двух мобильных платформах.

Flutter. "Против".

  • Молодость платформы.
  • Dart добавляет накладные затраты на внедрение Flutter за счет необходимости изучать и вникать в новый язык.
  • В случае с React Native, они могут быть подключены в проект достаточно быстро. Во Flutter все новые появляющиеся на стороне платформы элементы UI должны быть заново отрисованы.