Попробуйте разработку для Android

Этот учебный материал позволит вам впервые попробовать себя в разработке под операционной системой Android.

Настройка для разработки под Android

Прежде чем загружать и собирать ветку манифеста android-latest-release из исходного кода Android, убедитесь, что ваше оборудование соответствует необходимым требованиям и что необходимое программное обеспечение установлено должным образом. Вам также следует ознакомиться со следующими терминами:

Гит
Git — это бесплатная система контроля версий с открытым исходным кодом. Android использует Git для локальных операций, таких как создание ветвей, коммиты, сравнение изменений и редактирование. Для получения помощи в изучении Git обратитесь к документации Git .
Репо
Repo — это Python-обертка над Git, упрощающая выполнение сложных операций с несколькими репозиториями Git. Repo не заменяет Git для всех операций контроля версий, он лишь упрощает выполнение сложных операций Git. Repo использует файлы манифеста для объединения проектов Git в суперпроект Android.
файл манифеста
Файл манифеста — это XML-файл, определяющий местоположение различных проектов Git в исходном коде Android в дереве исходного кода AOSP.

Соответствует требованиям к оборудованию

Ваша рабочая станция для разработки должна соответствовать или превосходить следующие аппаратные требования:

  • 64-битная система x86.

  • Для загрузки и сборки кода требуется не менее 400 ГБ свободного места на диске (250 ГБ для загрузки + 150 ГБ для сборки).

  • Минимум 64 ГБ оперативной памяти. Google использует 72-ядерные машины с 64 ГБ оперативной памяти для сборки Android. При такой конфигурации оборудования полная сборка Android занимает приблизительно 40 минут, а инкрементальная сборка — всего несколько минут. Для сравнения, на 6-ядерной машине с 64 ГБ оперативной памяти полная сборка занимает приблизительно 6 часов.

Соответствует требованиям операционной системы

На вашей рабочей станции для разработки должна быть установлена ​​любая 64-битная дистрибуция Linux с библиотекой GNU C (glibc) версии 2.17 или более поздней.

Установите необходимые пакеты.

Для установки необходимых пакетов для Ubuntu 18.04 или более поздних версий выполните следующую команду:

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

Установите необходимое программное обеспечение.

Прежде чем начать работу с AOSP, необходимо установить OpenJDK, Make, Python 3 и Repo. В последней версии Android уже установлены предустановленные версии OpenJDK, Make и Python 3, поэтому дополнительные шаги по установке не требуются. В следующем разделе объясняется, как установить Repo.

Установить репозиторий

Для установки репозитория выполните следующие действия:

  1. Загрузите актуальную информацию о пакете:

    sudo apt-get update
  2. Для установки средства запуска репозитория выполните следующую команду:

    sudo apt-get install repo

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

    В случае успеха перейдите к шагу 4.

  3. (необязательно) Установите Repo вручную, используя следующую последовательность команд:

    export REPO=$(mktemp /tmp/repo.XXXXXXXXX)
    curl -o ${REPO} https://storage.googleapis.com/git-repo-downloads/repo
    gpg --recv-keys 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65
    curl -s https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ${REPO} && install -m 755 ${REPO} ~/bin/repo

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

  4. Проверьте версию программы запуска репозитория:

    repo version

    В выходных данных должна отображаться версия 2.4 или выше, например:

    repo launcher version 2.45

Скачайте исходный код Android.

Исходный код Android находится в наборе репозиториев Git, размещенных Google. Каждый репозиторий Git содержит полную историю изменений исходного кода Android, включая изменения и время их внесения. Чтобы загрузить исходный код Android:

  1. Перейдите в свою домашнюю директорию:

    cd ~
  2. Создайте внутри него локальную рабочую подкаталог:

    mkdir aosp
  3. Перейдите в каталог:

    cd aosp
  4. Инициализируйте ветку последнего релиза исходного кода репозитория AOSP ( android-latest-release ):

    repo init --partial-clone -b android-latest-release -u https://android.googlesource.com/platform/manifest
  5. Введите или подтвердите свои учетные данные Git (имя, адрес электронной почты).

  6. Синхронизируйте исходный код:

    repo sync -c -j8

    Если у вас возникнут проблемы во время загрузки, обратитесь к разделу «Устранение неполадок и исправление проблем с синхронизацией» .

Скомпилируйте код

Для сборки кода:

  1. В рабочей директории выполните команду `source envsetup.sh для настройки среды сборки:

    source build/envsetup.sh
  2. Укажите тип целевого устройства для сборки с помощью команды lunch . Целевое устройство — это комбинация устройств, например, конкретная модель или форм-фактор. Укажите следующее целевое устройство:

    lunch aosp_cf_x86_64_only_phone-aosp_current-userdebug

    Вы должны увидеть краткое описание вашей целевой среды и среды сборки:

    ============================================
    PLATFORM_VERSION_CODENAME=Baklava
    PLATFORM_VERSION=Baklava
    TARGET_PRODUCT=aosp_cf_x86_64_only_phone
    TARGET_BUILD_VARIANT=userdebug
    TARGET_ARCH=x86_64
    TARGET_ARCH_VARIANT=silvermont
    HOST_OS=linux
    HOST_OS_EXTRA=Linux-6.10.11-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete
    HOST_CROSS_OS=windows
    BUILD_ID=BP1A.250305.020
    OUT_DIR=out
    ============================================
    
  3. Создайте целевой объект:

    m

Ожидайте, что первая сборка займет несколько часов. Последующие сборки займут значительно меньше времени. Результат сборки отображается в $OUT_DIR .

Запуск каракатицы

Cuttlefish — это эмулятор Android, используемый для тестирования ваших сборок.

  1. Выполните следующие команды, чтобы загрузить, собрать и установить пакеты Debian для хост-системы:

    sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curl
    git clone https://github.com/google/android-cuttlefish
    cd android-cuttlefish
    for dir in base frontend; do
    pushd $dir
    # Install build dependencies
    sudo mk-build-deps -i
    dpkg-buildpackage -uc -us
    popd
    done
    sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f
    sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f
    sudo usermod -aG kvm,cvdnetwork,render $USER
    sudo reboot

    Перезагрузка запускает установку дополнительных модулей ядра и применяет правила udev .

  2. Запуск Cuttlefish:

    launch_cvd --daemon
    
  3. Подключитесь к устройству Cuttlefish, перейдя по адресу https://localhost:8443 в вашем веб-браузере. Отобразится ваше виртуальное устройство на базе Android.

Внесите изменения

Обновите исходный код, следуя этому примеру в списке изменений .

  1. Из корневой директории вашей папки с загруженными файлами (каталог aosp/ ) перейдите в Git-проект frameworks/native :

    cd frameworks/native
  2. Запустите временный проект с помощью этой команды:

    repo start PROJECT_NAME.
  3. Используйте свой редактор для редактирования файла SurfaceFlinger.cpp , расположенного по следующему пути:

    aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
    
  4. Найдите эту строку:

    void SurfaceFlinger::updateColorMatrixLocked() {
    
  5. Добавьте эту строку в начало функции updateColorMatrixLocked() :

    mClientColorMatrix = mat4(vec4{1.0f, 0.0f, 0.0f, 0.0f}, vec4{0.0f, -1.0f, 0.0f, 0.0f},
                             vec4{0.0f, 0.0f, -1.0f, 0.0f}, vec4{0.0f, 1.0f, 1.0f, 1.0f});
    
  6. Скомпилируйте код:

    m
  7. Обновите сборку на устройстве:

    adb root
    adb remount -R
    adb root
    adb sync
    adb reboot
  8. Убедитесь, что на выбранном устройстве происходит изменение цвета, аналогичное показанному на рисунке 1.

    Example of a successful color
change

    Рисунок 1. Изображение на экране после успешной смены цвета.

Исправить тест

В этой части практического задания используется пример теста из исходного кода, который не проходит проверку.

Для запуска, отладки и исправления теста следуйте этим инструкциям:

  1. Бегать:

    atest DevCodelabTest

    Тест провален.

  2. Изучите трассировку стека неудачного теста:

    STACKTRACE:
    java.lang.AssertionError
     at org.junit.Assert.fail(Assert.java:87)
     at org.junit.Assert.assertTrue(Assert.java:42)
     at org.junit.Assert.assertTrue(Assert.java:53)
     at android.test.example.devcodelab.DevCodelabTest.testHelloWorld(DevCodelabTest.java:29)

    Последняя строка трассировки стека показывает тест, который не проходит ( testHelloWorld ). Этот тест находится в файле DevCodelabTest.java .

  3. Чтобы определить местоположение теста, который нужно исправить, добавьте WORKING_DIRECTORY /platform_testing/tests/example/devcodelab/src/ к последней строке трассировки стека, вплоть до имени файла теста включительно. Таким образом, android.test.example.devcodelab.DevCodelabTest станет WORKING_DIRECTORY /platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java .

  4. Отредактируйте platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java и замените Assert.assertTrue(false) на Assert.assertTrue(true)

  5. Повторите тест, чтобы убедиться, что проблема устранена:

    atest DevCodelabTest

Загрузите свой код для проверки.

Repo упрощает использование Git, объединяя такие команды, как git clone для одновременной работы с множеством репозиториев (или проектов) Git.

Для проверки кода ваших проектов в Git используйте веб-систему проверки кода Gerrit .

  1. Предположим, вы внесли изменения в проект frameworks/native . Для загрузки изменений выполните следующие команды:

    cd frameworks/native
    repo start PROJECT_NAME.
    git add .
    git commit
  2. В поле "Сообщение коммита" введите следующее:

    Android PROJECT_NAME. change
    Test: manual atest
    
  3. Загрузите свои изменения:

    repo upload

    Если вам это удастся, вы увидите сообщение, похожее на это:

    Upload project frameworks/native/ to remote branch android17-release:
     branch PROJECT_NAME. ( 1 commit, Wed Aug 7 09:32:33 2019 -0700):
            ff46b36d android PROJECT_NAME. change
    to https://android-review.googlesource.com/ (y/N)? y
    remote: Processing changes: refs: 1, new: 1, done
    remote:
    remote: SUCCESS
    remote:
    remote:   https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432 android PROJECT_NAME. change [NEW]
    remote:
    To https://android-review.googlesource.com/platform/frameworks/native
    * [new branch]          PROJECT_NAME. -> refs/for/android17-release
    

Просмотрите свои изменения в Gerrit.

Чтобы просмотреть внесенные изменения в Gerrit, перейдите по ссылке в терминале. Ссылка будет выглядеть примерно так:

https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432

Отмените внесенные изменения

Обычно после тестирования, проверки и утверждения вы отправляете свои изменения в Gerrit и объединяете их с репозиторием. Однако, в рамках этого практического занятия, отмените внесенные изменения:

  1. В Gerrit нажмите «Отменить» .

  2. Откажитесь от соответствующей временной ветки в каталоге проекта frameworks/native (или его подкаталогах):

    repo abandon PROJECT_NAME.
  3. Отмените изменения, внесенные в тестовый файл. Поскольку вы не запускали repo start , git commit и repo upload для изменений в тестовом файле, вы можете сбросить сам файл. Предполагая, что вы находитесь в aosp/platform_testing directory , используйте следующую команду для сброса файла:

    git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
    git checkout .

На этом завершается практический урок по разработке приложений для платформы Android.

Обратитесь за помощью

Если во время выполнения этого практического задания вы столкнетесь с ошибками, сообщите о них, используя ссылку «Отслеживание ошибок» внизу любой страницы. Вопросы можно отправлять в группу разработчиков Android .

Введите команду ps -A | grep crosvm чтобы проверить, запущен ли уже crosvm . Если crossvm запущен, введите stop_cvd || true или kill crosvm , указав его PID.