Android性能分析之emmc坏块测试

本文介绍了如何在Android系统中编译并使用坏块测试工具badblocks,该工具用于检测emmc存储设备的坏块。首先,详细展示了Android.bp和Android.mk两种编译方式,并说明如何在特定平台的device.mk中添加语句将工具编译进系统。然后,阐述了badblocks的使用方法,包括参数选项和实际操作示例,如检查特定分区的坏块。最后,提供了一个脚本示例来批量检测所有分区。
摘要由CSDN通过智能技术生成

1.android 支持emmc 坏块测试工具
代码路径:
./external/e2fsprogs/misc/badblocks.c

Android.bp编译方式:./external/e2fsprogs/misc/Android.bp

//########################################################################
// Build badblocks

cc_binary {
    name: "badblocks",
    host_supported: true,
    defaults: ["e2fsprogs-defaults"],

    srcs: ["badblocks.c"],
    shared_libs: [
        "libext2fs",
        "libext2_com_err",
        "libext2_uuid",
        "libext2_blkid",
        "libext2_e2p",
    ],
    system_shared_libs: ["libc", "libdl"],
}

Android.mk编译方式:external/e2fsprogs/misc/Android.mk
#########################################################################

Build badblocks

include $(CLEAR_VARS)

badblocks_src_files := \
        badblocks.c

badblocks_c_includes := \
        external/e2fsprogs/lib

badblocks_cflags := -O2 -g -W -Wall \
        -DHAVE_UNISTD_H \
        -DHAVE_ERRNO_H \
        -DHAVE_NETINET_IN_H \
        -DHAVE_SYS_IOCTL_H \
        -DHAVE_SYS_MMAN_H \
        -DHAVE_SYS_MOUNT_H \
        -DHAVE_SYS_PRCTL_H \
        -DHAVE_SYS_RESOURCE_H \
        -DHAVE_SYS_SELECT_H \
        -DHAVE_SYS_STAT_H \
        -DHAVE_SYS_TYPES_H \
        -DHAVE_STDLIB_H \
        -DHAVE_STRCASECMP \
        -DHAVE_STRDUP \
        -DHAVE_MMAP \
        -DHAVE_UTIME_H \
        -DHAVE_GETPAGESIZE \
        -DHAVE_LSEEK64 \
        -DHAVE_LSEEK64_PROTOTYPE \
        -DHAVE_EXT2_IOCTLS \
        -DHAVE_LINUX_FD_H \
        -DHAVE_TYPE_SSIZE_T \
        -DHAVE_GETOPT_H \
        -DHAVE_SYS_TIME_H \
        -DHAVE_SYS_PARAM_H \
        -DHAVE_SYSCONF

badblocks_shared_libraries := \
        libext2fs \
        libext2_com_err \
        libext2_uuid \
        libext2_blkid \
        libext2_e2p

badblocks_system_shared_libraries := libc

include $(CLEAR_VARS)

LOCAL_STATIC_LIBRARIES := \
        $(badblocks_shared_libraries) \
        $(badblocks_system_shared_libraries)

LOCAL_SRC_FILES := $(badblocks_src_files)
LOCAL_C_INCLUDES := $(badblocks_c_includes)
LOCAL_CFLAGS := $(badblocks_cflags)
#LOCAL_SHARED_LIBRARIES := $(badblocks_shared_libraries)
#LOCAL_SYSTEM_SHARED_LIBRARIES := $(badblocks_system_shared_libraries)
LOCAL_MODULE := badblocks
LOCAL_MODULE_TAGS := optional

include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(badblocks_src_files)
LOCAL_C_INCLUDES := $(badblocks_c_includes)
LOCAL_CFLAGS := $(badblocks_cflags)
LOCAL_SHARED_LIBRARIES := $(addsuffix _host, $(badblocks_shared_libraries))
LOCAL_MODULE := badblocks_host
LOCAL_MODULE_STEM := badblocks
LOCAL_MODULE_TAGS := optional

但是编译的时候时没有将其编译到系统当中,要将其编译到系统中,我们可以在对应平台device.mk中加入如下语句,例如我用的时rk3326的sdk,对应的文件device/rockchip/rk3326/device-common.mk

PRODUCT_PACKAGES += badblocks

当然你也可以为了开始验证可以直接使用如下命令进行单独编译,前提是你之前已经全部编译通过了。

source ./build/envsetup.sh
lunch platform_name        ###(platform_name对应的sdk)
mmm external/e2fsprogs/misc/

编译完成便可以把out/target/product/platform_name/system/bin/badblocks通过adb push到板子的/system/bin/目录下。

2.使用方式:

badblocks [-svw][-b <分区块大小>][-o <输出文件>][磁盘装置][磁盘区块数][启始区块]

参数说明:
-b<分区块大小> 指定磁盘的区块大小,单位为字节。
-o<输出文件> 将检查的结果写入指定的输出文件。
-s 在检查时显示进度。
-v 执行时显示详细的信息。
-w 在检查时,执行写入测试。
[磁盘装置] 指定要检查的磁盘装置。
[磁盘区块数] 指定磁盘装置的区块总数。
[启始区块] 指定要从哪个区块开始检查。

(1)首先查看板子各个分区对应的block

rk3326_mid:/ # ls -al /dev/block/platform/ff390000.dwmmc/by-name/
total 0
drwxr-xr-x 2 root root 440 2021-05-20 10:49 .
drwxr-xr-x 3 root root 540 2021-05-20 10:49 ..
lrwxrwxrwx 1 root root  20 2021-05-20 10:49 backup -> /dev/block/mmcblk1p9
lrwxrwxrwx 1 root root  20 2021-05-20 10:49 boot -> /dev/block/mmcblk1p7
lrwxrwxrwx 1 root root  21 2021-05-20 10:49 cache -> /dev/block/mmcblk1p11
lrwxrwxrwx 1 root root  20 2021-05-20 10:49 dtb -> /dev/block/mmcblk1p4
lrwxrwxrwx 1 root root  20 2021-05-20 10:49 dtbo -> /dev/block/mmcblk1p5
lrwxrwxrwx 1 root root  21 2021-05-20 10:49 frp -> /dev/block/mmcblk1p16
lrwxrwxrwx 1 root root  21 2021-05-20 10:49 ipmacro -> /dev/block/mmcblk1p17
lrwxrwxrwx 1 root root  21 2021-05-20 10:49 metadata -> /dev/block/mmcblk1p13
lrwxrwxrwx 1 root root  20 2021-05-20 10:49 misc -> /dev/block/mmcblk1p3
lrwxrwxrwx 1 root root  21 2021-05-20 10:49 oem -> /dev/block/mmcblk1p15
lrwxrwxrwx 1 root root  20 2021-05-20 10:49 recovery -> /dev/block/mmcblk1p8
lrwxrwxrwx 1 root root  21 2021-05-20 10:49 security -> /dev/block/mmcblk1p10
lrwxrwxrwx 1 root root  21 2021-05-20 10:49 system -> /dev/block/mmcblk1p12
lrwxrwxrwx 1 root root  20 2021-05-20 10:49 trust -> /dev/block/mmcblk1p2
lrwxrwxrwx 1 root root  21 2021-05-20 10:49 ttspack -> /dev/block/mmcblk1p18
lrwxrwxrwx 1 root root  20 2021-05-20 10:49 uboot -> /dev/block/mmcblk1p1
lrwxrwxrwx 1 root root  21 2021-05-20 10:49 ubuntu -> /dev/block/mmcblk1p19
lrwxrwxrwx 1 root root  21 2021-05-20 10:49 userdata -> /dev/block/mmcblk1p20
lrwxrwxrwx 1 root root  20 2021-05-20 10:49 vbmeta -> /dev/block/mmcblk1p6
lrwxrwxrwx 1 root root  21 2021-05-20 10:49 vendor -> /dev/block/mmcblk1p14

(2)检查uboot分区是否有坏块

rk3326_mid:/ # badblocks -sv /dev/block/mmcblk1p1
Checking blocks 0 to 4095
Checking for bad blocks (read-only test): done
Pass completed, 0 bad blocks found. (0/0/0 errors)

如上是没有坏块的情况,假如有坏块的化,如出现如下字眼

Pass completed, xxx bad blocks found (xxx表示坏块的数目,0一般是没有,表示良好)

最后可以通过脚本来进行全部分区的检测

BREAK_WAIT_TIMES=20
wait_times=1
until [ $wait_times -gt $BREAK_WAIT_TIMES ]
do
    echo -e "\n"
    echo "badblocks -sv /dev/block/mmcblk1p$wait_times begin."
    badblocks -sv /dev/block/mmcblk1p$wait_times
    echo "badblocks -sv /dev/block/mmcblk1p$wait_times end."
    echo -e "\n"
    let wait_times++
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值