Android и 16KB величина меморијских страница: ролеркостер једне миграције
Мислили смо да ће нам требати једно преподне. Требало нам је три недеље.
И тако Google објави: „Хеј, народе, од 1. новембра 2025. ваше апликације морају да подржавају 16KB величину страница. Биће лако!“
Мигрирали смо Arheev, мобилну апликацију наше интелигентне HR платформе. Прочитали смо документацију. Деловало је једноставно. Ажурирамо неколико алата за билд, додамо пар конфигурационих флегова, можда попијемо кафу док се билдује. Готово до ручка, зар не?
Глас наратора: Није било готово до ручка.
Шта је Google хтео (и зашто)
Основна идеја има смисла. Android од памтивека користи меморијске странице од 4KB, али модерни уређаји са гомилом RAM-а боље раде са страницама од 16KB. Google-ови сопствени подаци показују лепа побољшања:
- Апликације се покрећу 3% брже када је меморија телефона пуна
- 4.5% мања потрошња батерије при покретању
- Апликације за камеру раде 5–7% брже
- Телефон се подиже 8% брже
Лепе предности! Па где је квака?
Прави проблем на који нас нико није упозорио
Е, овде постаје занимљиво. Свака нативна библиотека (.so фајл) у вашој апликацији мора да буде „поравната“ на границе од 16KB. Замислите то као паркинг: ваша библиотека мора уредно да стане у паркинг-места величине 16KB.
Ако пишете чисту Java/Kotlin апликацију, безбедни сте. Нема нативног кода, нема проблема.
Али Arheev мобилна апликација направљена је у React Native-у. А React Native апликације су у суштини нативне библиотеке умотане у JavaScript умотан у још нативних библиотека умотаних у егзистенцијална питања зашто једноставно нисмо направили одвојене нативне апликације.
Када библиотеке нису правилно поравнате, добијате:
- Апликације које одбијају да се инсталирају
- Загонетне поруке о грешкама које вам ништа не говоре
- Падове који се дешавају само на одређеним уређајима (обично баш на онима које ваш шеф тестира)
Баш забавно!
Шта се заправо догодило: хронологија
Дан 1: „Ово ће бити лако“
Ажурирали смо на Android Gradle Plugin 8.5.1 и NDK r28. Документација је тврдила да ове верзије аутоматски решавају поравнање на 16KB. Додали смо неколико флегова у AndroidManifest.xml:
<application
android:enableOnBackInvokedCallback="true"
android:extractNativeLibs="true">
<property
android:name="android.app.16kb_page_size"
android:value="true" />
</application>
Билд је прошао. Тестови зелени. Тапшали смо се по раменима. Миграција за мање од сат времена, ко би рекао!
Дан 3: „Зашто ово не ради?“
Подигли смо Android 15 емулатор са укљученом подршком за 16KB. Инсталирали апликацију. Пала је истог тренутка.
Испоставило се да неколико библиотека скривених у нашем стаблу зависности није било поравнато на 16KB:
- Наша библиотека за обраду звука (libandroidlame.so)
- Нека ствар за компресију слика
- SDK треће стране који смо једва и памтили да смо додали
Порука о грешци? „Native module initialization failed.“ Хвала, Android-е. Баш си од помоћи.
Провели смо два дана учећи о ELF поравнању више него што смо икада желели да знамо.
Дан 5: „Добро, заобићи ћемо то“
После много гугловања (и можда мало роњења по Stack Overflow-у уз кафу) пронашли смо магични флег: android:extractNativeLibs="true".
Он говори Android-у да библиотеке распакује при инсталацији апликације уместо да их учитава директно из APK-а. Тако се захтев за поравнање практично потпуно заобилази.
Да ли је савршено? Не. Да ли ради? Да. Да ли то шаљемо у продукцију? Апсолутно.
Добро:
- Тренутно је решило наше падове
- Ради са било којом библиотеком, поравнатом или не
- Нема чекања да програмери трећих страна ажурирају своје ствари
Мање добро:
- Апликације се инсталирају мало дуже
- Заузима више простора на уређају
- Google би ово временом могао да укине (али то је проблем нас из будућности)
Ово третирамо као привремено решење док са одржаваоцима библиотека радимо на правим верзијама поравнатим на 16KB.
Дан 7: „Хајде да ово аутоматизујемо пре него што заборавимо“
Последње што смо желели јесте да неко покрене expo prebuild и случајно обрише све наше тешко стечене конфигурације.
Зато смо направили Expo конфигурациони плагин који све решава аутоматски:
Измене у AndroidManifest.xml:
- Додаје својство за 16KB величину страница
- Укључује callback за гест „назад“
- Поставља флег extractNativeLibs
Ажурирања у build.gradle:
- Конфигурише NDK ABI филтере
- Укључује подршку за multidex
- Подешава потписивање release билда
Подешавања у gradle.properties:
- Подешавања алата за билд
- Флегови за нову архитектуру React Native-а
- Оптимизација ресурса
Сада, кад год неко из тима покрене prebuild, сва ова подешавања једноставно… раде. Нема више тренутака типа „чекај, где је нестао онај конфиг?“.
Ствари које смо волели да знамо од првог дана
1. Прво ажурирајте све
Немојте ни да помишљате да почнете ову миграцију без Android Gradle Plugin-а 8.5.1+ и NDK-а r28+. Старије верзије једноставно не решавају поравнање на 16KB како треба.
Ажурирајте свој android/build.gradle:
dependencies {
classpath('com.android.tools.build:gradle:8.5.1')
}
Да, ажурирање алата за билд је досадно. Урадите то свеједно.
2. Утврдите да ли уопште имате нативни код
Пре него што паничите, проверите да ли ваша апликација уопште користи нативне библиотеке. Најлакше је преко APK Analyzer-а у Android Studio-у:
- Отворите Android Studio (било који пројекат ће послужити)
- Кликните на Build > Analyze APK…
- Изаберите свој APK фајл
- Потражите фасциклу lib
Ако видите фасциклу lib са .so фајловима унутра, честитамо, имате нативни код са којим морате да се носите. Проверите колону Alignment за евентуална упозорења.

Нема фасцикле lib? Користите чисту Java/Kotlin и вероватно можете да прескочите већи део ове главобоље. Благо вама.
3. Заиста тестирајте на 16KB емулатору
Направите Android 15 емулатор у AVD Manager-у и укључите „16KB page size“ у напредним подешавањима. Ваш обични уређај неће ухватити ове проблеме јер и даље користи странице од 4KB.
Верујте нам, не желите да проблеме са поравнањем откријете тек након што апликација оде у продукцију.
4. Пронађите своје нативне библиотеке
Пронађите све те .so фајлове који вребају у вашој апликацији:
# List all native libraries in your APK
unzip -l app-release.apk | grep '\.so$'
Или опет отворите APK Analyzer. Много је лакше, а и интерфејс је леп.
Направите списак. Проверите да ли неке праве проблеме. Опсујте оне које праве.
5. Држите зависности на оку
Нису сви одржаваоци библиотека ускочили у 16KB воз. Неки за њега нису ни чули. За React Native:
- Проверите да ли ваша верзија Expo SDK-а има исправке
- Прегледајте GitHub issue-е за своје нативне модуле
- Размислите о промени библиотеке ако је одржавалац нестао без трага
6. Трик са extractNativeLibs је привремен
Да, android:extractNativeLibs="true" тренутно решава све. Али третирајте га као селотејп: ради, али ћете пре или касније хтети право решење. Запишите којим библиотекама је потребан и пратите њихова ажурирања.
Ваша контролна листа за миграцију (да ништа не пропустите)
Ево шта заправо треба да урадите:
- Ажурирајте AGP на 8.5.1+ и NDK на r28+
- Ажурирајте Gradle на 8.14+ (кад сте већ ту)
- Користите APK Analyzer да проверите да ли имате нативне библиотеке
- Додајте флегове за 16KB величину страница у AndroidManifest.xml
- Подесите NDK ABI филтере у build.gradle
- Додајте extractNativeLibs ако вам апликација пада
- Направите Android 15 емулатор са укљученим 16KB
- Заиста све тестирајте (немојте само претпоставити да ради)
- Направите списак проблематичних библиотека
- Аутоматизујте конфигурацију (ви из будућности ћете бити захвални)
Како то изгледа кад развијате за више платформи
Овакви захтеви платформе погађају и ваш код и баш сваку библиотеку у стаблу зависности.
Када Google каже „подржите 16KB“, сваки програмер нативних модула, сваки добављач SDK-а, сваки пакет из заједнице мора да се прилагоди. А ваша миграција је готова тек када и најспорија библиотека коначно сустигне остале.
React Native ово чини још забавнијим јер чекате више од једног екосистема: нативни iOS програмери, Android програмери и JavaScript програмери морају сви да се ускладе. То је као да чувате мачке, само што мачке уз то и жонглирају.
Да ли се исплатило?
Да ли смо после свег тог посла заиста видели побољшања?
Да, јесмо:
- Мања фрагментација меморије на новијим уређајима
- Нешто брже покретање апликације (тешко је прецизно измерити, али ту је)
- Нема више пријава типа „ваша апликација не ради на мом телефону“ од корисника Android-а 15
Заобилазно решење са extractNativeLibs мало успорава инсталацију, али када се апликација једном покрене, све делује сасвим у реду.
Шта још увек није савршено
И даље користимо extractNativeLibs="true" уместо правилно поравнатих библиотека. То ради, али је технички заобилазница, а не решење.
Неколико зависности још увек није објавило верзије поравнате на 16KB. Пратимо њихове GitHub issue-е, али неке нису ажуриране месецима. Можда ћемо их на крају морати форковати или наћи алтернативе.
И нисмо 100% сигурни како ће се ово понашати на правим 16KB уређајима када постану уобичајени. Емулатори су једно, прави хардвер нешто друго. Сазнаћемо.
Шта следи?
Вероватно још истог. Како Android телефони постају моћнији, захтеви платформе ће се и даље преливати низ стабла зависности. Аутоматизација коју смо направили за ову миграцију поново ће добро доћи код следеће.
Суштина
Ако желите да објављујете на Google Play-у, миграција на 16KB странице није ствар избора. А посла има знатно више него што документација даје наслутити.
Али када једном прођете кроз њу, мирни сте. Конфигурација се углавном сама стара о себи, апликација боље ради на новијим уређајима, а ви имате један рок мање због кога бринете.
Ако сте тренутно усред ове миграције и наилазите на чудне проблеме, нисте сами. Били смо тамо. Слободно нам се јавите ако желите да заједно кукате над поравнањем библиотека или да разменимо ратне приче о загонетним Android порукама о грешкама.
Корисни линкови ако се упуштате у ово
- Android документација о 16KB величини страница: званична документација (у којој све звучи много лакше него што јесте)
- Белешке о издањима Android Gradle Plugin-а: да проверите која вам верзија треба
- Водич за Expo конфигурационе плагине: ако користите Expo и желите да аутоматизујете овај хаос
За разлику од већине миграција, ова заиста има рок. Бар нисте сами у томе: сваки React Native програмер пролази кроз исте ноћне море са поравнањем.



