前提 : 内核为 16kB 的 arm64 目标才支持 16kB 页面 , 查看设备架构是否包含为arm64
adb shell getprop ro.product.cpu.abi
1.切换开关配置步骤
1.确保设备已将变量设置为页面通用(以便同时使用 4 KB 和 16 KB 页面大小内核)。建议您直接安装 16k 内核,以确保设备直接在 16 KB 模式下运行,然后再继续添加开发者选项。
查看项目配置: device/google/cuttlefish/vsoc_arm64_pgagnostic/phone/aosp_cf.mk
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
2.设置产品变量以在“设置”中显示开发者选项 PRODUCT_16K_DEVELOPER_OPTION := true
ifeq ($(PRODUCT_16K_DEVELOPER_OPTION),true)
ADDITIONAL_PRODUCT_PROPERTIES += ro.product.build.16k_page.enabled=true
else
ADDITIONAL_PRODUCT_PROPERTIES += ro.product.build.16k_page.enabled=false
endif
搜索PRODUCT_16K_DEVELOPER_OPTION得到 ./device/google/cuttlefish/vsoc_arm64_pgagnostic/phone/aosp_cf.mk:68:PRODUCT_16K_DEVELOPER_OPTION := true ./device/google/cuttlefish/vsoc_arm64/phone/aosp_cf.mk:59:PRODUCT_16K_DEVELOPER_OPTION := true
3.使用 BOARD_KERNEL_PATH_16K 设置内核路径。应使用 CONFIG_ARM64_16K_PAGES=y. 构建此内核 BOARD_KERNEL_PATH_16K := kernel/prebuilts/mainline/$(TARGET_KERNEL_ARCH)/16k/kernel-mainline.
搜索BOARD_KERNEL_PATH_16K得到: ./device/google/cuttlefish/shared/BoardConfig.mk:60:BOARD_KERNEL_PATH_16K := kernel/prebuilts/mainline/$(TARGET_KERNEL_ARCH)/16k/kernel-mainline
4.设置模块配置路径 BOARD_KERNEL_MODULES_16K。它指向支持 16KB 的内核模块。设置这些参数会在系统分区上创建两个 OTA:boot_ota_16k.zip(用于切换到 16 KB 内核)和 boot_ota_4k.zip(用于切换到 4 KB 内核)。为较小尺寸启动 OTA 设置 BOARD_16K_OTA_USE_INCREMENTAL := true,以启用增量 OTA。
BOARD_KERNEL_MODULES_16K += (TARGET_KERNEL_ARCH)/16k/*.ko) BOARD_KERNEL_MODULES_16K += $(wildcard kernel/prebuilts/common-modules/virtual-device/mainline/
搜索BOARD_KERNEL_MODULES_16K,同样在./device/google/cuttlefish/shared/BoardConfig.mk
成功完成此设置后
- 用户选中“以 16KB 页面大小启动设备”后,“设置”应用中会显示 16 KB 切换开关。
/system/boot_otas或/vendor/boot_otas包含两个 OTA ZIP 文件:boot_ota_16k.zip和boot_ota_4k.zip
2.查看开关
在设置>开发者选项>oem解锁下,key为 Enable16kPages /packages/apps/Settings/src/com/android/settings/development/Enable16kPagesPreferenceController.java
其中宏控显示/隐藏开关 packages/apps/Settings/src/com/android/settings/development/Enable16kUtils.java static final String DEV_OPTION_PROPERTY = "ro.product.build.16k_page.enabled";
3.打开16 KB 页前提:
OEM 解锁 && /data 和 /metadata 分区必须为 ext4 ,如果不是则弹出对话框要求用户擦除设备数据 但是设置中的判断方法其实没有/metadata 分区必须为 ext4
然后才能打开16,
验证页数:4096 或 16384 adb shell getconf PAGE_SIZE
代码判断当前Data是否为Ext4方法:
public static boolean isDataExt4() {
try (BufferedReader br = new BufferedReader(new FileReader("/proc/mounts"))) {
String line;
while ((line = br.readLine()) != null) {
Log.i(TAG, line);
final String[] fields = line.split(" ");
final String partition = fields[1];
final String fsType = fields[2];
if (partition.equals("/data") && fsType.equals("ext4")) {
return true;
}
}
} catch (IOException e) {
Log.e(TAG, "Failed to read /proc/mounts");
}
return false;
}
参考链接:
https://source.android.google.cn/docs/core/architecture/16kb-page-size/16kb?hl=zh-cn