Android 新增一个自定义分区

本文详细介绍了在Android系统中新增一个名为xxx的自定义分区的实现过程,包括配置分区大小、文件系统类型、挂载点,修改dts、init解析rc文件路径,增加包扫描路径,修改PATH环境变量,以及处理Androidlibrary路径等步骤。同时,文章讨论了如何在编译系统中自动添加custom_images目标,并给出了相应的Makefile修改建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在某个项目中,有一个需求,需要新增一个xxx分区,这个分区类似于vendor/oem分区,名字为指定的。此处有点好奇,为什么不直接使用oem分区,而是另外弄一个分区名出来。

功能实现点
在root目录下新增分区的挂载目录,将自定义分区的内容生成一个img。
配置方案,将需要拷进自动以分区的模块、文件等配置好。
在dts中加入xxx分区的支持。
增加init解析rc的路径,支持xxx/etc/init下的rc文件。
修改PackageManagerService,启动时包扫描增加xxx/app下的apk支持。
修改PATH环境变量,使xxx/bin在PATH环境路径下。
修改Android library路径,使JNI能找到xxx/lib中的so。
修改烧写分区,使xxx.img刷入到flash中。
Android custom images
        AndroidP提供了build_custom_images的task,Makefile的路径如下:

android/build/make/core/tasks/build_custom_images.mk
android/build/make/core/tasks/tools/build_custom_image.mk
        第一个Makefile定义了custom_images这个目标,已经声明了一些需要设置的参数:

custom_image_parameter_variables := \
  CUSTOM_IMAGE_MOUNT_POINT \
  CUSTOM_IMAGE_PARTITION_SIZE \
  CUSTOM_IMAGE_FILE_SYSTEM_TYPE \
  CUSTOM_IMAGE_DICT_FILE \
  CUSTOM_IMAGE_MODULES \
  CUSTOM_IMAGE_COPY_FILES \
  CUSTOM_IMAGE_SELINUX \
  CUSTOM_IMAGE_SUPPORT_VERITY \
  CUSTOM_IMAGE_SUPPORT_VERITY_FEC \
  CUSTOM_IMAGE_VERITY_BLOCK_DEVICE \
  CUSTOM_IMAGE_AVB_HASH_ENABLE \
  CUSTOM_IMAGE_AVB_ADD_HASH_FOOTER_ARGS \
  CUSTOM_IMAGE_AVB_HASHTREE_ENABLE \
  CUSTOM_IMAGE_AVB_ADD_HASHTREE_FOOTER_ARGS \
  CUSTOM_IMAGE_AVB_KEY_PATH \
  CUSTOM_IMAGE_AVB_ALGORITHM \
        这些变量的含义在代码的上方有注释,其中PRODUCT_CUSTOM_IMAGE_MAKEFILES这个变量是自定义的分区image的mk文件,image(分区)的名字就是mk的名字。然后调用第二个Makefile文件去编译生成img。

        在这里,原生的Makefile中没找到自动添加custom_images这个目标的方式,只能通过`make custom_images`的方式去生成。为了在make的时候自动生成custom_images,可做以下修改:

diff --git a/core/tasks/build_custom_images.mk b/core/tasks/build_custom_images.mk
index c9b07da57..93c06ab1d 100644
--- a/core/tasks/build_custom_images.mk
+++ b/core/tasks/build_custom_images.mk
@@ -50,7 +50,10 @@
 #
 # To build all those images, run "make custom_images".
 
-ifneq ($(filter $(MAKECMDGOALS),custom_images),)
+# ifneq ($(filter $(MAKECMDGOALS),custom_images),)
+ifneq ($(PRODUCT_CUSTOM_IMAGE_MAKEFILES),)
+
+$(DEFAULT_GOAL): custom_images
        在$(DEFAULT_GOAL)中添加custom_images这个目标,在core/tasks/build_custom_images.mk中修改判断条件,当PRODUCT_CUSTOM_IMAGE_MAKEFILES变量非空时即生成custom_images这个目标。

        core/tasks/tools/build_custom_image.mk中的my_staging_dir是指定生成custom_images中间文件目录的地方,默认是方案out目录下obj/PACKAGING/xxxx_intermediates/xxx下,我改到方案out目录下的xxx目录下。

custom_image mk配置
        在BoardConfig.mk中增加PRODUCT_CUSTOM_IMAGE_MAKEFILES的配置,如下:

PRODUCT_CUSTOM_IMAGE_MAKEFILES += device/xxx/xxx/xxx.mk
BOARD_ROOT_EXTRA_FOLDERS += xxx
        BOARD_ROOT_EXTRA_FOLDERS变量的值是指在root目录下创建一个目录,这个主要是为xxx分区提供好挂载点。

        然后就是我们需要根据自己的需求写xxx.mk,这里xxx就是我们的分区名:

CUSTOM_IMAGE_MOUNT_POINT := xxx
CUSTOM_IMAGE_PARTITION_SIZE := 11111111111
CUSTOM_IMAGE_FILE_SYSTEM_TYPE := ext4
CUSTOM_IMAGE_SELINUX := true         # 支持编译时指定好selinux权限
 
 
CUSTOM_IMAGE_MODULES += \
    aaaaa \
    bbbbb
 
CUSTOM_IMAGE_COPY_FILES += \
    aaaaaaaa/aaaaaaa.rc:etc/init/init.iptv.rc 
         这些配置变量可参考注释。注意,如果我们的分区是有一些服务的,那么此时最好配置好selinux,CUSTOM_IMAGE_SELINUX设置为true,然后在BoardConfig.mk中BOARD_SEPOLICY_DIRS加入自己的selinux配置,在file_contexts中将整个分区的所有内容默认设置为oemfs(方便使用,oemfs是已定义的selinux规则):

/xxx(/.*)?                     u:object_r:oemfs:s0
分区的挂载
        AndroidP比较特殊,使用了system as root,因此如果自定义分区中有一些rc文件,那么此时就需要在first state挂载上,如果没有rc文件, 无需在init解析rc前挂载,则只需在fstab上挂载即可。

        first state挂载是需要将分区信息写入到dts中,如下:

    firmware {
        android {
            fstab {
                compatible = "android,fstab";
                name = "fstab";
                vendor {
                    compatible = "android,vendor";
                    dev = "/dev/block/by-name/vendor";
                    fsmgr_flags = "wait,recoveryonly";
                    mnt_flags = "ro,barrier=1";
                    name = "vendor";
                    status = "ok";
                    type = "ext4";
                };
                xxx {
                    compatible = "android,xxx";
                    dev = "/dev/block/by-name/XXX";
                    fsmgr_flags = "wait,recoveryonly";
                    mnt_flags = "ro,barrier=1";
                    name = "xxx";
                    status = "ok";
                    type = "ext4";
                };
            };
        };
    };
增加rc文件扫描路径
        如果自定义分区中有需要增加的rc文件,可修改init的代码,如下:

diff --git a/init/init.cpp b/init/init.cpp
index e51a09301..69eb5c28c 100644
--- a/init/init.cpp
+++ b/init/init.cpp
@@ -125,6 +125,9 @@ static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_
         if (!parser.ParseConfig("/vendor/etc/init")) {
             late_import_paths.emplace_back("/vendor/etc/init");
         }
+        if (!parser.ParseConfig("/xxx/etc/init")) {
+            late_import_paths.emplace_back("/xxx/etc/init");
+        }
     } else {
         parser.ParseConfig(bootscript);
     }
增加包扫描路径
        如果自定义分区中有放入预装的app,则可修改PackageManagerService的源码,增加包扫描的路径:

diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index cf35d0a6d3c..f20873576ee 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2660,6 +2660,15 @@ public class PackageManagerService extends IPackageManager.Stub
                     | SCAN_AS_SYSTEM,
                     0);
 
+            // Collect ordinary ctc packages.
+            final File ctcAppDir = new File("/xxx", "app");
+            scanDirTracedLI(ctcAppDir,
+                    mDefParseFlags
+                    | PackageParser.PARSE_IS_SYSTEM_DIR,
+                    scanFlags
+                    | SCAN_AS_SYSTEM,
+                    0);
+
             // Collect privileged vendor packages.
             File privilegedVendorAppDir = new File(Environment.getVendorDirectory(), "priv-app");
             try {
        在这里,由于我自定义分区的app需要具有与system同等的权限,因此参数与扫描system下的APP一样。

新增PATH路径
        如果自定义分区中有一些可执行文件可被其他人执行,可将该路径添加到PATH变量下:

diff --git a/libc/include/paths.h b/libc/include/paths.h
index 922d1ceeb..e5fbcc99c 100644
--- a/libc/include/paths.h
+++ b/libc/include/paths.h
@@ -38,7 +38,7 @@
 #define        _PATH_BSHELL    "/system/bin/sh"
 #endif
 #define        _PATH_CONSOLE   "/dev/console"
-#define        _PATH_DEFPATH   "/sbin:/system/sbin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin"
+#define        _PATH_DEFPATH   "/sbin:/system/sbin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin:/xxx/bin"
 #define        _PATH_DEV       "/dev/"
 #define        _PATH_DEVNULL   "/dev/null"
 #define        _PATH_KLOG      "/proc/kmsg"
       这个宏在init启动的时候使用到了。

       或者在rc文件中使用export的方式修改:

on init
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin:/xxx/bin
        ext4的分区,在打包成img时,部分文件目录的权限会被修改,如bin这种需要可执行的权限,还需修改打包时权限的设置:

diff --git a/libcutils/fs_config.cpp b/libcutils/fs_config.cpp
index 5b79b1d7d..8f3fe41dc 100644
--- a/libcutils/fs_config.cpp
+++ b/libcutils/fs_config.cpp
@@ -203,6 +203,7 @@ static const struct fs_path_config android_files[] = {
     { 00755, AID_ROOT,      AID_ROOT,      0, "system/lib64/valgrind/*" },
     { 00755, AID_ROOT,      AID_SHELL,     0, "system/xbin/*" },
     { 00755, AID_ROOT,      AID_SHELL,     0, "vendor/bin/*" },
+    { 00755, AID_ROOT,      AID_SHELL,     0, "ctc/bin/*" },
     { 00755, AID_ROOT,      AID_SHELL,     0, "vendor/xbin/*" },
     { 00644, AID_ROOT,      AID_ROOT,      0, 0 },
     // clang-format on
新增Android libraries路径
        如果自定义分区支持App,则还需考虑apk加载jni库的路径。Android的jni库加载的路径,是在android/bionic/linker/linker.cpp中加载的,同时还会去读取ld.config.txt中的配置,具体的过程可以去分析linker.cpp中的源码。

        因此我们需要做以下的修改:

        android/bionic仓库下:

diff --git a/linker/linker.cpp b/linker/linker.cpp
index c78b9aba6..750ab39a3 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -96,6 +96,7 @@ static const char* const kLdConfigVndkLiteFilePath = "/system/etc/ld.config.vndk
 static const char* const kSystemLibDir     = "/system/lib64";
 static const char* const kOdmLibDir        = "/odm/lib64";
 static const char* const kVendorLibDir     = "/vendor/lib64";
+static const char* const kCtcLibDir        = "/ctc/lib64";
 static const char* const kAsanSystemLibDir = "/data/asan/system/lib64";
 static const char* const kAsanOdmLibDir    = "/data/asan/odm/lib64";
 static const char* const kAsanVendorLibDir = "/data/asan/vendor/lib64";
@@ -103,6 +104,7 @@ static const char* const kAsanVendorLibDir = "/data/asan/vendor/lib64";
 static const char* const kSystemLibDir     = "/system/lib";
 static const char* const kOdmLibDir        = "/odm/lib";
 static const char* const kVendorLibDir     = "/vendor/lib";
+static const char* const kCtcLibDir        = "/ctc/lib";
 static const char* const kAsanSystemLibDir = "/data/asan/system/lib";
 static const char* const kAsanOdmLibDir    = "/data/asan/odm/lib";
 static const char* const kAsanVendorLibDir = "/data/asan/vendor/lib";
@@ -114,6 +116,7 @@ static const char* const kDefaultLdPaths[] = {
   kSystemLibDir,
   kOdmLibDir,
   kVendorLibDir,
+  kCtcLibDir,
   nullptr
 };
        android/system/core仓库下:

diff --git a/rootdir/etc/ld.config.txt b/rootdir/etc/ld.config.txt
index 42dc7abe7..936757b08 100644
--- a/rootdir/etc/ld.config.txt
+++ b/rootdir/etc/ld.config.txt
@@ -39,6 +39,7 @@ additional.namespaces = sphal,vndk,rs
 namespace.default.isolated = true
 
 namespace.default.search.paths  = /system/${LIB}
+namespace.default.search.paths += /ctc/${LIB}
 namespace.default.search.paths += /%PRODUCT%/${LIB}
        库的路径已经增加上,还有prebuilt的jni库需要拷贝到自定义分区下的模块目录下,修改build下的Makefile:

diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk
index ce917590b..6638b1d5b 100644
--- a/core/dex_preopt_odex_install.mk
+++ b/core/dex_preopt_odex_install.mk
@@ -369,7 +369,7 @@ ifneq (true,$(my_generate_dm))
   $(my_all_targets): $(installed_odex) $(installed_vdex) $(installed_art)
 else
   ALL_MODULES.$(my_register_name).INSTALLED += $(my_installed_dm)
-  ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(my_built_dm) $(my_installed_dm)
+  ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(my_built_dm):$(my_installed_dm)
 
   # Make sure to install the .dm when you run "make <module_name>"
   $(my_all_targets): $(installed_dm)
diff --git a/core/install_jni_libs_internal.mk b/core/install_jni_libs_internal.mk
index a99d88ad7..5b1bbaf6b 100644
--- a/core/install_jni_libs_internal.mk
+++ b/core/install_jni_libs_internal.mk
@@ -95,7 +95,8 @@ my_jni_shared_libraries += $(my_prebuilt_jni_libs)
 else # not my_embed_jni
 # Install my_prebuilt_jni_libs as separate files.
 $(foreach lib, $(my_prebuilt_jni_libs), \
-    $(eval $(call copy-one-file, $(lib), $(my_app_lib_path)/$(notdir $(lib)))))
+    $(eval $(call copy-one-file, $(lib), $(my_app_lib_path)/$(notdir $(lib))))\
+       $(eval ALL_MODULES.$(my_register_name).PREBUILT_INSTALLED += $(lib):$(my_app_lib_path)/$(notdir $(lib))))
 
 $(LOCAL_INSTALLED_MODULE) : $(addprefix $(my_app_lib_path)/, $(notdir $(my_prebuilt_jni_libs)))
 endif  # my_embed_jni
diff --git a/core/tasks/tools/build_custom_image.mk b/core/tasks/tools/build_custom_image.mk
index a1151e908..49033b74f 100644
--- a/core/tasks/tools/build_custom_image.mk
+++ b/core/tasks/tools/build_custom_image.mk
@@ -26,7 +26,7 @@ my_custom_image_name := $(basename $(notdir $(my_custom_imag_makefile)))
 
 intermediates := $(call intermediates-dir-for,PACKAGING,$(my_custom_image_name))
 my_built_custom_image := $(intermediates)/$(my_custom_image_name).img
-my_staging_dir := $(intermediates)/$(CUSTOM_IMAGE_MOUNT_POINT)
+my_staging_dir := $(PRODUCT_OUT)/$(CUSTOM_IMAGE_MOUNT_POINT)
 
 # Collect CUSTOM_IMAGE_MODULES's installd files and their PICKUP_FILES.
 my_built_modules :=
@@ -38,6 +38,8 @@ $(foreach m,$(CUSTOM_IMAGE_MODULES),\
     $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).PICKUP_FILES)))\
   $(eval _built_files := $(strip $(ALL_MODULES.$(m).BUILT_INSTALLED)\
     $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).BUILT_INSTALLED)))\
+  $(eval _prebuilt_files := $(strip $(ALL_MODULES.$(m).PREBUILT_INSTALLED)\
+    $(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).PREBUILT_INSTALLED)))\
   $(if $(_pickup_files)$(_built_files),,\
     $(warning Unknown installed file for module '$(m)'))\
   $(eval my_pickup_files += $(_pickup_files))\
@@ -52,6 +54,17 @@ $(foreach m,$(CUSTOM_IMAGE_MODULES),\
       $(eval my_copy_dest := $(wordlist 2,999,$(my_copy_dest)))\
       $(eval my_copy_dest := $(subst $(space),/,$(my_copy_dest)))\
       $(eval my_copy_pairs += $(bui):$(my_staging_dir)/$(my_copy_dest)))\
+  )\
+  $(foreach i, $(_prebuilt_files),\
+    $(eval prebui_ins := $(subst :,$(space),$(i)))\
+    $(eval ins := $(word 2,$(prebui_ins)))\
+    $(if $(filter $(TARGET_OUT_ROOT)/%,$(ins)),\
+      $(eval prebui := $(word 1,$(prebui_ins)))\
+      $(eval my_copy_dest := $(patsubst $(PRODUCT_OUT)/%,%,$(ins)))\
+      $(eval my_copy_dest := $(subst /,$(space),$(my_copy_dest)))\
+      $(eval my_copy_dest := $(wordlist 2,999,$(my_copy_dest)))\
+      $(eval my_copy_dest := $(subst $(space),/,$(my_copy_dest)))\
+      $(eval my_copy_pairs += $(prebui):$(my_staging_dir)/$(my_copy_dest)))\
   ))
刷写分区
        各个厂商的实现不一样,这里不展开。

总结
        经过上面的修改后,一个自定义的分区基本可以完成我们需要的功能,后续有遇到问题再进行修正。
————————————————
版权声明:本文为CSDN博主「chongyuzhao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zcyxiaxi/article/details/119113593

<think>嗯,用户问的是在Android分区表新建一个需要img的分区。这个问题看起来是关于Android系统底层分区的操作,可能用户在进行刷机、定制ROM或者添加新硬件支持时需要这个步骤。首先,我需要回顾一下Android分区结构,常见的分区比如boot、system、vendor、data等,每个分区都有对应的img文件。用户可能想添加一个自定义分区,比如用来存放特定的数据或驱动。 接下来,用户提到了“需要img的分区”,也就是说这个新分区需要有一个对应的镜像文件。这时候我需要考虑如何修改分区表,通常Android设备使用GPT分区表,所以可能需要使用工具如gdisk或者fastboot来操作。不过,直接修改分区表有风险,可能会导致设备无法启动,所以用户需要谨慎操作,并且可能需要解锁bootloader。 然后,步骤大概包括:确定分区大小、名称、类型,修改分区表,生成对应的img文件,刷入分区,并在系统中验证。需要注意的是,不同的设备可能有不同的分区布局,比如AB分区系统,或者动态分区管理,这在Android 10之后引入的动态分区可能会影响分区的创建方式。 另外,用户可能需要更新设备的vbmeta分区,以验证新分区的完整性,否则可能会导致启动失败。还有,生成img文件可能需要使用make_ext4fs或者其他工具,具体取决于文件系统类型。 用户可能的实际应用场景是,比如添加一个用于存储日志的分区,或者为某个硬件模块预留空间。也有可能是为了系统优化,将某些数据独立出来。需要提醒用户备份重要数据,因为操作分区表有变砖的风险。 此外,用户可能没有提到的是,是否需要在代码层面进行修改,比如内核配置或者fstab文件,以确保系统能够识别和挂载新分区。这部分可能需要进一步的指导,比如修改device tree或者内核的defconfig文件。 可能还需要考虑分区的权限和挂载点,确保在系统启动时正确挂载,并且应用有权限访问。如果用户只是创建分区但没有正确配置,可能会导致分区无法使用。 总结来说,回答需要分步骤说明如何创建新分区,包括工具使用、注意事项,以及后续的验证步骤。同时要强调风险,提醒用户谨慎操作,并参考具体设备的文档,因为不同厂商的分区管理可能有差异。</think>--- 在 Android 设备的分区表新建一个需要 `.img` 镜像文件的分区,通常涉及 **修改分区表布局** 和 **生成/刷入镜像文件** 两个核心步骤。以下是具体操作流程和注意事项: --- ### **一、准备工作** 1. **设备要求**: - 解锁 Bootloader(操作分区表通常需要解锁)。 - 获取 Root 权限(或通过 Fastboot 操作)。 - 备份当前分区表(防止操作失误导致设备变砖)。 2. **工具**: - `gdisk`(Linux/Android 下修改 GPT 分区表的工具)。 - `fastboot`(刷写镜像和分区表)。 - `mkfs`(生成文件系统镜像,如 `make_ext4fs`)。 - 设备厂商提供的分区表工具(如高通 `ptool`)。 --- ### **二、操作步骤** #### **1. 确定新分区的参数** - **名称**:自定义分区名(如 `custom`)。 - **大小**:根据需求计算(如 512MB)。 - **类型 GUID**:指定分区类型(例如 `Linux filesystem` 的 GUID 为 `0FC63DAF-8483-4772-8E79-3D69D8477DE4`)。 - **起始/结束扇区**:确保不与其他分区重叠。 #### **2. 修改分区表** 通过 `gdisk` 修改 GPT 分区表: ```bash # 进入交互模式 gdisk /dev/block/sda (具体设备节点需确认) # 查看当前分区表:输入 p # 添加新分区:输入 n # 输入起始扇区、结束扇区(或直接输入大小如 +512M) # 设置分区类型:输入 t → 选择分区号 → 输入 GUID 或类型代码 # 保存并退出:输入 w ``` #### **3. 生成新分区的镜像文件** 生成空镜像文件(以 ext4 为例): ```bash # 创建空镜像文件 dd if=/dev/zero of=custom.img bs=1M count=512 # 格式化为 ext4 文件系统 mkfs.ext4 custom.img ``` 或使用 Android 专用工具生成镜像: ```bash # 生成 ext4 镜像(需 make_ext4fs) make_ext4fs -l 512M -a custom custom.img /path/to/data ``` #### **4. 刷入镜像到新分区** 通过 `fastboot` 刷入镜像(假设新分区名为 `custom`): ```bash fastboot flash custom custom.img ``` #### **5. 更新分区表** 刷入修改后的分区表(**高风险操作**): ```bash fastboot flash partition gpt_modified.img ``` --- ### **三、验证新分区** 1. **检查分区挂载**: ```bash adb shell ls -l /dev/block/by-name/custom adb shell mount | grep custom ``` 2. **读写测试**: ```bash adb shell "echo 'test' > /path/to/custom/test.txt" adb shell cat /path/to/custom/test.txt ``` --- ### **四、关键注意事项** 1. **分区表兼容性**: - 部分设备使用 **动态分区**(Android 10+),需通过 `lpmake` 生成 `super.img`,而非直接修改 GPT。 - 动态分区设备需修改 `dynamic_partitions_info.txt` 并重新打包 `super.img`。 2. **安全验证**: - 修改分区表后可能触发 **vbmeta** 验证失败,需重新签名镜像或禁用验证: ```bash fastboot --disable-verity --disable-verification flash vbmeta vbmeta.img ``` 3. **备份与恢复**: - 备份原分区表: ```bash adb shell dd if=/dev/block/sda of=gpt_backup.img bs=512 count=34 ``` - 若设备无法启动,可通过 `fastboot` 恢复原分区表。 --- ### **五、示例:动态分区设备添加新分区** 若设备使用动态分区(如 Pixel 系列),需通过 `lpdump` 和 `lpmake` 操作: ```bash # 1. 导出当前 super 分区信息 adb shell lpdump > dynamic_partitions_info.txt # 2. 修改 dynamic_partitions_info.txt,添加新分区定义 # 例如添加: group group_name { name = "custom" size = "512M" } # 3. 重新生成 super.img lpmake --metadata-size 65536 --super-name super --groups="group_name" \ --partition=custom:readonly:512:group_name --output super.img # 4. 刷入 super.img fastboot flash super super.img ``` --- ### **六、适用场景** - **自定义数据存储**:独立存储日志、配置或用户数据。 - **硬件扩展**:为新增硬件(如协处理器)预留专用分区。 - **系统优化**:分离高频读写数据(如缓存)到独立分区。 --- ### **七、风险提示** - **设备变砖**:错误修改分区表可能导致无法启动。 - **数据丢失**:操作前务必备份重要数据。 - **保修失效**:解锁 Bootloader 可能使厂商保修失效。 建议优先通过 **虚拟分区**(如 `/data/custom`)或 **OverlayFS** 实现需求,避免直接操作物理分区表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值