zygote android что это
Русские Блоги
Анализ запуска Zygote и процесса обслуживания (Android P)
Что такое процесс зиготы
Гу Минси предположил, что Zygote означает инкубатор. В системе Android все процессы приложений и системные процессы, используемые для запуска ключевых системных служб, создаются Zygote.Это процесс инкубатора
Когда начинается процесс Zygote
Хотя процесс Zygote очень важен, на самом деле это не первый процесс системы Android
Как начать процесс Zygote
Скрипт запуска Zygote
Здесь выберите анализ init.zygote32.rc
Просто проанализируйте этот файл скрипта
Хорошо, мы обеспокоены тем, что вход в Зиготе в/system/bing/app_process Далее в каталоге проанализируем процесс его запуска
Процесс запуска Zygote
/system/bing/app_process Основная функция записи процесса Zygote в каталоге находится в app_main.cpp.
А) Основная функция app_main.cpp
Видно, что основной метод в app_main.cpp распределяет запуск Zygote в AndroidRuntime.start, а затем мы анализируем его
Хорошо, вы можете видеть, что запуск процесса Zygote вызывает метод AppRuntime.start. Этот метод выполняет следующие действия
Хорошо, пока запуск процесса Zygote был перенесен на Java, давайте посмотрим, что делается в ZygoteInit
2) Основной метод ZygoteInit
Видно, что основной метод ZygoteInit в основном делает следующие вещи
Затем проанализируйте один за другим
1. Создать процесс Socket of Zygote
Хорошо, вы можете видеть, что Socket, который создал процесс Zygote, в конечном итоге получил LocalServerSocket и сохранил его в переменной-члене mServerSocket ZygoteServer
2. Запустите процесс SystemService
При запуске процесса Zygote мы видим, что процесс SystemServer находится в процессе запуска
Это будет проанализировано позже, мы будем продолжать смотреть вниз
3. Цикл процесса Zygote ожидает запросов на подключение от других процессов.
Хорошо, видно, что ZygoteServer откроет бесконечный цикл
Блок-схема запуска Zygote
На этом анализ Zygote при запуске процесса завершен, и приведенный выше код преобразуется во временную диаграмму, чтобы углубить впечатление.
Начало процесса обслуживания системы
В вышеупомянутом процессе запуска Zygote мы также инициировали запуск процесса SystemServer, первый обзор
При запуске процесса Zygote мы видим, что процесс SystemServer находится в процессе запуска
Инкубируйте процесс SystemServer
Затем проанализируйте метод Zygote.forkSystemServer ()
Видно, что forkSystemServer в Zygote перенаправляет работу по запуску процесса системного обслуживания на собственный уровень, мы продолжаем отслеживать
Видно, что в конечном итоге будет вызван метод fork для инкубации процесса, и процесс инкубации не будет подробно изучен. В основном мы сосредоточены на запуске системы SystemServer.
Обработка запуска SystemServer
Хорошо, вы можете видеть, что ZygoteInit.handleSystemServerProcess, наконец, перенаправил запуск SystemServer в RuntimeInit.applicationInit, мы продолжаем анализировать
Из построения аргументов в ZygoteInit.forkSystemServer мы видим, что запись этой основной функции на самом деле находится в «com.android.server.SystemServer», мы продолжаем отслеживать
Видно, что основная функция SystemServer, в основном, выполняется операцией
На этом этапе процесс обслуживания системы запускается и завершается
подводить итоги
Zygote
Об обязанностях процесса Zygote можно ясно видеть из ZygoteInit.main, вот краткое изложение
SystemServer
Из метода run объекта SystemServer вы можете четко понять его работу при запуске
Русские Блоги
введение
Особенности зиготы
Во-первых, давайте посмотрим, что делает основной метод ZygoteInit: (/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java)
Зарегистрируйте сервер для связи через сокеты (registerZygoteSocket)
Зарегистрируйте сервер сокетов с именем «zygote»:
Примечание 1. Создайте статический объект serversocket
Предварительная загрузка
Запустить системную службу SystemServer
a. Примечание 1. Установите некоторые параметры для запуска systemServer.
б. Примечание 2. Создайте процесс с именем system_server в соответствии с параметрами.
c. Примечание 3: когда pid в примечании 2 = 0, это означает, что оператор в if выполняется в процессе SystemServer и запускается основной метод класса com.android.server.SystemServer.
Примечание 1. Передайте некоторые параметры SystemServer в метод RuntimeInit.zygoteInit.
Давайте посмотрим на метод RuntimeInit.zygoteInit:
Примечание 1. Собственный уровень выполнил некоторую инициализацию, давайте посмотрим, собственный метод соответствует /frameworks/base/core/jni/AndroidRuntime.java.
Здесь proc запускает пул потоков, который является пулом потоков связующего. Пул потоков связующего будет подробно проанализирован позже для межпроцессного взаимодействия.
Примечание 2: Инициализация уровня Java applicationInit ()
Продолжаем смотреть на метод invokeStaticMain:
Дождитесь запроса соединения от клиента сокета в цикле (например, при запуске нового приложения и т. Д.)
Я не буду здесь вдаваться в подробности, но пока (правда) продолжает ждать запросов клиентов.
Выполнить метод объекта Mehod, переданный запрашивающей стороной, которая вызывает клиент сокета.
Одна из обработок здесь была проанализирована при обработке метода run () в классе MethodAndArgsCaller выше.
[Видео] Доклады с митапа Android Paranoid
Android почти исполнилось десять лет.
Мы решили отметить это праздничным чаепитием со всеми, кто пришел в питерский офис Яндекса на второй митап Android Paranoid. Сказано — сделано. К нашему сожалению, маршмеллоу, шоколадное печенье и желейные бобы закончились еще 28 марта.
Вместо них — доклады, записанные на видео, и короткая выжимка полезной информации для Android-разработчиков. Под катом о том,
Про анимации в RecyclerView
Данил Терновых из Яндекс.Денег рассказал о том, как быстро и без затрат получить анимации в RecyclerView.
Для тех, кто хочет попробовать их в работе — демо на GitHub. Подробности реализации — в видео.
«Что происходит после тапа на иконку приложения,
И даже чуть раньше?», — рассказал Владимир Теблоев из Сбербанк-Технологий. Рекомендуем посмотреть видео если вы думали, что вся жизнь в Android ограничивается вьюхами и активити, и ничего не знали про работу ядра, загрузчика, далвик, и все время задавались вопросом — зачем андроиду зигота? Для заинтересовавшихся — выжимка в трех эпизодах.
Эпизод 1 — Уровни системы и Zygote
Давным-давно инженеры молодой мобильной ОС спроектировали четыре уровня работы системы:
Чуть менее давно Dalvik превратился в Android Runtime, но сути процесса это не изменило — после тапа на иконку Launcher получает сигнал, передает его в менеджер активностей, тот передается в Zygote, а она создает новое приложение.
Zygote — демон, который запускается при старте системы и инициализирует первичную виртуальную машину. Zygote позволяет создавать процессы для любых приложений в Android, клонируя себя и корневые библиотеки, которые необходимы для запуска всех приложений. Так экономятся время и память, потому что в первичном экземпляре Zygote уже инициализированы все нужные библиотеки. Останется только использовать Copy-on-Write и изменить ProcessID.
Слева — первичный экземпляр, в середине — Zygote, отвечающая за компоненты Android, справа — наше приложение.
Эпизод 2 — Жизненный цикл и взаимодействие процессов
В Android существуют пять типов процессов и три приоритета, которые им назначаются.
Критический приоритет назначается активным процессам — тем, с которыми пользователь взаимодействует прямо сейчас. Это может быть открытая активити или музыкальный плеер в UI.
Высокий приоритет обычно получают видимые процессы, например, активити, перекрытые другими. Если на активные процессы будет не хватать памяти, видимый процесс завершится. К тому же приоритету относятся служебные процессы, с которыми пользователь не взаимодействует — они отвечают за загрузку данных, синхронизацию и т.д.
Процессы низкого приоритета относятся к уже остановленным активити. Android сортирует такие процессы в порядке запуска и хранит в памяти, чтобы завершать их в порядке от старых к новым. Последняя категория — «зомби-процессы» — в них может быть инициализирован какой-то поток, но все компоненты жизненного цикла уже уничтожены.
Основной способ взаимодействия процессов — IPC через Binder. Это драйвер, через который работают все корневые структуры Android. Модель взаимодействий — на схеме ниже.
Предположим, что активити в процессе А должна получить данные из другого процесса. Метод Foo() обращается к Binder, который, в свою очередь, сериализует и упаковывает входные данные и передает целевому процессу для обработки. Затем нужные данные десериализуются, процесс Б что-то с ними делает и выполняет операции в обратном порядке.
Отдельно Владимир рассказал обо всех этапах создания активностей в Android. Все детали — в видео.
«Пользователь хочет 60 FPS,
Для этого и нужна фоновая работа».
Владимир Иванов из EPAM уже семь лет пишет под Android и iOS и успел похоронить Windows Phone. Владимир рассказал об эволюции инструментов для выполнения задач вне главного потока на Android. Речь о цепочке — AsyncTask, Loaders, Executors, EventBus, RxJava, Coroutines в Kotlin.
В докладе очень много примеров, здесь — малая часть.
Итерация 1 — AsyncTask
Допустим, мы пишем приложение, которое показывает прогноз погоды. Последовательность действий примерно следующая:
Соответственно, нужен способ выполнить что-то на UI. В AsyncTask для этого используется метод onPostExecute, его и используем.
У этого подхода одна большая проблема и несколько минусов — AsyncTask умерли, за исключением production-проектов, которым больше пяти лет.
1) Много кода для сетевых запросов;
2) AsyncTask не знают ничего про жизненный цикл активностей и потенциально ведут к утечкам памяти;
3) При смене конфигурации на лету (например, экран перевернулся) нужно перевыполнить запрос.
Итерация 2 — Loaders
С Android 3.0 пришли Loaders — команда Android придумала их, чтобы решить проблемы AsyncTask.
В частности, речь о повторном использовании результата при смене конфигурации. Проблема решается так:
1) LoaderManager, привязанный к активности, хранит ссылки на несколько Loader в специальной структуре;
2) Активность сохраняет все LoaderManager внутри NonConfigurationInstances;
3) При создании новой активности система передает в нее данные из NonConfigurationInstances;
4) Активность восстанавливает LoaderManager со всеми Loader.
Минусы:
1) Все еще много кода;
2) Интерфейсы все еще сложные, а классы все еще абстрактные;
3) Loaders — платформенный API Android, а значит, их нельзя переиспользовать на чистой Java.
Итерация 3 — EventBus и ThreadPoolExecutors
С появлением ThreadPoolExecutors передача данных с фона на UI стала выглядеть так:
1) Заводим класс Background, а в нем — переменную Service;
2) Инициализируем этот класс в ScheduledThreadPoolExecutor с нужным нам размером;
3) Пишем вспомогательные методы, которые делают класс runnable или callable.
Кроме выполнения на фоне, все еще нужно возвращать результат на UI. Для этого пишем handler и метод, который что-то постит на UI-треде.
Не весь UI должен знать, что какой-то конкретный метод выполнился. Чтобы разделить ответственность, придумали EventBus. Это способ передачи событий из фонового потока на UI, при котором на общую шину подключены несколько слушателей, которые и обрабатывают эти события.
Есть несколько готовых реализаций EventBus. Некоторые из них — Google Guava, Otto и GreenBot Eventbus.
Кто-то должен был придумать удобный инструмент для фоновой работы. В итоге у нас есть RxJava — большой фреймворк для работы с потоками событий.
Предположим, мы пишем код, который должен авторизовываться на GitHub. Нужно завести по методу на каждую нужную операцию (в нашем случае — логин и получение списка репозиториев).
Результатом выполнения будет Single — поток из нуля или одного события. Итог работы — интерфейс из двух методов, которые возвращают все, что нужно пользователю.
Coroutines — библиотека для фоновой работы с поддержкой внутри языка Kotlin.
1. Не блокирующий подход — основной поток выполняется во время фоновой работы и встраивает в себя результаты по мере выполнения;
2. Асинхронный код в синхронном стиле
3) Средства языка вместо операторов;
4) Просто изучать — кривая обучения почти не кривая;
5) После небольшого обдумывания юнит-тесты становятся почти такими же, как для синхронного кода.
1) Недавно вышли из статуса экспериментальных;
2) Это не часть языка, а библиотека;
3) Не для всего есть адаптеры;
4) Coroutines — не замена RxJava. Они не сильно помогут в сложных случаях со сложным потоком событий.
Остальное про Coroutines (включая примеры) лучше послушать в докладе:
Как уместить код в 300 строк, программируя на Kotlin
Год назад, на Google IO 2017 анонсировали то, что Kotlin стал официальным языком Android. Доклад Юрия Чечеткина из Альфа-Банка о том, как начать переезжать на новый язык, сократить классы до 300 строк и не сойти с ума.
Доклад — практический ликбез по тому, как писать компактно и красиво. Он ориентирован на продвинутую аудиторию, которая знает основные особенности Kotlin.
В докладе очень много примеров использования и сравнений кода на двух языках, поэтому здесь приведем только интересные факты и выводы.
Основные проблемы с миграцией на Kotlin:
Следите за мероприятиями и буднями команды Я.Денег в ВК, фейсбуке и инстаграме.
Все конференции и митапы Яндекса — на Я.Встречах.
Русские Блоги
Android Zygote: глубокое понимание Zygote (android6.0)
На основе Android6.0 соответствующие файлы являются следующими:
1. Обзор
Где процесс Zygote может быть перезапущен:
Начиная с App_main (), класс вызова функции процесса запуска Zygote выглядит примерно так:
Два, процесс запуска Zygote
2.1 App_main.main
2.2 start
2.3 startVm
Основная длина метода создания виртуальной машины Java заключается в настройке параметров виртуальной машины. Ниже перечислены только некоторые часто используемые параметры в процессе отладки и оптимизации.
2.4 startReg
массив [i] ссылается на массив gRegJNI, который имеет более 100 членов. Каждый из участников прошелREG_JNIМакроопределения:
3. Войдите в слой Java
Предыдущий [Раздел 2.1] AndroidRuntime.start () выполняется до последнего вызова ZygoteInit.main () посредством отражения, см. Ниже:
3.1 ZygoteInit.main
Метод caller.run (), вызываемый после перехвата исключения, будет рассмотрен в следующей статье system_server.
3.2 registerZygoteSocket
3.3 preload
Выполните инициализацию процесса Zygote. Для загрузки классов используйте механизм отражения Class.forName () для загрузки. Для загрузки ресурсов, в основном com.android.internal.R.array.preloaded_drawables и com.android.internal.R.array.preloaded_color_state_lists, ресурсы, начинающиеся с com.android.internal.R.xxx в приложении, В этот момент Zygote загружается в память.
Все ресурсы в методе preload () загружаются в процессе zygote. Когда необходимо разветвить новый процесс, используется технология копирования при записи, как показано ниже:
3.4 startSystemServer
3.5 runSelectLoop
Zygote использует эффективный механизм мультиплексирования ввода / вывода, чтобы гарантировать, что он будет в спящем режиме, когда нет запроса на подключение клиента или обработки данных, в противном случае он ответит на запрос клиента.
3.6 runOnce
Для получения дополнительной информации см.Понять процесс создания процесса Android
Русские Блоги
Zygote для Android
Что такое зигота
Процесс запуска Zygote
Основной файл, соответствующий процессу Zygote, это app_main.cpp. Когда он запускается процессом Init, он входит в функцию main () основного файла app_main.cpp. Затем его основная функция начинает анализ запуска процесса Zygote:
Класс AppRuntime наследует класс AndroidRuntime, поэтому функция start () среды выполнения, вызванная ранее, войдет в функцию start () AndroidRuntime. Взгляните на функцию ниже:
Функция start () AndroidRuntime в основном выполняет следующие три функции:
1. Вызовите функцию startVM (), чтобы запустить виртуальную машину.
2. Вызовите функцию startReg (), чтобы зарегистрировать метод JNI.
3. Вызовите функцию main () класса com.android.internal.os.ZygoteInit (если это дочерний процесс, вызовите функцию main () com.android.internal.os.RuntimeInit Это в основном завершает инициализацию. Основная функция процесса Zygote имеет следующие 5 задач)
Далее описывается конкретная работа трех функций одна за другой:
Запустите виртуальную машину
Запустите виртуальную машину, вызвав функцию startVM ():
Зарегистрировать метод JNI
В Android мир Java использует механизм JNI для вызова функций в собственном мире, а механизм JNI также широко используется в системе Android.В системе Android для регистрации используется следующая функция startReg ():
JNI, перечисленные выше, регистрируются с помощью функции register_jni_procs ():
ZygoteInit отвечает за инициализацию Zygote. Вот основной метод класса ZygoteInit
1) Зарегистрируйте порт сокета в zygote для прослушивания
2) предварительная загрузка системных ресурсов;
3) Запустите процесс SystemServer;
4) войти в цикл прослушивания и получения сообщений;
Взгляните на эти четыре метода по очереди:
1) метод registerZygoteSocket ()
Создайте локальный сокет, а затем дождитесь вызова runSelectLoop (), чтобы войти в цикл, ожидающий сокет для ожидания соединения;
2) предварительная загрузка системных ресурсов, метод preload ();
Сначала посмотрите на карту общей памяти процесса приложения Android
Из приведенного выше рисунка легко понять, что после того, как процесс Zygote предварительно загружает системные ресурсы, он затем штрихует другие процессы виртуальной машины, а затем разделяет память виртуальной машины и ресурсы уровня структуры, что значительно повышает скорость запуска и запуска приложений. Теперь посмотрим на метод preload ();
В основном предварительная загрузка различных системных ресурсов, в основном см. 2.1) предварительная загрузка системных классов; 2.2) предварительная загрузка системных ресурсов; 2.3) предварительная загрузка, так что библиотека
Прочитайте файлы в файле PRELOADED_CLASSES, получите объект InputStream, преобразуйте его в BufferedReader, построчно прочитайте содержимое файла, передайте trim (), отфильтруйте пустые строки, а затем вызовите метод Class.forName () для загрузки информации о классе Java Вместо создания объекта;
2.2 preloadResources (); предварительная загрузка системных ресурсов
2.3 preloadSharedLibraries (); загрузка системных общих библиотек
3 startSystemServer () запускает процесс SystemServer
4) метод runSelectLoop ()
Это делает две основные вещи:
4.1) Принять запрос на соединение, i = 0, это означает, что событие запроса на соединение наступило, вызвать acceptCommandPeer (), чтобы установить соединение с клиентом через сокет, а затем присоединиться к массиву прослушивания, ожидая прибытия команды на этом сокете;
4.2) Принять сообщение; i> 0 означает, что у уже подключенного сокета есть данные. После вызова метода runOnce () класса ZygoteConnection соединение с клиентом будет отключено и удалено из прослушивающего массива;