andorid 适配 16k page size

问题背景:

Historically, Android has only supported 4 KB memory page sizes, which has optimized system memory performance for the average amount of total memory that Android devices have typically had. Beginning with Android 15, AOSP supports devices that are configured to use a page size of 16 KB (16 KB devices). If your app uses any NDK libraries, either directly or indirectly through an SDK, then you will need to rebuild your app for it to work on these 16 KB devices.

Benefits and performance gains:

  1. Lower app launch times while the system is under memory pressure: 3.16% lower on average, with more significant improvements (up to 30%) for some apps that we tested
  2. Reduced power draw during app launch: 4.56% reduction on average
    Faster camera launch: 4.48% faster hot starts on average, and 6.60% faster cold starts on average
  3. Improved system boot time: improved by 8% (approximately 950 milliseconds) on average

完整细节见:https://developer.android.com/guide/practices/page-sizes

简单说这是android15之后提供的特性,这个特性要求开发者重新编译所有的so库,以适配16k page size的尺寸。

测试辅助

按照开发者选项文档 中的指示启用 16 KB 模式

开发自查

https://cs.android.com/android/platform/superproject/main/+/main:system/extras/tools/check_elf_alignment.sh?hl=zh-cn

check_elf_alignment.sh APK_NAME.apk

线上可能会遇到的问题

https://github.com/facebook/react-native/issues/45054

Library 'libxxx.so' is not PAGE(16384)-aligned 
- will not be able to open it directly from apk.

适配

本文写的时候没有测试环境,只是用 check_elf_alignment.sh 验证有效,正式使用注意做好测试 :)

方法一

尝试按官方说明修改之后:

  • target_link_option 依赖cmake 3.13 为什么是这个版本?

  • android studio的下个版本是 cmake 3.18.1,如下修改:

android {
    externalNativeBuild {
        cmake {
            version "3.18.1"
            path "CMakeLists.txt"
        }
    }
}

修改之后有报错:

* What went wrong:
Execution failed for task ':tools:externalNativeBuildCleanDebug'.
> Invalid revision: 3.18.1-g262b901

看说明是gradle不兼容,说明在:https://developer.android.com/build/releases/gradle-plugin?hl=zh-cn#compatibility,gradle最低支持版本是8.9.

  • 升级到gradle 8.10
  • 升级后简单适配如下
# ...
target_link_options(${YS_TARGET_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
target_link_options(${YS_TARGET_NAME} PRIVATE "-Wl,-z,common-page-size=16384")
target_link_libraries(${YS_TARGET_NAME} ${log-lib})

-Wl,-z,max-page-size=16384

这个选项用于设置最大页面大小。链接器将对齐节和段,使其与指定的最大页面大小一致。在你指定的情况下,页面大小被设置为 16384 字节(16k)。

-Wl,-z,common-page-size=16384

这个选项用于设置普通节的页面大小。它影响数据段等常规节的对齐和布局,确保它们与指定的页面大小对齐。

方法二

注意到link_options是可以手动加的,参考 CMAKE_SHARED_LINKER_FLAGS

如果维持 cmake版本不改,可以是如下方法设置:

set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-z,max-page-size=16384")
cmake_minimum_required(VERSION 3.4.1)
# ...

这个修改要注意实际跑起来会不会崩,看官方文档还有一个警告(官方建议配置common-page-size=16384):

Note: Due to bugs in some lower versions of ld, 
you might also need to set common-page-size=16384. 
However, we strongly recommended that you 
update your tooling to avoid these bugs.

其他

  1. 如何在手机上开启16k page size:https://blog.csdn.net/yeshennet/article/details/149562205
  2. 16k page size常见库升级:https://blog.csdn.net/yeshennet/article/details/149562775
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值