AndroidQ(10.0) MTK平台添加新分区

657 阅读4分钟

65 平台增加一个新分区,用于保存特殊数据,修改文件列表如下

	modified:   build/make/core/Makefile
	modified:   build/make/core/config.mk
	modified:   build/make/core/envsetup.mk
	modified:   build/make/core/main.mk
	modified:   build/make/tools/releasetools/build_image.py
	modified:   device/mediatek/build/build/tools/ptgen/MT6765/partition_table_MT6765_emmc.csv
	modified:   device/mediatek/build/build/tools/ptgen/MT6765/ptgen.pl
	modified:   device/mediatek/sepolicy/bsp/non_plat/device.te
	modified:   device/mediatek/sepolicy/bsp/non_plat/file.te
	modified:   device/mediatek/sepolicy/bsp/non_plat/file_contexts
	modified:   device/mediatek/sepolicy/bsp/non_plat/fsck.te
	modified:   device/mediatek/sepolicy/bsp/non_plat/init.te
	modified:   device/mediatek/sepolicy/bsp/non_plat/system_app.te
	modified:   device/mediateksample/k62v1_64_bsp/BoardConfig.mk
	modified:   device/mediateksample/k62v1_64_bsp/init.project.rc
	modified:   system/core/rootdir/Android.mk
	modified:   system/sepolicy/prebuilts/api/29.0/public/app.te
	modified:   system/sepolicy/prebuilts/api/29.0/public/domain.te
	modified:   system/sepolicy/public/app.te
	modified:   system/sepolicy/public/domain.te
	modified:   vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765
	

1、分区表中添加分区参数(配置分区文件格式、大小、对应img名称等)

配置表格式后缀为.csv,通过在 device 目录下搜索,找到目标平台文件夹下的配置表

device/mediatek/build/build/tools/ptgen/MT6765/partition_table_MT6765_emmc.csv

yOqFR1.png

2、增加 klogo.img 对应编译代码

build/make/core/Makefile

$(if $(BOARD_KLOGOIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "klogo_fs_type=$(BOARD_KLOGOIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
$(if $(BOARD_KLOGOIMAGE_PARTITION_SIZE),$(hide) echo "klogo_size=$(BOARD_KLOGOIMAGE_PARTITION_SIZE)" >> $(1))
$(if $(INTERNAL_USERIMAGES_EXT_VARIANT),$(hide) echo "fs_type=$(INTERNAL_USERIMAGES_EXT_VARIANT)" >> $(1))

编译规则

# -----------------------------------------------------------------
# klogo partition image
# ifdef BUILDING_KLOGO_IMAGE
ifdef BOARD_KLOGOIMAGE_FILE_SYSTEM_TYPE
INTERNAL_KLOGOIMAGE_FILES := \
    $(filter $(TARGET_OUT_KLOGO)/%,$(ALL_DEFAULT_INSTALLED_MODULES))

klogoimage_intermediates := \
    $(call intermediates-dir-for,PACKAGING,klogo)
BUILT_KLOGOIMAGE_TARGET := $(PRODUCT_OUT)/klogo.img

define build-klogoimage-target
  $(call pretty,"Target klogo fs image: $(INSTALLED_KLOGOIMAGE_TARGET)")
  @mkdir -p $(TARGET_OUT_KLOGO)
  @mkdir -p $(klogoimage_intermediates) && rm -rf $(klogoimage_intermediates)/klogo_image_info.txt
  $(call generate-image-prop-dictionary, $(klogoimage_intermediates)/klogo_image_info.txt,cache,skip_fsck=true)
  $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
      build/make/tools/releasetools/build_image.py \
      $(TARGET_OUT_KLOGO) $(klogoimage_intermediates)/klogo_image_info.txt $(INSTALLED_KLOGOIMAGE_TARGET) $(TARGET_OUT)
  $(hide) $(call assert-max-image-size,$(INSTALLED_KLOGOIMAGE_TARGET),$(BOARD_KLOGOIMAGE_PARTITION_SIZE))
endef

# We just build this directly to the install location.
INSTALLED_KLOGOIMAGE_TARGET := $(BUILT_KLOGOIMAGE_TARGET)
$(INSTALLED_KLOGOIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_KLOGOIMAGE_FILES) $(BUILD_IMAGE_SRCS)
	$(build-klogoimage-target)

.PHONY: klogoimage-nodeps
klogoimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
	$(build-klogoimage-target)

else # BOARD_KLOGOIMAGE_FILE_SYSTEM_TYPE
# we need to ignore the broken klogo link when doing the rsync
IGNORE_KLOGO_LINK := --exclude=klogo
endif # BOARD_KLOGOIMAGE_FILE_SYSTEM_TYPE

# -----------------------------------------------------------------

# -----------------------------------------------------------------
# odm partition image
ifdef BUILDING_ODM_IMAGE
$(BUILT_TARGET_FILES_PACKAGE): \
	    $(INSTALLED_RAMDISK_TARGET) \
	    $(INSTALLED_BOOTIMAGE_TARGET) \
	    $(MTK_BOOTIMAGE_TARGET) \
	    $(INSTALLED_RADIOIMAGE_TARGET) \
	    $(INSTALLED_RECOVERYIMAGE_TARGET) \
	    $(FULL_SYSTEMIMAGE_DEPS) \
	    $(INSTALLED_USERDATAIMAGE_TARGET) \
	    $(INSTALLED_CACHEIMAGE_TARGET) \
	    $(INSTALLED_VENDORIMAGE_TARGET) \
	    $(INSTALLED_PRODUCTIMAGE_TARGET) \
	    $(INSTALLED_PRODUCT_SERVICESIMAGE_TARGET) \
	    $(INSTALLED_VBMETAIMAGE_TARGET) \
	    $(INSTALLED_KLOGOIMAGE_TARGET) \
	    $(INSTALLED_ODMIMAGE_TARGET) \

build/make/core/config.mk

dont_bother_goals := out \
    snod systemimage-nodeps \
    stnod systemtarball-nodeps \
    userdataimage-nodeps userdatatarball-nodeps \
    cacheimage-nodeps \
    klogoimage-nodeps \
    bptimage-nodeps \


build/make/core/envsetup.mk

TARGET_OUT_CACHE := $(PRODUCT_OUT)/cache
TARGET_OUT_KLOGO := $(PRODUCT_OUT)/klogo
.KATI_READONLY := TARGET_OUT_CACHE

build/make/core/main.mk

.PHONY: cacheimage
cacheimage: $(INSTALLED_CACHEIMAGE_TARGET)

.PHONY: klogoimage
klogoimage: $(INSTALLED_KLOGOIMAGE_TARGET)

# Build files and then package it into the rom formats
.PHONY: droidcore
droidcore: $(filter $(HOST_OUT_ROOT)/%,$(modules_to_install)) \
    $(INSTALLED_SYSTEMIMAGE_TARGET) \
    $(INSTALLED_RAMDISK_TARGET) \
    $(MTK_BOOTIMAGE_TARGET) \
    $(INSTALLED_DEBUG_RAMDISK_TARGET) \
    $(INSTALLED_DEBUG_BOOTIMAGE_TARGET) \
    $(INSTALLED_RECOVERYIMAGE_TARGET) \
    $(INSTALLED_VBMETAIMAGE_TARGET) \
    $(INSTALLED_USERDATAIMAGE_TARGET) \
    $(INSTALLED_CACHEIMAGE_TARGET) \
    $(INSTALLED_KLOGOIMAGE_TARGET) \
    $(INSTALLED_BPTIMAGE_TARGET) \
    $(INSTALLED_VENDORIMAGE_TARGET) \
    $(INSTALLED_ODMIMAGE_TARGET) \

build/make/tools/releasetools/build_image.py

  elif mount_point == "cache":
    copy_prop("cache_fs_type", "fs_type")
    copy_prop("cache_size", "partition_size")
  elif mount_point == "klogo":
    copy_prop("klogo_fs_type", "fs_type")
    copy_prop("klogo_size", "partition_size")

	...

   elif image_filename == "cache.img":
      mount_point = "cache"
   elif image_filename == "klogo.img":
      mount_point = "klogo"

	

device/mediateksample/k62v1_64_bsp/BoardConfig.mk

BOARD_KLOGOIMAGE_FILE_SYSTEM_TYPE := ext4

system/core/rootdir/Android.mk

ifdef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
  LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/cache
else
  LOCAL_POST_INSTALL_CMD += ; ln -sf /data/cache $(TARGET_ROOT_OUT)/cache
endif
ifdef BOARD_KLOGOIMAGE_FILE_SYSTEM_TYPE
  LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/klogo
endif

3、修改 fstab 文件添加分区的挂载和系统启动时挂载权限

device/mediateksample/k62v1_64_bsp/init.project.rc

on post-fs-data

#/dev/ttyMT2 for Connectivity BT/FM/GPS usage
    chmod 777 /dev/ttyS0
    chmod 777 /dev/ttyS1
    chown system system /dev/ttyS0
    chown system system /dev/ttyS1

    chown system system /klogo
    chmod 0771 /klogo

vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765

DEVPATH(nvdata)     /mnt/vendor/nvdata      ext4   FS_FLAG_DISCARD  FSMGR_FLAG_FMT
DEVPATH(nvcfg)      /mnt/vendor/nvcfg       ext4   FS_FLAG_COMMIT   FSMGR_FLAG_FMT
 
DEVPATH(klogo)      /klogo                  ext4   FS_FLAG_DISCARD   FSMGR_FLAG_FMT

注意此处的类型设置为 FS_FLAG_DISCARD, 若为 FS_FLAG_COMMIT 卡在 logo 界面无法进入系统

抓取串口 log 如下

[   30.764913] <1>.(1)[365:init]init 14: [libfs_mgr]__mount(source=/dev/block/platform/bootdevice/by-name/klogo,target=/klogo,type=ext4)=-1: Invalid argument
[   30.767684] <3>.(3)[101:kworker/u16:1][name:pmic_auxadc&][name:pmic_auxadc&][CH3_DBG] bat_cur = -2018
[   30.767717] <3>.(1)[365:init]init 14: [libfs_mgr]Running /system/bin/e2fsck on /dev/block/mmcblk0p34
[   30.771264] <3>-(3)[101:kworker/u16:1]mt635x_auxadc_read_raw: 3 callbacks suppressed
[   30.771278] <3>.(3)[101:kworker/u16:1]mt635x-auxadc mt-pmic:mt635x-auxadc: name:BAT_TEMP, channel=3, adc_out=0xffe, adc_result=1799
[   30.774087] <3>.(3)[101:kworker/u16:1][name:mtk_battery&][name:mtk_battery&][force_get_tbat] ntc_disable_nafg -40 25
[   30.832233] <3>.(3)[101:kworker/u16:1][name:lockdep&]lockdep: [name:lockdep&][00000000e4bcd0cb] (&chrdet_lock) held by pmic_thread/106/[2] on CPU#5/IRQ[on] from [18.439032]
[   30.980652] <1>.(1)[365:init]EXT4-fs (mmcblk0p34): can't mount with commit=1, fs mounted w/o journal
[   30.982259] <1>.(1)[365:init]init 14: [libfs_mgr]__mount(source=/dev/block/platform/bootdevice/by-name/klogo,target=/klogo,type=ext4)=-1: Invalid argument
[   30.986183] <1>.(1)[365:init]init 14: [libfs_mgr]Failed to mount an un-encryptable or wiped partition on /dev/block/platform/bootdevice/by-name/klogo at /klogo options: noauto_da_alloc,commit=1,nodelalloc: Invalid argument
[   31.025039] <0>.(0)[103:kworker/u16:2]mt635x-auxadc mt-pmic:mt635x-auxadc: name:VPROC_TEMP, channel=4, adc_out=0x60f, adc_result=681
[   31.028433] <2>.(2)[101:kworker/u16:1]mt635x-auxadc mt-pmic:mt635x-auxadc: name:VCORE_TEMP, channel=4, adc_out=0x611, adc_result=682

4、添加挂载分区的selinux权限,否则系统启动无法挂载

device/mediatek/sepolicy/bsp/non_plat/device.te

#  add for klogo
type klogo_device, dev_type;
type klogo_block_device, dev_type;

device/mediatek/sepolicy/bsp/non_plat/file.te

#  add for klogo
type klogo_file, file_type, data_file_type;

device/mediatek/sepolicy/bsp/non_plat/file_contexts

 /dev/block/platform/bootdevice/by-name/sdrpmb u:object_r:tkcore_block_device:s0
 /(vendor|system\/vendor)/bin/hw/android\.hardware\.keymaster@4\.0-service.trustkernel u:object_r:hal_keymaster_default_exec:s0
 
+#  add for klogo
/dev/block/platform/bootdevice/by-name/klogo u:object_r:klogo_block_device:s0
/klogo(/.*)? u:object_r:klogo_file:s0

device/mediatek/sepolicy/bsp/non_plat/fsck.te

# add for klogo
allow fsck klogo_block_device:blk_file rw_file_perms;

device/mediatek/sepolicy/bsp/non_plat/init.te

# add for klogo
allow init klogo_block_device:blk_file relabelto;
allow init klogo_file:dir mounton;

device/mediatek/sepolicy/bsp/non_plat/system_app.te

# add for klogo
allow system_app klogo_file:file { getattr unlink open read write create };
allow system_app klogo_file:dir rw_dir_perms;

5、烧写工具加载指定 img 文件路径

device/mediatek/build/build/tools/ptgen/MT6765/ptgen.pl

#download files
    %download_files = (
                       preloader  => "preloader_$ArgList{PRELOADER_PROJECT}.bin",
                       srampreld => "sram_preloader_$ArgList{BASE_PROJECT}.bin",
                       mempreld  => "mem_preloader_$ArgList{BASE_PROJECT}.bin",
                       lk      => "lk.bin",
                       boot    => "boot.img",
                       recovery   => "recovery$recovery_download_file_suffix.img",
                       logo       => "logo.bin",
                       vendor    => "vendor.img",
                       system    => "system.img",
                       cache      => "cache.img",
                       klogo      => "klogo.img",
                       userdata    => "userdata.img",
                       custom     => "custom.img"
                      );


yOqfY9.png

6、selinux 修改后编译检测报错修改

system/sepolicy/public/app.te system/sepolicy/prebuilts/api/29.0/public/app.te

 # Block device access.
+#neverallow appdomain dev_type:blk_file { read write };

android9.0 MTK平台添加分区表

MT8127_Android_scatter.txt 文件添加backup分区