# OHOSDevNote
**Repository Path**: xmwvv/ohosdev-note
## Basic Information
- **Project Name**: OHOSDevNote
- **Description**: 记录 OpenHarmony 设备开发技巧
- **Primary Language**: Unknown
- **License**: Unlicense
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 1
- **Created**: 2024-07-08
- **Last Updated**: 2025-11-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
本仓库用于记录 OpenHarmony 设备端开发的一些技巧,以及一些常见问题的解决方案。
无特殊说明,都是基于 OpenHarmony 4.1 版本标准系统。
## 加速 linux 内核链接
> 内核使用 clang 编译的环境下, 通过移除一些内核优化配置,可以加速内核链接, 预计减少 1 分钟以上的链接时间!
移除 defconfig 中的以下选项
``` conf
CONFIG_LTO
CONFIG_LTO_CLANG
CONFIG_LTO_CLANG_THIN
CONFIG_CFI_CLANG_SHADOW
CONFIG_DEBUG_INFO
CONFIG_DEBUG_INFO_BTF
CONFIG_CFI_CLANG
```
> 移除配置后,重新编译内核,需要删除以下目录 ( 以 hihope rk3568 为例 )再运行产品编译脚本:out/kernel/vendor, out/rk3568/obj/drivers
**如果编译时出错,再次删除以上两个目录** 并重新编译
## 系统参数查看, 修改
``` text
param get
param set
```
## hilog 开机日志设置
修改 /system/etc/param/hilog.para
``` text
hilog.private.on=true
hilog.debug.on=true
persist.sys.hilog.kmsg.on=true
persist.sys.hilog.debug.on=true
hilog.flowctrl.proc.on=false
hilog.flowctrl.domain.on=false
hilog.loggable.global=I
hilog.buffersize.global=16777216
```
## vscode clangd 配置
> 通过配置 vscode 的 clangd 插件,可以实现 C++ 代码补全、跳转等功能。需要预先安装 clangd 插件、compdb 工具
以 hihope rk3568 为例,在 openharmony 根目录下创建工程为例
- 生成编译数据库 compile_commands.json
命令格式 (在 openharmony 根目录下执行):
./prebuilts/build-tools/linux-x86/bin/ninja -w dupbuild=warn -C <*产品构建路径*> **-t compdb cxx c** > <*产品构建路径*>/compile_commands.json
``` shell
./prebuilts/build-tools/linux-x86/bin/ninja -w dupbuild=warn -C ./out/rk3568 -t compdb cxx c > out/rk3568/compile_commands.json
```
> 有新增加源文件、修改 BUILD.gn 时,需要重新生成编译数据库
- vscode 工程 clangd 配置
修改工程配置, 指定 clangd 路径, 设置产品构建路径
``` json
{
"clangd.path": "${workspaceFolder}/prebuilts/clang/ohos/linux-x86_64/llvm/bin/clangd",
"clangd.arguments": [
"--compile-commands-dir=${workspaceFolder}/out/rk3568",
]
}
```
> clangd 一定要采用 ohos sdk 的版本, 否则会出错
- 内核创建 compile_commands.json:
先编译一遍内核再运行 ./scripts/clang-tools/gen_compile_commands.py
>内核需要用 clang 编译, 用 gcc 会出错
## 系统启动脚本修改
rk3568 平台可修改 device/board/hihope/rk3568/cfg/init.rk3568.cfg. 设备上的路径为 /vendor/etc/init.rk3568.cfg
## 添加 shell 登录脚本
实现 shell 登录时执行脚本,主要用于添加环境变量,别名等
- 添加 /.mkshrc, 系统根目录处于 system 分区 ( system.img )
参考 .mkshrc :
``` shell
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
alias ......='cd ../../../../..'
alias ls='ls --color=tty'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias lsa='ls -lah'
alias loader='reboot loader'
alias hd='busybox hd'
alias vi='busybox vi'
export PS1=$'\x1b[32m'ohos@$hardware':'$'\x1b[1;36m'\$PWD$'\x1b'[0m➜$'\n'#' '
```
> 可修改 third_party/mksh/main.c 中 MKSHRC_PATH 为 /system/etc/.mkshrc, 将产品的 .mkshrc 文件添加到系统中编译
## 快速编译模块
通过直接调用 ninja 来编译可以节省不少时间
以 foundation/window/window_manager/dmserver:libdms , 产品为 rk3568 为例:
``` shell
prebuilts/build-tools/linux-x86/bin/ninja -w dupbuild=warn -C out/rk3568 foundation/window/window_manager/dmserver:libdms
```
可以通过 [env.sh 脚本](script/env.sh) 里的 build_module 来更方便地编译模块, 同上面的例子,可以这样调用:
- 将 env.sh 放到 openharmony 根目录下
- 在 openharmony 根目录执行 env.sh 脚本 ( 先前需要编译过, 或用 hb set 设置了 product )
```
source env.sh
```
之后就可以调用 env.sh 里的 build_module 函数来编译模块了
- 进入 foundation/window/window_manager/dmserver 目录
- 运行编译脚本
``` shell
build_module libdms
```
- 编译完成后,可以看到提示信息查看到输出的文件 ( 源代码有发生改变时 ) window/window_manager/libdms.z.so
- 运行发送脚本,可以将编译好的文件发送到设备上 ( 如果有生成 so 文件, 会看到输出的路径是 window/window_manager/libdms.z.so, 在设备上查找对应路径是 /system/lib/libdms.z.so )
``` shell
send window/window_manager/libdms.z.so /system/lib
```
> 对应分区需要预先设置成可写
## hdc usb 共享远程调试
用于设备没网络时,通过 usb 连接到主机,再通过主机转发端口给远程主机使用
#### 终端运行以下命令, 打开 tcp 模式
``` shell
hdcd -t
```
hdcd 默认打开 36199 端口, 可通过修改 persist.hdc.port 参数修改端口号
#### 主机通过以下命令转发端口
``` shell
hdc fport tcp:36199 tcp:36199
```
#### 主机通过以下命令提供端口给远程主机使用
``` shell
socat TCP-LISTEN:1888,fork TCP:localhost:36199
```
这样远程主机就可以通过 1888 端口访问主机的 36199 端口了
( hdc 只监听 localhost 上的端口, 所以需要通过 socat 转发端口 )
#### 远程主机通过以下命令连接到主机
(以主机 IP 地址 192.168.1.12 为例 )
``` shell
hdc tconn 192.168.1.12:1888
```
## 安装文件、文件夹到系统镜像
### 编写安装脚本
以 dayu200 为例,device/board/hihope/rk3568/BUILD.gn:
``` gn
# 当前目录 etc/.mkshrc 安装到 /system/etc
ohos_prebuilt_etc("my_mkshrc") {
source = "etc/.mkshrc"
part_name = "rockchip_products"
install_enable = true
}
# 将当前目录 tools 安装到 /system/bin/tools
ohos_prebuilt_executable("my_tools") {
source = "tools"
part_name = "rockchip_products"
install_enable = true
}
group("rk3568_group") {
deps = [
":my_mkshrc",
":my_tools",
...
]
...
}
```
### 为 tools 设置权限
修改 build/ohos/images/mkimage/dac.txt, 添加以下配置
``` text
system/bin/tools/*, 00755, 0, 2000, 0
```