Исторически сложилось так, что Android поддерживал только размеры страниц памяти 4 КБ, что оптимизировало производительность системной памяти для среднего объема общей памяти, который обычно имеется в устройствах Android. Начиная с Android 15, AOSP поддерживает устройства, настроенные на использование страницы размером 16 КБ (устройства 16 КБ). Если ваше приложение использует какие-либо библиотеки NDK , прямо или косвенно через SDK, вам потребуется пересобрать приложение, чтобы оно работало на этих устройствах с размером памяти 16 КБ.
Поскольку производители устройств продолжают создавать устройства с большим объемом физической памяти (ОЗУ), многие из этих устройств будут использовать размеры страниц 16 КБ (и, в конечном итоге, больше) для оптимизации производительности устройства. Добавление поддержки устройств с размером страницы 16 КБ позволяет вашему приложению работать на этих устройствах и помогает вашему приложению извлечь выгоду из связанных с этим улучшений производительности. Без перекомпиляции приложения могут не работать на устройствах с размером памяти 16 КБ, когда они будут выпущены в будущих выпусках Android.
Чтобы помочь вам добавить поддержку вашего приложения, мы предоставили рекомендации о том, как проверить, не затронуто ли ваше приложение , как пересобрать приложение (если применимо) и как протестировать приложение в среде размером 16 КБ с помощью эмуляторов (включая Android). 15 системных образов для эмулятора Android).
Преимущества и повышение производительности
Устройства, настроенные с размером страницы 16 КБ, в среднем используют немного больше памяти, но также получают различные улучшения производительности как для системы, так и для приложений:
- Сокращение времени запуска приложений, когда система испытывает нехватку памяти: в среднем на 3,16 % меньше, с более значительными улучшениями (до 30 %) для некоторых протестированных нами приложений.
- Снижение энергопотребления при запуске приложения: в среднем снижение на 4,56 %.
- Более быстрый запуск камеры: в среднем на 4,48 % более быстрый горячий запуск и в среднем на 6,60 % более быстрый холодный запуск.
- Улучшено время загрузки системы: в среднем улучшено на 8% (приблизительно 950 миллисекунд).
Эти улучшения основаны на нашем первоначальном тестировании, и результаты на реальных устройствах, вероятно, будут отличаться. По мере продолжения тестирования мы предоставим дополнительный анализ потенциальных преимуществ для приложений.
Проверьте, не затронуто ли ваше приложение
Если ваше приложение использует какой-либо собственный код , вам следует перестроить его с поддержкой устройств размером 16 КБ . Если вы не уверены, использует ли ваше приложение собственный код, вы можете использовать анализатор APK, чтобы определить, присутствует ли какой-либо собственный код , а затем проверить выравнивание сегментов ELF для всех найденных общих библиотек .
Если ваше приложение использует только код, написанный на языке программирования Java или Kotlin, включая все библиотеки и SDK, то ваше приложение уже поддерживает устройства размером 16 КБ. Тем не менее, мы рекомендуем протестировать ваше приложение в среде размером 16 КБ, чтобы убедиться в отсутствии неожиданных изменений в поведении приложения.
Использует ли ваше приложение собственный код?
Ваше приложение использует собственный код, если применимо любое из следующих условий:
- Ваше приложение использует любой (собственный) код C/C++. Если ваше приложение использует Android NDK , то оно использует собственный код.
- Ваше приложение связано с любыми сторонними собственными библиотеками или зависимостями (например, SDK), которые их используют.
- Ваше приложение создано сторонним разработчиком приложений, который использует собственные библиотеки на устройстве.
Определите собственные библиотеки с помощью APK Analyzer
APK Analyzer — это инструмент, который позволяет оценивать различные аспекты встроенного APK. Чтобы определить, использует ли ваше приложение собственный код или библиотеки, выполните следующие действия:
- Откройте Android Studio , затем нажмите «Файл» > «Открыть» и выберите любой проект.
В строке меню нажмите «Сборка» > «Анализ APK…».
Выберите APK, который хотите проанализировать.
Просмотрите папку
lib
, в которой хранятся файлы общих объектов (.so
), если таковые имеются. Если присутствуют какие-либо общие объектные файлы, ваше приложение использует собственный код. Если файлы общих объектов отсутствуют или папкаlib
отсутствует, ваше приложение не использует собственный код.
Проверьте выравнивание сегментов ELF для общих библиотек.
Для всех общих библиотек убедитесь, что сегменты ELF общих библиотек выровнены правильно, используя выравнивание ELF по 16 КБ. Если вы разрабатываете Linux или macOS, вы можете использовать сценарий check_elf_alignment.sh
как описано в следующем разделе. Вы также можете напрямую использовать инструменты командной строки .
Используйте скрипт check_elf_alignment.sh (Linux или macOS)
Выполните следующие действия, чтобы проверить выравнивание сегментов ELF с помощью сценария check_elf_alignment.sh
:
Сохраните скрипт
check_elf_alignment.sh
в файл.Запустите скрипт в APK-файле вашего приложения:
check_elf_alignment.sh APK_NAME.apk
Скрипт выводит либо
ALIGNED
, либоUNALIGNED
для всех общих библиотекarm64-v8a
.Если какие-либо общие библиотеки
arm64-v8a
илиx86_64
UNALIGNED
, вам необходимо обновить упаковку для этих библиотек , затем перекомпилировать приложение и повторно протестировать, выполнив действия, описанные в этом разделе.
Используйте инструменты командной строки напрямую
Выполните следующие шаги, чтобы проверить выравнивание сегментов ELF напрямую с помощью инструментов командной строки:
- Убедитесь, что Android SDK Build-Tools версии 35.0.0 или выше и Android NDK установлены с помощью SDK Manager в Android Studio или инструмента командной строки
sdkmanager
. Извлеките APK-файл вашего приложения:
Линукс или МакОС
unzip APK_NAME.apk -d /tmp/my_apk_out
Windows (PowerShell)
Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_out
Во временном каталоге, в который вы извлекли файл APK, проверьте содержимое каталога
lib
на наличие файлов общих объектов (.so
). Это те же файлы общих объектов, которые вы могли видеть при определении собственных библиотек с помощью APK Analyzer . Выполните следующую команду для каждого файла общего объекта:Линукс или МакОС
SDK_ROOT_LOCATION/Android/sdk/ndk/NDK_VERSION/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump -p SHARED_OBJECT_FILE.so | grep LOAD
Windows (PowerShell)
SDK_ROOT_LOCATION\Android\sdk\ndk\NDK_VERSION\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-objdump.exe -p SHARED_OBJECT_FILE.so | Select-String -Pattern "LOAD"
Где
SDK_ROOT_LOCATION
— это путь к каталогу, в котором вы установили Android SDK,SHARED_OBJECT_FILE
— это имя файла общего объекта, который вы проверяете, аNDK_VERSION
— это версия Android NDK, которую вы установили (например,28.0.12433566
.28.0.12433566
). Вывод будет выглядеть примерно следующим образом для каждого проверяемого файла:LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**14 LOAD off 0x0000000000042a90 vaddr 0x0000000000043a90 paddr 0x0000000000043a90 align 2**14 LOAD off 0x0000000000046230 vaddr 0x0000000000048230 paddr 0x0000000000048230 align 2**14
Проверьте выходные строки, чтобы убедиться, что сегменты нагрузки не имеют значений меньше
2**14
. Если какие-либо сегменты загрузки имеют значения2**13
,2**12
или меньше, вам потребуется обновить упаковку для этих библиотек , затем перекомпилировать приложение и повторно протестировать, выполнив действия, описанные в этом разделе.Затем запустите инструмент командной строки
zipalign
для APK-файла вашего приложения:Линукс или МакОС
SDK_ROOT_LOCATION/Android/sdk/build-tools/35.0.0/zipalign -v -c -P 16 4 APK_NAME.apk
Windows (PowerShell)
SDK_ROOT_LOCATION\Android\sdk\build-tools\35.0.0\zipalign.exe -v -c -P 16 4 APK_NAME.apk
Где
SDK_ROOT_LOCATION
— это путь к каталогу, в котором вы установили Android SDK, аAPK_NAME
— это имя APK-файла вашего приложения. В последней строке вывода будет указано «Проверка успешна», если все общие библиотеки выровнены правильно.Если проверка не удалась, некоторые общие библиотеки необходимо перенастроить, поэтому вам потребуется обновить упаковку для этих библиотек , а затем перекомпилировать приложение и повторно протестировать, выполнив действия, описанные в этом разделе.
Создайте свое приложение с поддержкой устройств с размером памяти 16 КБ.
Для поддержки устройств с размером памяти 16 КБ приложения, использующие собственный код, должны выполнить действия, описанные в следующих разделах. Если вы обновите AGP до версии 8.5.1 или выше и NDK версии r28 или выше и используете готовые зависимости, совместимые с размером 16 КБ, то приложения по умолчанию будут совместимы с размером 16 КБ.
Обновите упаковку ваших общих библиотек.
Мы рекомендуем вам перейти на AGP версии 8.5.1 или выше и использовать несжатые общие библиотеки.
AGP версии 8.5.1 или выше
Устройствам размером 16 КБ требуются приложения, поставляемые с несжатыми общими библиотеками, для выравнивания их по границе 16 КБ, выровненной по zip-архиву. Для этого вам необходимо обновить плагин Android Gradle (AGP) до версии 8.5.1 или выше. Подробную информацию о процессе обновления см. в разделе «Помощник по обновлению плагина Android Gradle» .
AGP версии 8.5 или ниже
Если вы не можете обновить AGP до версии 8.5.1 или выше, альтернативой является переключение на использование сжатых общих библиотек. Обновите конфигурацию Gradle, чтобы Gradle сжимал ваши общие библиотеки при упаковке вашего приложения, чтобы избежать проблем с установкой приложения с несогласованными общими библиотеками.
классный
В файле build.gradle
добавьте следующую опцию:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
Котлин
В файле build.gradle.kts
добавьте следующую опцию:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
Скомпилируйте приложение, используя выравнивание ELF размером 16 КБ.
Для работы вашего приложения устройствам размером 16 КБ требуется, чтобы сегменты ELF общих библиотек были правильно выровнены с использованием выравнивания ELF 16 КБ.
Чтобы скомпилировать приложение с использованием выравнивания ELF размером 16 КБ, выполните действия, описанные в одном из следующих разделов, в зависимости от используемой версии Android NDK.
Android NDK r28 и выше
NDK версии r28 и выше по умолчанию компилирует 16 КБ с выравниванием.
Андроид НДК r27
Чтобы поддерживать компиляцию общих библиотек размером 16 КБ с Android NDK версии r27 и выше, вам необходимо обновить флаги ndk-build
, build.gradle
, build.gradle.kts
или компоновщика следующим образом:
ndk-сборка
В вашем Application.mk
:
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
классный
В файле build.gradle
установите аргумент -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
:
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
}
}
}
}
Котлин
В файле build.gradle.kts
установите аргумент -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
:
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments += listOf("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON")
}
}
}
}
Другие системы сборки
Укажите следующие флаги компоновщика:
-Wl,-z,max-page-size=16384
Android NDK r26 и более ранние версии
Чтобы поддерживать компиляцию общих библиотек размером 16 КБ с помощью Android NDK версии r26 или ниже, вам необходимо обновить конфигурацию ndk-build
или cmake
следующим образом:
ndk-сборка
Обновите свой Android.mk
, чтобы включить выравнивание ELF размером 16 КБ:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
CMake
Обновите файл CMakeLists.txt
, чтобы включить выравнивание ELF размером 16 КБ:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
Проверьте экземпляры кода, которые ссылаются на определенные размеры страниц.
Даже если ваше приложение выровнено по 16 КБ, оно может столкнуться с ошибками, если места в вашем коде предполагают, что устройство использует определенный размер страницы. Чтобы этого избежать, выполните следующие действия:
Удалите все жестко запрограммированные зависимости, которые ссылаются на константу
PAGE_SIZE
, или экземпляры в логике вашего кода, которые предполагают, что размер страницы устройства составляет 4 КБ (4096
).Вместо этого используйте
getpagesize()
илиsysconf(_SC_PAGESIZE)
.Найдите варианты использования
mmap()
и других API, требующих аргументов, выровненных по страницам, и при необходимости замените их альтернативами.
В некоторых случаях, если ваше приложение использует PAGE_SIZE
в качестве удобного значения, не привязанного к базовому размеру страницы, это не приведет к сбою вашего приложения при использовании в режиме 16 КБ. Однако если это значение передается ядру с помощью mmap
без MAP_FIXED
, ядро все равно использует всю страницу, что приводит к потере некоторой памяти. По этим причинам PAGE_SIZE
не определен, если режим 16 КБ включен в NDK r27 и выше.
Если ваше приложение использует PAGE_SIZE
таким образом и никогда напрямую не передает это значение ядру, то вместо использования PAGE_SIZE
создайте новую переменную с новым именем, чтобы отразить, что она используется для других целей и не отражает реальную страницу памяти.
Проверьте SDK на наличие поддержки 16 КБ.
Многие SDK совместимы со страницами размером 16 КБ, особенно если вы создаете их самостоятельно или используете последние готовые сборки. Однако, поскольку некоторые готовые версии SDK или версии SDK несовместимы с размером 16 КБ, вам следует проверить веб-сайт каждого поставщика SDK, чтобы определить, какую версию использовать с размером 16 КБ.
Протестируйте свое приложение в среде размером 16 КБ.
После того как вы создадите свое приложение с поддержкой устройств с размером памяти 16 КБ, вам нужно будет протестировать свое приложение в среде 16 КБ, чтобы увидеть, наблюдается ли в вашем приложении какие-либо регрессии. Для этого выполните следующие действия:
Настройте одну из следующих сред тестирования:
Запустите тестовое устройство, затем выполните следующую команду, чтобы убедиться, что оно использует среду размером 16 КБ:
adb shell getconf PAGE_SIZE
Команда должна вернуть значение
16384
.Выполните следующую команду
zipalign
, чтобы убедиться, что ваше приложение выровнено по размеру 16 КБ, где APK_NAME — это имя APK-файла вашего приложения:zipalign -c -P 16 -v 4 APK_NAME.apk
Тщательно протестируйте свое приложение, уделяя особое внимание всем областям, на которые может повлиять изменение экземпляров кода, ссылающихся на определенные размеры страниц .
Настройте эмулятор Android с помощью образа системы Android 15 размером 16 КБ.
Чтобы настроить среду размером 16 КБ с помощью эмулятора Android, выполните следующие действия:
Образы системы эмулятора Android 15 размером 16 КБ совместимы с Android Studio Jellyfish | 2023.3.1 или выше. Однако для получения наилучших результатов при работе с бета-версией Android 15 загрузите последнюю предварительную версию Android Studio.
Помните, что вы можете оставить существующую версию Android Studio установленной, так как вы можете установить несколько версий одновременно .
В Android Studio нажмите «Инструменты» > «Менеджер SDK» .
На вкладке «Платформы SDK» установите флажок «Показать сведения о пакете» , затем разверните раздел «Предварительный просмотр Android VanillaIceCream» и выберите один или оба следующих образа системы эмулятора, в зависимости от виртуальных устройств, которые вы хотите создать:
- API Google Экспериментальный размер страницы 16 тыс. Системный образ ARM 64 v8a
- API Google Экспериментальный размер страницы 16 КБ Изображение системы Intel x86_64 Atom
Нажмите «Применить» > «ОК» , чтобы загрузить выбранные вами образы системы.
Следуйте инструкциям по настройке виртуального устройства для Android 15 , а когда будет предложено выбрать образ системы, выберите загруженный вами образ системы размером 16 КБ. Если это не рекомендуется автоматически, вы можете найти системный образ размером 16 КБ на вкладке «Другие изображения» .
- В диспетчере устройств нажмите 3 точки рядом с изображением размером 16 КБ, затем нажмите «Показать на диске» .
- В этой папке найдите файл
config.ini
. Добавьте следующую строку в файл
config.ini
и сохраните изменения:kernel.parameters = androidboot.page_shift=14
Чтобы проверить изменения, выполните следующую команду, которая должна вернуть
16384
:adb shell getconf PAGE_SIZE
Включите режим 16 КБ на устройстве, используя параметры разработчика.
Начиная с Android 15 QPR1, вы можете использовать опцию разработчика , доступную на некоторых устройствах, для загрузки устройства в режиме 16 КБ и выполнения тестирования на устройстве.
Этот вариант разработчика доступен на следующих устройствах:
- Pixel 8 и 8 Pro (с Android 15 QPR1 или более поздней версии)
- Pixel 8a (с Android 15 QPR1 или более поздней версии)
- Pixel 9, 9 Pro и 9 Pro XL (с Android 15 QPR2 Beta 2 или более поздней версии)