← Назад к вопросам

Как создается процесс приложения

2.2 Middle🔥 221 комментариев
#Android компоненты#JVM и память#Жизненный цикл и навигация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Создание процесса приложения Android

Процесс создания процесса приложения Android — это многоэтапная процедура, которая начинается с запуска системы и завершается исполнением кода приложения. Вот детальное описание ключевых этапов:

1. Инициализация Zygote

Система Android использует Zygote — специальный процесс, который запускается при загрузке системы. Это "шаблонный" процесс с предзагруженными классами и ресурсами фреймворка Android, что ускоряет создание новых процессов:

// Zygote инициализирует виртуальную машину Dalvik/ART и предзагружает 
// системные классы и ресурсы для последующего быстрого клонирования
public class ZygoteInit {
    public static void main(String[] argv) {
        // Предзагрузка классов и ресурсов
        preloadClasses();
        preloadResources();
        // Запуск Zygote сервера для обработки запросов
        runSelectLoop();
    }
}

2. Запрос на создание процесса

Когда Activity Manager Service (AMS) получает запрос на запуск компонента приложения (Activity, Service, BroadcastReceiver), он проверяет, существует ли уже процесс для этого приложения:

  • Если процесса нет, AMS связывается с Process классом через IPC
  • AMS передает информацию о приложении (UID, имя пакета, компонент)
  • Zygote получает запрос через сокет и готовится к форку

3. Форк процесса через Zygote

Zygote создает новый процесс методом fork() — это быстрый механизм копирования существующего процесса:

# В системном логе можно видеть:
# Zygote: Forked child process 1234
# Процесс создается как копия Zygote с предзагруженными библиотеками

После форка новый процесс наследует:

  • Предзагруженные классы из системного classpath
  • Предварительно инициализированные системные ресурсы
  • Настройки виртуальной машины ART

4. Специализация нового процесса

После fork() новый процесс специализируется под конкретное приложение:

// Внутри нового процесса вызывается ZygoteInit.zygoteInit()
public class ZygoteInit {
    static void zygoteInit(String[] argv) {
        // Инициализация среды выполнения
        RuntimeInit.commonInit();
        // Настройка Binder для IPC
        ZygoteInit.nativeZygoteInit();
        // Запуск ActivityThread
        RuntimeInit.applicationInit(argv);
    }
}

Ключевые этапы специализации:

  • ApplicationInfo — загрузка метаданных приложения из AndroidManifest.xml
  • ClassLoader — создание загрузчика классов для загрузки .dex файлов приложения
  • Security Sandbox — настройка изоляции на основе UID и разрешений
  • ART Runtime — инициализация виртуальной машины с параметрами приложения

5. Создание прикладных компонентов

Главный поток процесса вызывает ActivityThread.main(), который становится точкой входа приложения:

public class ActivityThread {
    public static void main(String[] args) {
        Looper.prepareMainLooper(); // Подготовка главного Looper
        
        // Создание экземпляра ActivityThread
        ActivityThread thread = new ActivityThread();
        
        // Связывание с ActivityManagerService
        thread.attach(false);
        
        // Запуск главного цикла обработки сообщений
        Looper.loop();
    }
    
    private void attach(boolean system) {
        // Получение ApplicationContext
        // Создание экземпляра Application
        // Вызов Application.onCreate()
        // Создание Launch Activity
    }
}

6. Инициализация Application и компонентов

Система последовательно создает ключевые объекты:

  1. Application объект — вызывается Application.onCreate()
  2. ContextImpl — создание контекста приложения
  3. Основные компоненты — Activity, Service, ContentProvider, BroadcastReceiver
  4. Resource Manager — загрузка ресурсов приложения

Ключевые особенности процесса Android

  • Изоляция: Каждое приложение выполняется в собственном процессе с уникальным UID
  • Управление жизненным циклом: Система контролирует приоритет и может завершить процесс при нехватке памяти
  • Межпроцессное взаимодействие: Все коммуникации между компонентами разных процессов идут через Binder
  • Песочница: Ограничение доступа к файловой системе и системным ресурсам

Пример в системном логе

ProcessRecord{uid=10101, pid=5678, name=com.example.app}
Creating application package=com.example.app
Start proc 5678:com.example.app/u0a101

Процесс создания оптимизирован для скорости и эффективности использования ресурсов, что особенно важно на мобильных устройствах с ограниченной памятью и производительностью.

Как создается процесс приложения | PrepBro