跳到主要内容

K1 OH5.0 系统调试说明

修订记录

修订版本修订日期修订说明
0012025-01-13初始版本
0022025-04-11添加MUSE Pi Pro

1. 调试工具和方法

1.1. 串口调试

可用,波特率 115200,直接使用即可,可以查看 ubootkernelOpenHarmony init 进程相关打印。

1.1.1. 调整串口打印等级

1.1.1.1. 仅本次启动有效

串口中执行如下命令即可:

echo 8 > /proc/sys/kernel/printk

1.1.1.2. 持续生效

主要通过修改 env_k1-x.txt 文件中的 loglevel 值来实现,有 2 种方式:

  1. 修改代码并编译固件,修改 device/board/spacemit/xxx/kernel/boot/bootfs/env_k1-x.txtloglevel 的值,重新编译固件并烧录即可

  2. 系统中直接修改,按照如下步骤进行:

    • 挂载内核
    # cd dev/block/
    # ls
    by-name loop5 mmcblk2p1 mmcblk2p3 mmcblk2p9 ram12 ram4
    loop0 loop6 mmcblk2p10 mmcblk2p4 platform ram13 ram5
    loop1 loop7 mmcblk2p11 mmcblk2p5 ram0 ram14 ram6
    loop2 mmcblk2 mmcblk2p12 mmcblk2p6 ram1 ram15 ram7
    loop3 mmcblk2boot0 mmcblk2p13 mmcblk2p7 ram10 ram2 ram8
    loop4 mmcblk2boot1 mmcblk2p2 mmcblk2p8 ram11 ram3 ram9
    #
    # mount mmcblk2p5 /tmp
    # cd /tmp
    # ls
    Image.itb bianbu.bmp env_k1-x.txt k1-x_ZT001H.dtb lost+found
    • 通过 hdc 拉出 env_k1-x.txt,修改后,再推入 /tmp 文件夹
    D:\>hdc file recv /tmp/env_k1-x.txt
    FileTransfer finish, Size:134 time:23ms rate:5.83kB/s

    D:\>hdc file send env_k1-x.txt /tmp/
    FileTransfer finish, Size:134, File count = 1, time:8ms rate:16.75kB/s
    • 取消挂载内核,重启即可生效
    # unmount /tmp
    # reboot

1.1.2. 串口连接方式

1.1.2.1. MUSE Paper

MUSE Paper 可以通过 TF 卡口来引出串口,需要单独购买配件,如下:

将 TF 卡槽拿出来,将上面配件插入即可,上面配件的金手指朝向桌面。

1.1.2.2. MUSE Pi & MUSE Card

MUSE Pi 和 MUSE Card 开发板上面有明显的串口连接标识 (GND/RX/TX),按线序连接即可。

1.1.2.3. MUSE Pi Pro

1.1.2.4. MUSE Book

1.2. hdc

hdc 类似 androidadb,支持 usbtcp 这 2 种连接模式,使用 tcp 模式,端口默认设置为 55555。配置文件为 device/board/spacemit/xxx/cfg的default.para,如下所示:

persist.hdc.mode=usb,tcp
persist.hdc.port=55555

1.2.1. 主机支持 hdc

1.2.1.1. windows 系统

windows 系统将 hdc.exe(点我下载)放在特定目录,并设置环境变量路径。

1.2.1.2. ubuntu 系统

  • 安装依赖项‌:打开终端,输入以下命令来更新软件包列表并安装必要的开发工具和库

    sudo apt-get update
    sudo apt-get install build-essential libstdc++6 libc++1·
  • 下载 HDC 工具包‌:前往 OpenHarmony 官网下载适用于 Linux 平台的最新版 HDC 工具压缩包。将其放置于合适位置后进行解压操作,请根据实际情况调整解压路径

    tar -zxvf hdc_std_<version>_linux.tar.gz -C /opt/hdc/
  • 设置环境变量‌:编辑用户的 shell 初始化脚本(如 .bashrc),添加以下行至文件末尾:

    export PATH=$PATH:/opt/hdc/bin
    source ~/.bashrc
  • 验证安装成功与否‌:在新的终端窗口里尝试运行简单的帮助指令以确认一切就绪,如果能够看到详细的帮助文档,则表明整个过程顺利完成

    hdc help

1.2.2. hdc 连接

1.2.2.1. 网络连接

需确保 hdc 的服务端和客户端在同一个局域网内,连接方式如下:

D:\>hdc tconn 10.0.90.142:55555
Connect OK

D:\>hdc shell
#

1.2.2.2. usb 连接

D:\>hdc list targets
0123456789ABCDEF

D:\>hdc shell
#

1.2.2.3. 多设备连接

通过 -t 参数指定设备即可,如下:

D:\>hdc list targets
0123456789ABCDEF
ABCDEF

D:\>hdc -t 0123456789ABCDEF shell
#

1.2.3. hdc 常用命令

命令用途
hdc list targets查看当前所有设备
hdc shell reboot重启
hdc uninstall com.example.myapp卸载hap包
hdc install -r xxx.hap重新安装hap包
hdc shell aa start -a EntryAbility -b com.example.myapp启动hap
hdc file recv /xxx D:/从小机copy文件到本地
hdc file send D:/xxx /data/发送本地文件到小机
hdc start -r重启服务端

1.2.4. 各设备的 hdc 连接口

1.2.4.1. MUSEPaper&MUSEPaper2

1.2.4.2. MUSEPi

1.2.4.3. MUSECard

1.2.4.4. MUSEBook

1.2.4.5. MUSEPiPro

1.3. hilog

1.3.1. 基本使用方法

hilog 类似于 android 的 logcat,基本使用方法如下:

hilog
hilog -r

1.3.2. 常用命令

命令用途示例
hilog -h获取帮助
hilog -t app|core|kmsg|init- 阻塞式实时查询模块日志
- 可以与其他参数同时使用
hilog -t core
hilog -t app|core|kmsg|init -x- 非阻塞式实时查询模块日志
- 可以与其他参数同时使用
hilog -t core -x
hilog -T <tag>- 模块内指定tag
- 可以与其他参数一起使用
hilog -T Launcher_Default
hilog -L D|I|W|E|F- 指定level查询
- D:debug, I:info, W:warning, E:error, F:fatal
hilog -L I
hilog -D <domain>
- 日志的服务域,用于指定输出日志所对应的业务领域
- 这是一个十六进制整数,范围从 0x0 到 0xFFFFF。
- 建议使用0xAAABB格式,AAA表示子系统,BB表示模块
- 指定domian查询
- 可以与其他参数一起使用
hilog -D 0x0
^- 排除hilog -t ^app -T ^BatteryThread

1.3.3. 日志落盘

日志落盘意思就是将日志保存到文件中,导出来进行查看。

命令用途
hilog -w start [-f "xxx"] [-l <length>] [-j <jobid>] [-m <algorithm>] [-n <number>]启动落盘任务
hilog -w query [-j <jobid>]查询落盘任务
hilog -w stop [-j <jobid>]停止落盘任务

示例如下:

# hilog -w query
#
#hilog -w start -f "hilog" -l 66k -j 222 -m zlib -n 2
Persist task [jobid:222] started successfully
#cd /data/log/hilog
# ls -al
total 100
drwxr-x--- 2 logd log 4096 1970-01-02 03:34 .
drwxrwx--- 6 system log 4096 1970-01-01 00:38 ..
-rw-r----- 1 logd system 65540 1970-01-02 03:34 .persisterInfo_222
-rw-r----- 1 logd system 132 1970-01-02 03:34 .persisterInfo_222.info
-rw-r----- 1 logd system 12239 1970-01-02 03:34 hilog.002.19700102-033431.gz
-rw-r----- 1 logd system 6883 1970-01-02 03:34 hilog.003.19700102-033431.gz
#
# hilog -w query -j 222 #指定jobid查询
222 core,app zlib /data/log/hilog/hilog 67584 2
#
# hilog -w query #查询全部落盘任务
222 core,app zlib /data/log/hilog/hilog 67584 2
#
# hilog -w stop -j 222
Persist task [jobid:222] stopped successfully
#
# ls -al
total 36
drwxr-x--- 2 logd log 4096 1970-01-02 03:35 .
drwxrwx--- 6 system log 4096 1970-01-01 00:38 ..
-rw-r----- 1 logd system 12239 1970-01-02 03:34 hilog.002.19700102-033431.gz
-rw-r----- 1 logd system 13000 1970-01-02 03:35 hilog.003.19700102-033431.gz

1.4. hidumper

hidumper 是 OpenHarmony 中为开发、测试人员,IDE 工具提供统一的系统信息获取工具,帮助使用者分析,定位问题。

命令用途
hidumper -h获取帮助
hidumper --cpuusage [pid]查看某个进程的cpu占用信息
hidumper --mem [pid]查看某个进程的内存占用情况
hidumper --cpufreq查看cpu的频率
hidumper --storage查看存储情况
hidumper --net查看网络情况

1.5. 参数管理

命令用途
param -h获取帮助
param ls -r查看所用系统参数
param ls -r persist.sys.hilog.debug.on查看系统参数
param get persist.sys.hilog.debug.on获取系统参数
param set persist.sys.hilog.debug.on true设置系统参数

1.6. 模拟按键

1.6.1. 鼠标操作

# uinput -?
Usage: uinput <option> <command> <arg>...
The option are:
-M --mouse
commands for mouse:
-m <dx> <dy> --move <dx> <dy> -move to relative position (dx,dy),
<dx1> <dy1> <dx2> <dy2> [smooth time] --trace -dx1 dy1 to dx2 dy2 smooth movement
-d <key> --down key -press down a button,
0 is the left button, 1 is the right,
2 is the middle
-u <key> --up <key> -release a button
-c <key> --click <key> -press the left button down,then raise
-b <dx1> <dy1> <id> [press time] [click interval time] --double click
[press time] the time range is more than 1ms but less than 300ms,
[click interval time] the time range is more than 1ms but less than 450ms,
Otherwise the operation result may produce error or invalid operation
-press the left button down,then raise
key value:0 - button left
key value:1 - button right
key value:2 - button middle
key value:3 - button side
key value:4 - button extra
key value:5 - button forward
key value:6 - button back
key value:7 - button task
-s <key> --scroll <key> -positive values are sliding backwards
-g <dx1> <dy1> <dx2> <dy2> [total time] --drag <dx1> <dy1> <dx2> <dy2> [total time],
dx1 dy1 to dx2 dy2 smooth drag
-i <time> --interval <time> -the program interval for the (time) milliseconds
negative values are sliding forwards

1.6.1.1. 命令示例

命令用途
uinput -M -m 50 50鼠标光标移动到(50,50)位置
Uinput -M -b 50 200 0 100 300鼠标在(50,200)左键双击,点击事件100ms,双击的间隔时间300ms

1.6.2. 键盘操作

# uinput -?
Usage: uinput <option> <command> <arg>...
The option are:
-K --keyboard
commands for keyboard:
-d <key> --down <key> -press down a key
-u <key> --up <key> -release a key
-l <key> [long press time] --long_press <key> [long press time] -press and hold the key
-i <time> --interval <time> -the program interval for the (time) milliseconds

1.6.2.1. 按键值

keykeycode
KEYCODE_HOME1
KEYCODE_BACK2
KEYCODE_VOLUME_UP16
KEYCODE_VOLUME_DOWN17
KEYCODE_POWER18
KEYCODE_VOLUME_MUTE22
KEYCODE_DPAD_UP2012
KEYCODE_DPAD_DOWN2013
KEYCODE_DPAD_LEFT2014
KEYCODE_DPAD_RIGHT2015
KEYCODE_DPAD_CENTER2016
KEYCODE_TAB2049

1.6.2.2. 命令示例

命令用途
uinput -K -d 1 -u 1按HOME键返回主界面
uinput -K -d 1 -u 1声音调大

1.6.3. 触屏操作

# uinput -?
Usage: uinput <option> <command> <arg>...
The option are:
-T --touch
commands for touch:
-d <dx1> <dy1> --down <dx1> <dy1> -press down a position dx1 dy1,
-u <dx1> <dy1> --up <dx1> <dy1> -release a position dx1 dy1,
-m <dx1> <dy1> <dx2> <dy2> [smooth time] --smooth movement
<dx1> <dy1> <dx2> <dy2> [smooth time] -smooth movement,
dx1 dy1 to dx2 dy2 smooth movement
-c <dx1> <dy1> [click interval] -touch screen click dx1 dy1

1.6.3.1. 命令提示

待完善

1.7. 服务管理

命令用途
service_control start pulseaudio启动pulseaudio服务
service_control stop pulseaudio停止pulseaudio服务

1.8. hiperf

https://device.harmonyos.com/cn/docs/documentation/guide/subsys-toolchain-hiperf-0000001186316470

1.9. bytrace

通过 hdc 来获取 trace 的方法如下:

  • 抓取 trace:
D:\>hdc shell
# param set const.security.developermode.state true
# param set persist.hdc.root 1
# echo > /sys/kernel/debug/tracing/trace
# echo 4096 > /sys/kernel/debug/tracing/saved_cmdlines_size
# bytrace -t 10 -b 4096 --overwrite ohos zimage zmedia zcamera zaudio ability distributeddatamgr graphic freq irq mdfs workq mmc idle notification sync pagecache ace app > /mnt/mynewtrace.ftrace
# echo > /sys/kernel/debug/tracing/trace
# exit
D:\>hdc file recv /mnt/mynewtrace.ftrace
查看trace:
https://ui.perfetto.dev(科学上网)

查看 trace:

1.10. bootchart

使用方法:

  • 抓数据
hdc shell begetctl bootchart enable
hdc shell reboot # 重启
...
重启完成后
...
hdc shell begetctl bootchart stop
hdc shell begetctl bootchart disable
进入到/data/service/el0/startup/init/文件夹下查看是否有如下文件:
header、proc_diskstats.log、proc_ps.log、proc_stat.log

在/data/service/el0/startup/init/目录下执行命令:tar -czf bootchart.tgz * # 打包
hdc file recv /data/service/el0/startup/init/bootchart.tgz ./ # 导出
  • 下载 bootchart.jar,点我下载
  • 数据转图片,执行如下命名,会生成 bootchart.png
java -jar bootchart.jar bootchart.tgz

如果执行该命令报错,如下,需要升级本机 java 版本

D:\>java -jar bootchart.jar bootchart.tgz
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/bootchart/Main has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
  • 生成的 bootchart.png 如下:

1.11. wpa_supplicant&wpa_cli

使用方法:
1. 开启再关闭wifi
2. cd /vendor/bin/
3. ./wpa_supplicant -B -i wlan0 -c /data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf
4. ps -ef | grep wpa查看wpa_supplicant是否起来
5. /wpa_cli -p /data/service/el1/public/wifi/sockets/wpa
6. > scan
7. > scan_results
8. > add_network,返回一个ID
9. > set_network ID ssid "WIFI名称"
10. > set_network ID psk "WIFI密码"
11. > enable_network ID

1.12. snapshot_display

param set const.security.developermode.state true
param set persist.hdc.root 1
snapshot_display -f /data/local/tmp/test1.jpeg

1.13. wukong

待完善

1.14. power-shell

power-shell setmode 602      #性能模式,关闭休眠
power-shell suspend #休眠
power-shell display -s xxx #设置亮度

1.15. 重新挂载 system/vendor 分区为可读写

system/vendor 分区默认挂载为只读(ro),当调试的时候需要使用 hdc file send 推文件的时候,需要将其重新挂载为可读写,如下:

mount -o remount,rw /vendor
mount -o remount,rw /

系统重启后失效,需要重新挂载

1.16. gdb 调试

待添加

1.17. 调频

1.17.1. CPU 频率

cd /sys/devices/system/cpu/cpufreq/policy0/

cat scaling_cur_freq
# 查看当前频率

cat scaling_available_frequencies
# 查看可用频率

echo userspace > scaling_governor
echo 1228800 > scaling_setspeed
# 调整频率

cat scaling_cur_freq
# 查看调整是否生效

1.17.2. DDR 调频

# 频率表:
# 2400M C
# 1600M A
# 1200M 8
# 800M 4
# 600M 2

devmem 0xd4282980 4
# 读取当前频率

devmem 0xd4282980 4 0xX
# 设置频率,0xX值要比频率表的值+1,相当于bit0写1
# 比如设置2400M,devmem 0xd4282980 32 0xD

1.17.3. EMMC 调频

待添加

2. 常用测试方法

2.1. monkey 测试

2.1.1. 环境配置(windows)

  1. 安装 Python(3.8 及以上版本)及相关库。
  2. 安装 hdc 设备链接工具并配置环境变量,保证 cmd 命令窗口中可以执行 hdc shell 或者 hdc_std shell 正确链接测试设备
  3. 下载 stablility_test_tool_v1.0 这个 python 测试工具包

2.1.2. 执行测试

D:\stablility_test_tool_v1.0>python.exe D:\stablility_test_tool_v1.0\monkey_test.py -d H1241200045 -p hdc -i 1000 -t 1000

参数说明:

  • -d:测试设备的 sn 序列号,可通过 hdc list targets 查询获取
  • -p:hdc 路径,有的是 hdc_std,根据配置的环境变量修改
  • -i:操作间隔时间,单位 ms, 建议间隔 500ms, 硬件配置低时,操作时间不能设置过短,否者系统压力过大
  • -t:测试时间长度,单位分钟

2.2. 循环 reboot

2.2.1. 环境配置(windows)

  1. 安装 Python(3.8 及以上版本)及相关库。
  2. 安装 hdc 设备链接工具并配置环境变量,保证 cmd 命令窗口中可以执行 hdc shell 或者 hdc_std shell 正确链接测试设备
  3. 下载 stablility_test_tool_v1.0 这个 python 测试工具包

2.2.2. 执行测试

D:\stablility_test_tool_v1.0>python.exe D:\stablility_test_tool_v1.0\reboot_test.py -d H1241200045 -p hdc -c 2000

参数说明:

  • -d:测试设备的 sn 序列号,可通过 hdc list targets 查询获取
  • -p:hdc 路径,有的是 hdc_std,根据配置的环境变量修改
  • -c:开关机次数,默认 600 次,间隔 80s, 最大等待设备重启时间 300s,若想修改两次测试间隔时间,可以修改 REBOOT_WAIT_TIME,但不能比设备开机时间短

2.3. 循环音乐播放

直接打开“音乐”即可,自动循环播放音乐。

2.4. 循环视频播放

下载视频老化专用测试 hap(在这里),通过 hdc 安装

hdc install 视频老化测试.hap

安装完成后,直接点击 Launcher 桌面上的图标运行即可,会自动循环播放。

2.5. GPU 老化测试(glmark)

使用方法:

执行下面3条命令可运行glmark老化:
power-shell setmode 602
cd /system/bin
./glmark2-es2 --run-forever --size 720x720

3. 常见问题调试手段

3.1. 外设

3.1.1. 屏幕背光无法调节

  • 通过查看和设置节点 sys/class/backlight/backlight/brightness 来确认驱动是否正常
  • 如果设置上述节点亮度无变化,说明驱动存在问题,需要查驱动,重点查看背光对应的 PWM 是否正常工作
  • 如果设置上述节点亮度有变化,说明是 OH 上层的问题,可以通过命令 power-shell display -s xxx(100>xxx>0)来查看亮度是否有变化

3.2. 系统

3.2.1. 替换内核

  • 挂载内核,可替换 Image.itbk1-x_ZT001H.dtbdtb 文件,不同方案的名称不一样)
# cd dev/block/
# ls
by-name loop5 mmcblk2p1 mmcblk2p3 mmcblk2p9 ram12 ram4
loop0 loop6 mmcblk2p10 mmcblk2p4 platform ram13 ram5
loop1 loop7 mmcblk2p11 mmcblk2p5 ram0 ram14 ram6
loop2 mmcblk2 mmcblk2p12 mmcblk2p6 ram1 ram15 ram7
loop3 mmcblk2boot0 mmcblk2p13 mmcblk2p7 ram10 ram2 ram8
loop4 mmcblk2boot1 mmcblk2p2 mmcblk2p8 ram11 ram3 ram9
#
# mount mmcblk2p5 /tmp
# cd /tmp
# ls
Image.itb bianbu.bmp env_k1-x.txt k1-x_ZT001H.dtb lost+found
  • 通过 hdc 将更新的内核或者 dtb 文件推入 /tmp 文件夹
D:\>hdc file send Image.itb /tmp/
D:\>hdc file send k1-x_ZT001H.dtb /tmp/
  • 取消挂载内核,重启即可生效
# unmount /tmp
# reboot

3.2.2. cppcrash

待添加

3.3. 休眠唤醒异常

3.3.1. 只关屏,无法深度休眠

  • 查看 vendor/spacemit/xxx/power_config/power_mode_config.xml 是否设置了禁止深度休眠,具体参考 K1 OH5.0系统定制说明电源管理定制 章节
  • 通过 power-shell dump -a 查看系统是否拿了禁止休眠的锁,如下:
  • 查看 hilog 和内核 log 是否有异常打印

3.3.2. 深度休眠失败

3.3.3. 深度休眠后唤醒失败