Мобильные платформы.
- 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 — сборщик мусора с малым временем паузы