网易首页 > 网易号 > 正文 申请入驻

Android 15 适配之16K Page Size :为什么它会是最坑的一个适配点

0
分享至

首先什么是 Page Size ?一般意义上,页面(Page)指的就是 Linux 虚拟内存管理中使用的最小数据单位,页面大小(Page Size)就是虚拟地址空间中的页面大小, Linux 中进程的虚拟地址空间是由固定大小的页面组成。

对于虚拟内存, CPU 的内存管理单元(MMU)会将虚拟地址转换为物理地址,所以虚拟内存最终也会映射到物理内存页面。

而为了实现虚拟内存到物理的映射,两个地址空间都会被划分为多个固定页面,而虚拟空间和物理空间中的页面需要大小相同,通常长度为 4K,为了区分虚拟页面和物理页面,后者一般会被称为页框(page frames )。

❝ 就是每个应用都有自己独特的虚拟地址空间,并且它永远也不要关心其他应用在做什么,占据了哪些真实地址,实际物理地址映射,是由 Linux 内核去管理和分配,虚拟内存也是为什么系统支持多应用同时运行的基础。

剩下的就很简单了,因为 Android 用的是 Linux 内核,所以在这部分逻辑一直以来都是遵循 Linux 的实现,只是 Android 由于「历史因素」限制,一直只支持 4 KB 内存页面大小,而现在为了优化系统内存性能,提高内存密集型工作负载的性能,Android 15 开始将采用 16KB 页面大小的要求。

那前面说了那么多「无用的知识」,核心还是 Android 15 要启动 16K Page Size 了,对于我们来说有什么影响?

先说理论上的正面影响:

  • 系统面临内存压力时缩短应用启动时间:平均缩短 3.16%,某些应用的改进甚至高达 30%

  • 降低应用启动时的耗电量:平均减少 4.56%

  • 相机启动速度更快:热启动速度平均加快 4.48%,冷启动速度平均加快 6.60%

  • 改善系统启动时间:平均改善1.5%(约0.8秒)

那么负面影响是什么?你带有.so的 android 项目,很可能需要重新编译带有全新的动态库(.so) 才能正常运行对应功能,不然大概率会 crash

至于你的项目里有没有动态库,相信你应该很清楚,如果不清楚,直接把 apk 拖到 Android Studio ,看看 lib 下是否有 so 文件即可。

那为什么说用 Android 15 启动 16K Page Size 后,以往使用了 C/C++(native)代码的基本都会 crash 呢?这就是前面说到的 Linux 下 Page Size 的实现

可能大家会觉得,为什么不能有兼容层,将 4k 页面大小转换为 16k 页面大小?

理论上这是可行的,比如你可以使用虚拟化技术让 4K 的应用跑在 16K 主机上,但是想要系统直接混搭 Page Size 支持,是一个比较困难的事情。

前面我们知道,虚拟内存和物理内存之间存在映射,那么如果 CPU 处于 16K 模式,那么其实所有内容都会处于 16K 模式,简单不严谨的理解,这会是一个 CPU 全局寄存器设置的概念。

❝ 所以对于所有空间页面而言,在任意时刻要么是 4K,要么是 16K ,页表结构在 4K 模式和 16K 模式下完全不同(每级页面、级数、屏蔽)。

这里扯一段额外的东西, Apple Silicon 的 MacOS 其实是有混合 16K/4K 支持,事实上 macOS 本身始终以 16K 页面运行,只有 Rosetta 模式下应用会以 4K 模式运行:

❝ 我大概记得好像是,在 macOS 上,Rosetta 模式用户空间和内核空间的页面大小可以不同,不同的用户空间程序可以使用不同的页面大小运行。

因为 Linux 不支持混合 Page Size,默认上 android 也不支持,除非 Android OS 层后续也做类似 Rosetta 等处理

如何检测

前面讲了那么多废话,大家肯定还是很关心,如何知道我的 App 是否支持 16K Page Size 运行。

❝ 虽然带有陈年 .so 的很大概率不行,但是也许呢?

最简单且最实用的做法就是通过模拟器 VanillaIceCream 的APIs Experimental 16k Page Size ARM 64 v8a System Image进行测试。

根据自己的设备,如上图选择下载一个 VanillaIceCream 的 16k Page Size 的模拟器镜像,然后在 Other Images 选择下载的镜像创建模拟器。

注意,这里干货来咯,因为老板本 AS 在 LLDB 调试 16 KB 模拟器系统映像会存在问题,所以至少需要下载一个 Android Studio Koala Feature Drop | 2024.1.2 Canary 5,就是如下图所示这个,带 Drop 版本的才能成功运行 16K Page Size 模拟器。

❝ 什么是 Drop 版本?可以参考:https://juejin.cn/post/7379816515551723546

运行模拟器之后,通过adb shell getconf PAGE_SIZE可以获取到一个16384的值,说明系统现在已经是 16K 的模式。

那么,我把 GSYVideoPlayer 运行到 16K 模拟器后,不出所料 IJK 内核无法正常播放。

另外,官方提供了一个 16 KB ELF 对齐脚本来验证共享库的 ELF 段是否正确对齐,如下脚本针对 GSYVideoPlayer 里的动态库进行校验后,输出却是比较意外。

#!/bin/bash
 # usage: alignment.sh path to search for *.so files

dir="$1"

RED="\e[31m"
GREEN="\e[32m"
ENDCOLOR="\e[0m"

matches="$(find $dir -name "*.so" -type f)"
IFS=$'\n'
for match in $matches; do
  res="$(objdump -p ${match} | grep LOAD | awk '{ print $NF }' | head -1)"
  if [[ $res =~ "2**14" ]] || [[ $res =~ "2**16" ]]; then
    echo -e "${match}: ${GREEN}ALIGNED${ENDCOLOR} ($res)"
  else
    echo -e "${match}: ${RED}UNALIGNED${ENDCOLOR} ($res)"
  fi
done

可以看到此时动态库是 ALIGNED 的,并且是2**16,也就是armv68a的动态库此时的 ELF 对齐。

另外,通过 sdk 的build-tools/35.0.0下的zipalign命令运行:

./zipalign -c -P 16 -v 4 /Users/guoshuyu/workspace/android/GSYVideoPlayer/app/build/outputs/apk/release/app-release.apk

可以看到此时的 apk 对齐也是没有问题的,所以此时的运行问题可能更多在于 C++ 代码里的mmap或者sysconf等代码存在问题,例如写死了4096等硬编码。

对于 LLDB 调试 16 KB 模拟器,需要 NDK r27 RC 1的支持, 如果使用 r27 及以上的版本,那么只需要在Application.mk配置:

APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true

如果是 Android NDK r26 及更低版本 ,则需要在Android.mk启用 16 KB ELF 对齐 :

LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"

另外,构建支持 16 KB 设备的应用还需要 AGP 8.3 + 的支持,16 K 设备会要求附带未压缩共享库的应用将它们对齐到 16 KB 压缩对齐,为此升级到 Android Gradle 插件 (AGP) 版本 8.3+ 会是一个比较好的选择。

如果使用 AGP 版本 8.2或更低的版本,那么另一种选择是切换到使用压缩共享库

如果无法将 AGP 升级到 8.3 或更高版本,那么另一种选择是切换到使用压缩共享库:

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging true
      }
  }
}

也就是什么?适配的基础是重新编译.so,重新编译的基础是:

  • NDK r27 推荐,NDK r26 及更低版本可以修改max-page-size,当然太低是真不行,反正目前测试我的 NDK r10e 是有问额····

  • AGP 8.3 + 推荐,低版本可以用useLegacyPackaging

当然,重新编译只是基础,代码里使用了例如mmap或者硬编码 4096 的地方,都需要修改适配

那么问题来了,老旧.so连源码都没有的情况下,是不是没救了?答案是肯定的,确实没救了,更糟心的是:谷歌计划明年将对 16k 设备的支持作为 Google Play 应用程序提交的必要条件

❝ 本质上你的 .so 可能已经是 16K 对齐,但是还存在逻辑适配问题。

所以逃是逃不开了,好消息是目前这是一个实验性的阶段,另一个好消息,那就是 Flutter 本身已经支持了 16k,在测试里 Flutter 3.22 是可以在 16K 模拟器上正常运行,这一定程度也算不幸中的万幸了。

所以心凉了没?从目前看,基于 Linux 内核下的 16K Page Size 很大可能不支持 4K Page Size 的 C/C++ native 代码,所以可以遇见的情况有这么几种:

  • Android OS 最终落地了混合 Page Size 支持

  • 重新编译和修改.so支持 16K

所以大家觉得会是怎么样的一个结果?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
再见开拓者!22.7分5.6篮板新星被裁!杨瀚森呀杨瀚森!说你啥呢

再见开拓者!22.7分5.6篮板新星被裁!杨瀚森呀杨瀚森!说你啥呢

林子说事
2026-03-04 13:19:55
挂断王毅电话后,以色列大军突然向北进攻,第二场大战爆发

挂断王毅电话后,以色列大军突然向北进攻,第二场大战爆发

Ck的蜜糖
2026-03-04 17:58:13
炸锅!斯洛特下课倒计时?利物浦连夜敲定新帅

炸锅!斯洛特下课倒计时?利物浦连夜敲定新帅

澜归序
2026-03-05 01:00:44
英媒爆出猛料:中国或违反联合国规定,运送超高音速导弹给伊朗!

英媒爆出猛料:中国或违反联合国规定,运送超高音速导弹给伊朗!

始于初见见
2026-03-02 19:33:23
韩国菲律宾惊出一身冷汗:美以伊战争,让反导神器萨德变炸弹磁铁

韩国菲律宾惊出一身冷汗:美以伊战争,让反导神器萨德变炸弹磁铁

触摸史迹
2026-03-04 19:09:08
突然大涨!超12万人爆仓

突然大涨!超12万人爆仓

中国基金报
2026-03-04 19:14:48
宁可放弃中国市场,也不删镜头!《蜘蛛侠:英雄无归》没引进的真相终于来了

宁可放弃中国市场,也不删镜头!《蜘蛛侠:英雄无归》没引进的真相终于来了

小椰的奶奶
2026-03-02 10:32:14
狂胜27分,近18战15胜NBA唯一!3点证明超级鱼腩蜕变成黑马非偶然

狂胜27分,近18战15胜NBA唯一!3点证明超级鱼腩蜕变成黑马非偶然

锅子篮球
2026-03-04 12:53:51
不到24小时,以外长致电王毅,主动对华承诺,以色列是想找好退路

不到24小时,以外长致电王毅,主动对华承诺,以色列是想找好退路

科普100克克
2026-03-04 17:28:54
谁说这个民族不配得自由?

谁说这个民族不配得自由?

通往远方的路
2026-03-03 09:29:48
注意!3月13日起,北京西站北广场螺旋盘道及二层落客平台封闭施工

注意!3月13日起,北京西站北广场螺旋盘道及二层落客平台封闭施工

北青网-北京青年报
2026-03-04 13:21:02
1947年他带着华东野战军4个师投蒋,一生7次叛变,最后结局如何?

1947年他带着华东野战军4个师投蒋,一生7次叛变,最后结局如何?

夏目历史君
2026-03-03 21:47:45
中国音乐家李梳曈在纽约路边换胎时被撞身亡,年仅35岁,留下妻子和仅1岁的孩子

中国音乐家李梳曈在纽约路边换胎时被撞身亡,年仅35岁,留下妻子和仅1岁的孩子

大象新闻
2026-02-26 13:45:03
央视公布!中国卫星立大功,全程直播美军行动,一举一动尽收眼底

央视公布!中国卫星立大功,全程直播美军行动,一举一动尽收眼底

缘史记
2026-03-04 14:24:52
美军袭击伊朗军舰视频曝光,已打捞出约80具遗体!美防长:这是自二战以来,美国潜艇首次对敌舰发射鱼雷

美军袭击伊朗军舰视频曝光,已打捞出约80具遗体!美防长:这是自二战以来,美国潜艇首次对敌舰发射鱼雷

都市快报橙柿互动
2026-03-04 23:39:56
加快男性衰老的因素:喝酒仅第5,排在第1的,很多男性还没发现!

加快男性衰老的因素:喝酒仅第5,排在第1的,很多男性还没发现!

医学科普汇
2026-01-27 10:41:31
李莉评论区被冲,过往言论被反复吐槽,伊朗半小时灭以,回旋镖!

李莉评论区被冲,过往言论被反复吐槽,伊朗半小时灭以,回旋镖!

眼光很亮
2026-03-01 15:39:43
安徽高速00后收费员“笑得没眼睛”治愈全网,当事人回应:每次都是真心微笑,就是眼睛比较小

安徽高速00后收费员“笑得没眼睛”治愈全网,当事人回应:每次都是真心微笑,就是眼睛比较小

极目新闻
2026-03-03 22:04:30
电动车或将淘汰,替代品已出现,不充电不怕冷,续航超过100公里

电动车或将淘汰,替代品已出现,不充电不怕冷,续航超过100公里

蜉蝣说
2026-03-04 15:26:41
猪油再次被关注!医生发现:高血压患者常吃猪油,或出现几种变化

猪油再次被关注!医生发现:高血压患者常吃猪油,或出现几种变化

蜉蝣说
2026-02-23 21:23:05
2026-03-05 07:24:49
君伟说
君伟说
分享职场故事
380文章数 48关注度
往期回顾 全部

科技要闻

多位核心离职,阿里亲手废掉最强AI天团?

头条要闻

外媒称伊朗封锁霍尔木兹海峡只让中俄船通行 中方回应

头条要闻

外媒称伊朗封锁霍尔木兹海峡只让中俄船通行 中方回应

体育要闻

2026年中超,为什么值得你多看一眼?

娱乐要闻

谢谢谢娜 贡献出26年内娱的第一个笑话

财经要闻

人大代表建议:将农民养老金提到500元

汽车要闻

鸿蒙智行首款猎装车 尚界Z7/Z7T首发

态度原创

手机
教育
数码
健康
公开课

手机要闻

OPPO Find X9 Ultra通过3C认证,支持100W 快充

教育要闻

志愿填报必看!西安科大高新3大高就业专业

数码要闻

库克秀刀法 苹果MacBook Neo搭载残血版A18 Pro:砍掉一个GPU核心

转头就晕的耳石症,能开车上班吗?

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版