Введение.

Мобильные платформы.

  • Android.
  • iOS.
  • Windows Mobile.

Курс построен на android.

Структура курса. Лекции

  • Введение.
  • Основные компоненты приложений.
  • Многопоточность в приложениях.
  • Сеть.
  • Adapter Views. Службы (Services).
  • Работа с данными и файлами.
  • Локализация и работа с ресурсами.

Структура курса. Практика

  • 5 лабораторных работы (сентябрь-ноябрь).
  • Проект (декабрь-январь).
  • Для реализации используем java, kotlin, flutter. Нельзя: unity.

Инструментарий

  • JDK
  • Android SDK
  • Android Studio
  • Gradle
  • Android смартфон

Java

  • Текущая версия 19
  • Java Runtime Enviroment (JVM + java, выполнение программ)
  • Java Development Kit (JRE + средства компиляции и отладки)
  • Проект OpenJDK - исходный код JRE/JDK
  • Сборки и сертификация.

Java

  • Один из поставщиков и сборщиков JRE/JDK - Oracle.
  • Сборка OpenJDK от Oracle (обновления прекращаются как только выходит новая версия).
  • OracleJDK, бесплатно на этапе разработки, платно в рабочей среде.
  • Сборка AdoptOpenJDK: длительная поддержка, выбор JVM.

JVM

  • Запускать приложения на Java.
  • Управлять и оптимизировать память.
  • Реализации: HotSpot, OpenJ9.
  • Scala, Groovy и Kotlin

Cтруктура class файла

  • Магическое число 0xCAFEBABE - JVM понимает, что это class файл
  • 4 байта - версия Java
  • Массив констант. 14 типов констант (класс, метод, строка, целое число и т. д.).
  • Флаги доступа (интерфейс/класс, общедоступный/абстрактный, финальный).
  • Список полей (массив структур с полем, типом, значением (финальное)).
package ru.petrsu.cross;

public class HelloWorld {

	public static void main(String[] args) {
		say("Hello");
		say("World!");
	}

	public static void say(String str) {
		System.out.println(str);
	}
}
					
$ javac HelloWorld.java
$ javap -c HelloWorld
					
Compiled from "HelloWorld.java"
public class ru.petrsu.cross.HelloWorld {
  public ru.petrsu.cross.HelloWorld();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // String Hello
       2: invokestatic  #3                  // Method say:(Ljava/lang/String;)V
       5: ldc           #4                  // String World!
       7: invokestatic  #3                  // Method say:(Ljava/lang/String;)V
      10: return

  public static void say(java.lang.String);
    Code:
       0: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: aload_0
       4: invokevirtual #6                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       7: return
}
					

Загрузка класса

  • Bootstrap - базовый загрузчик, загружает классы платформы.
  • Extension classloader - загружает из jre/lib/ext.
  • AppClassLoader - загружает из -classpath.
  • Собственный загрузчик классов (динамические плагины).

Линковка класса

  • Верификация байт-кода.
  • Выделение памяти под статические поля и их инициализация.
  • Разрешение символьных ссылок.
  • Выполнение методов классов.

Инструкции JVM

  • Инструкция - один байт кода операции (байт код).
  • Код операции - действие.
  • ~200 операций.
  • 7 примитивных типов данных.

Вызов методов

  • Методы экземпляров.
  • Методы классов (статические).
  • Методы экземпляра используют динамическое (позднее) связывание
  • Методы класса используют статическое (раннее) связывание.
  • Инструкции invokevirtual и invokestatic.

Управление памятью: традиционный подход

  • Явное выделение памяти программистом для объекта.
  • Обращение к объекту по сохраненному указателю.
  • Явное удаление объекта
  • Две проблемы: висячие ссылки и утечка памяти.

Управление памятью: java

  • При запуске JVM создается куча.
  • Во время выполнения может менять размеры.
  • Все созданные объекты находятся в куче.
  • Когда куча заполнена происходит сборка мусора.

Управление памятью: java

  • Сборка мусора - процесс освобождения места в куче.
  • Гарантируется, что удаляются только недоступные из выполняемого кода объекты.
  • Объекту присвоена null или он инициализирован другим объектом.

Управление памятью: стек.

  • Для каждого потока используется свой стек.
  • Предел размера стека определен операционной системой
  • Хранит примитивы и ссылки на объекты
  • Работает по схеме последним вошел, первым вышел (LIFO)
  • Память стека существует пока выполняется текущий метод
  • Обращение к памяти стека происходит значительно быстрее, чем к памяти кучи
  • Автоматически выделяется и освобождается, когда метод вызывается и завершается соответственно

Управление памятью. Куча.

  • Пространство кучи является общим для всего приложения
  • Размер кучи не ограничен
  • Все созданные объекты хранятся в куче
  • Пространство кучи существует пока работает приложение
  • Медленнее, чем стек
  • Память в куче выделяется, когда создается новый объект и освобождается сборщиком мусора, когда в приложении не остается ни одной ссылки на его

Java 8

  • Лямбды
  • Коллекции и потоки

Java 8. Лямбды

Runnable runnable = new Runnable(){
       @Override
       public void run(){
         System.out.println("Hello world !");
       }
     };

Java 8. Лямбды

Runnable runnable = () -> System.out.println("Hello world two!");

Java 8. Коллекции

List list = Arrays.asList("franz", "ferdinand", "fiel", "vom", "pferd");
list.stream()
    .filter(name -> name.startsWith("f"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

Java 9

  • Дополнительные методы для создания коллекций (List.of, Set.of, Map.of)
  • Дополнительные методы для коллекций
  • Options, ifPresentOrElse
  • В интерфейсы добавлены private методы
  • jShell - оболочка для простых команд
  • Свой HTTPClient (раньше Apache HttpClient или OkHttp). Preview.

Java 10

  • Переменная var (все еще строго типизированный). Только внутри методы.

Java 11

  • Несколько новых методов для String (isBlank, lines, strip и др.)
  • Запустить исходные файлы
  • Вывод типа локальной переменной (var) для лямбда-параметров
  • HTTPClient в окончательной версии.
  • Сборщик мусора No-Op

Java 13

  • Новый switch.
  • Многострочные строки (preview).

Java 13. Какой был switch

switch(status) {
  case SUBSCRIBER:
    // code block
    break;
  case FREE_TRIAL:
    // code block
    break;
  default:
    // code block
}

Java 13. Какой стал switch

boolean result = switch (status) {
    case SUBSCRIBER -> true;
    case FREE_TRIAL -> false;
    default -> throw new IllegalArgumentException("something is murky!");
};

Java 15

  • алгоритм цифровой подписи на основе кривой Эдвардса (EdDSA)
  • скрытые классы - это классы, которые не могут быть задействованы непосредственно байт-кодом других классов. Они предназначены для использования фреймворками, которые динамически создают классы во время выполнения и используют их косвенно через механизм рефлексии.
  • текстовые блоки (многострочные тексты)
  • сборщик мусора ZGC - это параллельный, поддерживающий NUMA, масштабируемый сборщик мусора с малой задержкой при сборке мусора (менее 10 миллисекунд даже в многотерабайтных кучах)
  • Shenandoah — сборщик мусора с малым временем паузы