Компиляция исходного кода Android-10.0.0_r17 и прошивка на Pixel

Шаги по успешной компиляции исходного кода Android-10.0.0_r17 и прошивке на Pixel

Оригинал
Автор: yongfengnice
Дата: 18 июня 2024, 10:42:40
Категория статьи: Python, Backend-разработка

1. Подготовка окружения

Рекомендуется ознакомиться с предыдущей статьей о компиляции AOSP12, так как у меня уже была успешная сборка, и при компиляции AOSP в этот раз почти не возникло ошибок.
Ссылка на статью:

1.1 Установка виртуальной машины VMware, Linux-среды для компиляции и зависимостей AOSP

Для компиляции исходного кода Android лучше всего использовать среду Ubuntu, поэтому на Windows сначала нужно установить виртуальную машину VMware, а затем внутри неё установить Ubuntu 20.04.6 LTS Desktop.

Для установки Ubuntu требуется выделить более 16 ГБ оперативной памяти. После установки память можно изменить. Изначально я выделил 8 ГБ, но на последнем этапе компиляции система сообщала об ошибке "OutOfMemory". После изменения памяти на 16 ГБ компиляция прошла успешно.

Подготовьте окружение для компиляции AOSP: загрузите исходный код ветки android-10.0.0_r17, драйверы для Pixel, соберите исходный код и прошейте устройство.

Почему выбран именно android-10.0.0_r17? Потому что Pixel не поддерживает более новые версии. Чтобы узнать, какую версию поддерживает ваше устройство, можно посмотреть здесь: https://source.android.com/docs/setup/about/build-numbers

1.2 Установка и настройка git, curl, python, open-jdk8 и сторонних зависимостей

  • Установка и настройка git:

    1. Установка git: sudo apt-get install git
    2. Настройка email: git config --global user.email "xx@qq.com"
    3. Настройка имени пользователя: git config --global user.name "xx"
  • Установка curl:

    1. Установка curl: sudo apt-get install curl
  • Установка python:

    1. Установка python3: sudo apt-get install python
    2. Проверьте в терминале, установлена ли версия Python3, так как версия Python2 не подойдёт. Если у вас установлен Python2, необходимо найти способ переустановить или сделать символьную ссылку на Python3.
  • Установка open-jdk8:

    1. Обновите зависимости: sudo apt-get update
    2. Установка open-jdk8: sudo apt-get install openjdk-8-jdk
  • Установка сторонних зависимостей для компиляции AOSP:
    sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip libncurses5

2. Загрузка исходного кода AOSP Android10.0.0_r17

2.1 Подготовка репозитория и загрузка исходного кода

  1. Создайте каталог bin: mkdir ~/bin
  2. Добавьте каталог в PATH: PATH=~/bin:$PATH
  3. Загрузите утилиту repo в каталог bin:
    curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
  4. Дайте файлу права на выполнение: chmod a+x ~/bin/repo
  • Загрузка исходного кода android-10.0.0_r17:
    1. Создайте рабочий каталог: mkdir aosp10.0.0_r17
    2. Перейдите в каталог: cd aosp10.0.0_r17
    3. Установите источник загрузки (в данном случае — зеркало университета Цинхуа):
      export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
    4. Инициализируйте репозиторий:
      repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-10.0.0_r17
    5. Выполните синхронизацию исходного кода:
      repo sync

2.2 Установка драйверов

  1. Загрузите необходимые драйверы для устройства Pixel с официального сайта Google.
    Адрес для загрузки драйверов: https://developers.google.com/android/drivers
  2. Распакуйте файлы .tgz и выполните скрипты для установки драйверов.

3. Компиляция исходного кода

  1. Перейдите в рабочий каталог: cd aosp10.0.0_r17
  2. Инициализируйте окружение: source build/envsetup.sh
  3. Выберите цель сборки: lunch aosp_sailfish-userdebug
  4. Выполните компиляцию: make -j4

4. Прошивка устройства Pixel

  1. Установите драйверы устройства.

  2. Разблокируйте загрузчик:
    Включите режим OEM Unlock в настройках разработчика и выполните команду fastboot flashing unlock.

  3. Прошивка устройства:
    Выполните команду fastboot flashall -w

 
 
#google_devices-sailfish

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



Так и не нашёл информации. После обновления до Android 14 в приложении при первом запуске вылезает диалог "Это приложение не совместимо с последней версией Android. Проверьте наличие обновлений или свяжитесь с разработчиком приложения." При этом приложение работает без проблем.


Да, именно так. При targetSdkVersion 28 Android позволял поддерживать только armeabi-v7a, и многие устройства нормально запускали такие приложения. Однако начиная с более высоких версий (включая targetSdkVersion 35 и Android 14), Google усиливает требования к 64-битной совместимости. Поэтому, если приложение содержит только 32-битный код (armeabi-v7a), оно может считаться несовместимым на устройствах, которые требуют 64-битные библиотеки (например, arm64-v8a).
Чтобы решить проблему, нужно добавить поддержку 64-битной архитектуры (arm64-v8a) в проект.


Да, при targetSdkVersion 28 устройства с 64-битными процессорами могли эмулировать 32-битные библиотеки (armeabi-v7a), и приложение работало без проблем. Однако с новыми требованиями (начиная с targetSdkVersion 29 и выше) эмуляция 32-битных библиотек на 64-битных устройствах больше не поддерживается. Теперь приложения должны предоставлять 64-битные версии библиотек (например, arm64-v8a), иначе они считаются несовместимыми с устройствами, которые требуют 64-битный код.
Это связано с политикой Google по улучшению производительности и безопасности приложений на новых устройствах.

Да, вывод в том, что нужно сбилдить нативный код для 64-битной архитектуры, такой как arm64-v8a, чтобы ваше приложение было совместимо с новыми требованиями Android (targetSdkVersion 35). Это позволит вашему приложению работать на устройствах с 64-битными процессорами.

Вот что нужно сделать:

    Добавить поддержку arm64-v8a в build.gradle:

    groovy

    android {
        defaultConfig {
            ndk {
                abiFilters 'armeabi-v7a', 'arm64-v8a'
            }
        }
    }

    Собрать нативные библиотеки (NDK) для arm64-v8a: Убедитесь, что ваш проект NDK поддерживает 64-битную архитектуру. В CMake или ndk-build настройте сборку для arm64-v8a.

Это решит проблему совместимости на устройствах с 64-битными процессорами.


===
Если у вас нет исходников нативного кода, и вы пытаетесь просто скопировать библиотеки для armeabi-v7a в другие папки (например, arm64-v8a), это не решит проблему. Android требует наличия нативных библиотек, скомпилированных специально для 64-битной архитектуры, чтобы приложение могло корректно работать на устройствах с 64-битными процессорами.

Подкидывание armeabi-v7a библиотек в папки для arm64-v8a не будет работать, так как система будет ожидать 64-битные библиотеки для arm64-v8a, и это вызовет ошибки или падения приложения при запуске.
Возможные решения:

    Найти исходный нативный код и пересобрать его для 64-битной архитектуры.
    Найти 64-битные версии библиотек, если они доступны от разработчика нативного кода.
    Отключить поддержку 64-битных устройств, но это не рекомендуется и может привести к ограничению распространения приложения, так как Google Play требует поддержку 64-битных архитектур для targetSdkVersion 30 и выше.

К сожалению, без 64-битной версии нативных библиотек ваше приложение не будет работать на современных устройствах с 64-битными процессорами.

 Для покупки устройства для Android разработки, выбор процессора зависит от целей и требований приложения:

    arm64-v8a (64-битный ARM процессор)
        Рекомендуется для большинства современных устройств. Практически все Android устройства с 2019 года имеют 64-битные процессоры. Google требует поддержки 64-битных архитектур для приложений с targetSdkVersion 29 и выше, и это становится стандартом.
        Поддерживает как 64-битные (arm64-v8a), так и 32-битные (armeabi-v7a) приложения, поэтому это наиболее универсальный выбор для разработки.

    armeabi-v7a (32-битный ARM процессор)
        Устаревший процессор, используется на старых устройствах или некоторых бюджетных моделях. Если ваше приложение должно поддерживать старые устройства, это может быть полезным.
        Однако, многие новые устройства и версии Android (особенно Android 14 и выше) могут больше не поддерживать чисто 32-битные приложения.

    x86 и x86_64
        x86 (32-битный Intel процессор) встречается крайне редко на современных Android устройствах. Ранее использовался на некоторых планшетах и устройствах от Intel, но уже практически не актуален.
        x86_64 (64-битный Intel процессор) также не очень распространен среди мобильных устройств. В основном встречается на эмуляторах и некоторых специализированных устройствах. Могут возникнуть сложности с поддержкой nativных библиотек, если приложение целится на ARM-устройства.

Вывод:

    Если нужна универсальность и совместимость с большинством современных устройств: выбирайте устройство с arm64-v8a процессором. Оно поддерживает как 64-битные, так и 32-битные приложения.
    Если вы тестируете старые приложения с 32-битной поддержкой: можно рассмотреть устройство с armeabi-v7a, но такие устройства становятся всё реже.
    Для эмуляции или разработки специфичных приложений под Intel: устройства с x86_64, но для реальных пользователей они почти не используются.

Таким образом, arm64-v8a — оптимальный выбор для большинства задач разработки.

====

Для игр, особенно современных и требовательных к производительности, лучше всего подойдут устройства с arm64-v8a (64-битные ARM процессоры). Вот почему:

    Высокая производительность: Большинство современных игр оптимизировано для работы на 64-битных процессорах, которые обеспечивают лучшую производительность и более эффективное использование памяти.

    Поддержка современных игр: Многие игровые разработчики ориентируются на устройства с arm64-v8a, так как они составляют подавляющее большинство новых Android устройств.

    Будущая совместимость: Устройства с arm64-v8a продолжают поддерживать как 64-битные, так и 32-битные игры (armeabi-v7a), что делает их совместимыми с более старыми играми.

Причины избегать других процессоров:

    armeabi-v7a (32-битные устройства): Старые и менее производительные. Современные игры могут на них плохо работать или вовсе не запускаться, особенно с выходом новых версий Android (например, Android 14).

    x86 и x86_64: В основном используются в эмуляторах и редко встречаются на мобильных устройствах. Игры на них могут не быть так хорошо оптимизированы.

Вывод:

    Лучший выбор для игр: устройство с arm64-v8a. Это самый распространённый тип процессоров, обеспечивающий отличную производительность для современных игр и поддержку старых.

PS. Также есть ограничение GooglePlay на распостранение 32-битных приложений
и targetSdk не ниже 33

Пример обхода на Google Play

 



Декомпиляция

 Декомпиляция, удаляем строки библиотек


<string name="auth_client_(.*?)</string>

<string name="common_(.*?)</string>

удаляем ids.xml