Android开机流程中涉及的调试与记录
新建分区并挂载
1、创建分区将要挂载的目录
这里可以选择多种方式去创建目录,如在根目录下创建,根目录下的dev、proc、data等均在此处创建,我们仿照添加想要添加的temp目录即可
# Put it here instead of in init.rc module definition,
# because init.rc is conditionally included.
#
# create some directories (some are mount points) and symlinks
LOCAL_POST_INSTALL_CMD := mkdir -p $(addprefix $(TARGET_ROOT_OUT)/, \
dev proc sys system data data_mirror odm oem acct config storage mnt apex debug_ramdisk temp\
linkerconfig second_stage_resources postinstall $(BOARD_ROOT_EXTRA_FOLDERS)); \
ln -sf /system/bin $(TARGET_ROOT_OUT)/bin; \
ln -sf /system/etc $(TARGET_ROOT_OUT)/etc; \
ln -sf /data/user_de/0/com.android.shell/files/bugreports $(TARGET_ROOT_OUT)/bugreports; \
ln -sfn /sys/kernel/debug $(TARGET_ROOT_OUT)/d; \
ln -sf /storage/self/primary $(TARGET_ROOT_OUT)/sdcard
ifdef BOARD_USES_VENDORIMAGE
LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/vendor
else
LOCAL_POST_INSTALL_CMD += ; ln -sf /system/vendor $(TARGET_ROOT_OUT)/vendor
endif
ifdef BOARD_USES_PRODUCTIMAGE
LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/product
else
LOCAL_POST_INSTALL_CMD += ; ln -sf /system/product $(TARGET_ROOT_OUT)/product
endif
ifdef BOARD_USES_SYSTEM_EXTIMAGE
LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/system_ext
else
LOCAL_POST_INSTALL_CMD += ; ln -sf /system/system_ext $(TARGET_ROOT_OUT)/system_ext
endif
ifdef BOARD_USES_METADATA_PARTITION
LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/metadata
endif
在device目录下的AndroidBoard.mk下创建目录。
@mkdir -p $(PRODUCT_OUT)/root/mnt/vendor/temp
自定义模块的Android.mk中创建目录。
include $(CLEAR_VARS)
LOCAL_MODULE := temp
LOCAL_TAGS := optional
LOCAL_CLASS := EXECUTABLES
LOCAL_MODULE_TARGET_ARCHS := x86_64
LOCAL_POST_INSTALL_CMD := $(hide) \
mkdir -p $(TARGET_OUT_VENDOR)/temp
...
include $(BUILD_PREBUILT)
在init.rc中创建目录。
2、挂载分区
挂载的方式也可在不同的阶段进行,如下,添加的分区在/dev/block/下,将其挂载到创建的目录下,该文件是fstab文件,一般在device目录下。
system /system erofs ro wait,logical,first_stage_mount,slotselect
/dev/block/platform/soc@0/1d84000.ufs/by-name/userdata /data f2fs nodev,noatime,nosuid,inlinecrypt,reserve_root=32768 latemount,wait,formattable,fileencryption=aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized,keydirectory=/metadata/vold/metadata_encryption,quota,check,fscompress,checkpoint=fs
/dev/block/platform/soc@0/1d84000.ufs/by-name/userdata /data ext4 discard,noatime,noauto_da_alloc,data=ordered,user_xattr,barrier=1,inlinecrypt latemount,wait,formattable,fileencryption=aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized,keydirectory=/metadata/vold/metadata_encryption,quota
/dev/block/platform/soc@0/1d84000.ufs/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard wait,formattable,first_stage_mount,check
/dev/block/platform/soc@0/1d84000.ufs/by-name/misc /misc emmc defaults defaults
/devices/platform/soc@0/8804000.mmc/mmc_host/mmc* auto auto defaults voldmanaged=sdcard1:auto
vendor /vendor erofs ro wait,logical,first_stage_mount,slotselect
system_ext /system_ext erofs ro wait,logical,first_stage_mount,slotselect
product /product erofs ro wait,logical,first_stage_mount,slotselect
system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect
vendor_dlkm /vendor_dlkm erofs ro wait,logical,first_stage_mount,slotselect
/dev/block/zram0 none swap defaults zramsize=75%
/dev/block/by-name/temp /mnt/vendor/temp ext4 noatime,nosuid,nodev, defaults
也可以在init.rc中on post-fs中通过mount 命令挂载。
mount tmpfs tmpfs /temp nodev noexec nosuid mode=0775,gid=1000
3、配置分区表
到这里是不是有点奇怪,那我的/dev/block/by-name/temp这个块设备哪里来的,是怎么创建的。这里就涉及到分区表的创建,不同厂商,配置分区表的方式不同,高通需要配置partition.xml,intel需要在device目录下的gpt.ini文件配置,不同厂商的配置不同,这里不做分析。
;---------------------------------------------------------------------------------------------------
; 说明: 脚本中的字符串区分大小写,用户可以修改"="后面的数值,但是不要修改前面的字符串
;---------------------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------------------
; 固件下载参数配置
;---------------------------------------------------------------------------------------------------
;***************************************************************************************************
; mbr的大小, 以Kbyte为单位
;***************************************************************************************************
[mbr]
size = 16384
;***************************************************************************************************
; 分区配置
;
;
; partition 定义范例:
; [partition] ; //表示是一个分区
; name = USERFS2 ; //分区名称
; size = 16384 ; //分区大小 单位: 扇区.分区表示个数最多2^31 * 512 = 2T
; downloadfile = "123.fex" ; //下载文件的路径和名称,可以使用相对路径,相对是指相对于image.cfg文件所在分区。也可以使用绝对路径
; keydata = 1 ; //私有数据分区,重新量产数据将不丢失
; encrypt = 1 ; //采用加密方式烧录,将提供数据加密,但损失烧录速度
; user_type = ? ; //私有用法
; verify = 1 ; //要求量产完成后校验是否正确
;
; 注:1、name唯一, 不允许同名
; 2、name最大12个字符
; 3、size = 0, 将创建一个无大小的空分区
; 4、为了安全和效率考虑,分区大小最好保证为16M字节的整数倍
;***************************************************************************************************
[partition_start]
;------------------------------>mmcblk0p2/nand0p2
[partition]
name = bootloader
size = 65536
downloadfile = "boot-resource.fex"
user_type = 0x8000
;------------------------------>mmcblk0p3/nand0p3
[partition]
name = env
size = 32768
downloadfile = "env.fex"
user_type = 0x8000
;------------------------------>mmcblk0p4/nand0p4
[partition]
name = boot
size = 65536
downloadfile = "boot.fex"
user_type = 0x8000
;------------------------------>mmcblk0p5/nand0p5
[partition]
name = system
size = 2868192
downloadfile = "system.fex"
user_type = 0x8000
;------------------------------>mmcblk0p6/nand0p6
[partition]
name = vendor
size = 491520
downloadfile = "vendor.fex"
user_type = 0x8000
;------------------------------>mmcblk0p7/nand0p7
[partition]
name = misc
size = 32768
user_type = 0x8000
;------------------------------>mmcblk0p8/nand0p8
[partition]
name = recovery
size = 65536
downloadfile = "recovery.fex"
user_type = 0x8000
;------------------------------>mmcblk0p9/nand0p9
[partition]
name = cache
size = 1048576
user_type = 0x8000
;------------------------------>store encryptable
;------------------------------>mmcblk0p10/nand0p10
[partition]
name = metadata
size = 32768
user_type = 0x8000
;------------------------------>data image private
;------------------------------>mmcblk0p11/nand0p11
[partition]
name = private
size = 32768
ro = 0
user_type = 0x8000
;------------------------------>frp
;------------------------------>mmcblk0p12/nand0p12
[partition]
name = frp
size = 1024
ro = 0
user_type = 0x8000
keydata = 0x8000
;------------------------------>empty
;------------------------------>mmcblk0p13/nand0p13
[partition]
name = empty
size = 31744
ro = 0
user_type = 0x8000
;------------------------------>device tree overlay
;------------------------------>mmcblk0p14/nand0p14
[partition]
name = dto
size = 32768
user_type = 0x8000
;------------------------------>media_data
;------------------------------>mmcblk0p15/nand0p15
[partition]
name = media_data
size = 32768
user_type = 0x8000
;add by tuliyuan for new block device
;------------------------------>mmcblk0p16/nand0p16
[partition]
name = vtechfs -->块设备名称
downloadfile = "vtechfs.fex" -->块设备对应的img
size = 65536 -->块设备大小
user_type = 0x8000 -->块设备类型
;------------------------------>UDISK
;------------------------------>mmcblk0p1/nand0p1
[partition]
name = UDISK
user_type = 0x8100
4、配置selinux权限
这里主要配置file_contexts,也可以在init.rc中启动阶段修改chown,或者在uevent.rc中配置权限。