OpenHarmony测试指南
官方虽然有不少资料, 但是都很分散, 我整理一下关于rk3568的测试资料, 方便大家参考.
系统编译
参照搭建开发环境 准备好Ubuntu环境和windows的vscode环境, 完成remote-ssh连接.
准备好源码, 参考创建OpenHarmony工程章节, 自动获取源码, 或者导入自己存在的源码.
可以从此处获取源码
对于rk3568设备, 参考编译RK3568开发板源码章节的1,2,3的内容. 准备好后, 参考HiHope_DAYU200/开发环境搭建编译指南, 安装需要的组件, 如下:
1
2
3
4
5sudo apt-get install binutils git git-lfs gnupg flex
bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib
libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache
libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8
python3-pip ruby libtinfo-dev libtinfo5如果安装有问题, 可以考虑使用aptitude来解决.
最后可以执行
./build.sh --product-name rk3568 --target-cpu arm64 --ccache
编译64位系统.
rk3568系统烧录
参考 烧录指导文档
按照如图所示连接电源线, 串口线, usb线
下载驱动工具
需要下载的文件: DriverAssitant_v5.1.1.zip, RKDevTool.exe, config.ini, Language 目录.
一定要保留Language目录, 否则工具会出现点一下就崩溃或者一直static的状况.
解压DriverAssitant_v5.1.1.zip后, 运行
DriverAssitant\DriverInstall.exe
, 点击驱动安装
.打开
RKDevTool.exe
烧写工具, 查看设备状态.如果开着机, 默认是如下状态:
按住下图所示两个键
烧录工具会提示没发现设备.
然后松开reset键, 显示”发现一个loader设备”. 然后松开剩下的按键. 等待3秒.
使用烧录工具烧录
vscode烧录时, 传输文件会比scp命令慢, 我们可以手动烧录.
将ubuntu目录源码的out/rk3568/packages/phone/images/
目录下的所有文件拷贝到本地, 然后在RKDevTool.exe
工具的栏目里右键选择load config
, 加载目录里的config.cfg
文件, 并修改好每个文件的路径. 点击执行
烧录.
使用vscode工具烧录
确保机器连接成功
在DevEco Device Tool中,选择REMOTE DEVELOPMENT > Local PC,查看远程计算机(Ubuntu开发环境)与本地计算机(Windows开发环境)的连接状态。
- 如果Local PC右边连接按钮为则远程计算机与本地计算机为已连接状态,不需要执行其他操作。
- 如果Local PC右边连接按钮为则点击绿色按钮进行连接。连接时DevEco Device Tool会重启服务,因此请不要在下载源码或源码编译过程中进行连接,否则会中断任务
在vs code中点击upload选项即可烧录.
vscode会先拷贝文件到本地, 拷贝完成后, 会提示按键开始烧录
创建应用调试
启动它, 一步步继续就行, 然后会强制安装
Harmony SDK
, 继续创建OpenHarmony 应用
接着会提示你安装
OpenHarmony SDK
, 安装即可项目就创建完成了, 如果设备连接正常, 此处会有显示
选择
File->Project Structure
, 按下图所示先择自动签名.
完成后就可以在下图位置开始调试和测试运行了
参考: DevEco Studio 搭建
设置应用权限
应用一般有3个等级:
APL级别 | 说明 |
---|---|
system_core等级 | 该等级的应用服务提供操作系统核心能力。 |
system_basic等级 | 该等级的应用服务提供系统基础服务。 |
normal等级 | 普通应用。 |
可以查看此处的权限列表来确认模块所需的权限. (华为的人老是乱改链接, 如果失效了, 就搜索)
如果我们需要一个高一点的权限, 比如说 system_basic, 那么就需要额外的操作设置一下. 下面示例设置ohos.permission.DISTRIBUTED_SOFTBUS_CENTER 权限
创建一个空的Openharmony项目, 在项目的
entry/src/main
下, 找到module.json5
文件在文件的 module 的大括号内添加如下权限请求:
1
2
3
4
5
6
7
8
9
10
11
12{
"module": {
xxx: [
...
],
"requestPermissions": [// 新增此项
{
"name": "ohos.permission.DISTRIBUTED_SOFTBUS_CENTER"// 需要的权限
}
]
}
}更多设置参考
找到 UnsgnedReleasedProfileTemplate.json 文件, 默认在
C:\Users\vv\AppData\Local\OpenHarmony\Sdk\9\toolchains\lib\UnsgnedReleasedProfileTemplate.json
, 修改其中的内容:1
2"apl":"system_basic",// 根据权限列表的内容, DISTRIBUTED_SOFTBUS_CENTER 需要 system_basic权限
"app-feature":"hos_system_app" // 系统基础服务app更多设置参考
然后找到默认的签名证书,
C:\Users\vv\.ohos\config\openharmony
, 把目录下以auto_ohos_default_你的项目名称...
开头的文件都删除. 同时清理项目的build-profile.json5
的signingConfigs的内容为"signingConfigs":[],
在DevEco里,
File -> Project Structure->Project->Signing Configs
里设置自动签名.最后编译好就可以直接安装测试了.
测试用例的生成
使用DevEco生成测试用例
这里需要感谢k0shl(@KeyZ3r0)大佬的帮助, 找到了ipc的直接调用方法:
文件xxx.ets
里:
以下是4.x版本
1 | import rpc from '@ohos.rpc' |
上述示例实现了一个 ipc 消息发送操作.
截止 2023/1/31, Openharmony的sdk里,
MessageParcel
接口不支持writeCString. 如果需要写入字符串, 可以考虑用writeInt
替代, 因为写入字符串也是4字节对齐的, 而CString的方式相当于写Int.
5.x版本
1 | import { Want, common } from '@kit.AbilityKit'; |
使用原始测试组件生成测试用例
OpenHarmony自带google test, 如果要测试, 也可以通过修改自带的测试用例来实现我们的需求.
在
OpenHarmony/foundation/communication/dsoftbus/tests/BUILD.gn
添加新的测试用例1
2
3
4
5
6features += [
"sdk/discovery/unittest:DiscSdkTest",// 这个默认就有
"sdk/transmission/trans_channel:TransSdkTest",
"adapter/unittest:AdapterTest",
"sdk/bus_center/unittest:BusCenterSdkTest",// 如果我添加这个, 后面生成的命令就需要换成 ./build.sh --product-name rk3568 --build-target BusCenterSdkTest
]测试用例所在目录的
build.gn
的解读:1
2
3
4
5
6
7
8
9
10
11
12bus_center_sdk_test_src = [ "bus_center_sdk_test.cpp" ]// 源码文件之一
...
ohos_unittest("BusCenterSdkTest") {// 添加用例的名称
module_out_path = module_output_path
sources = bus_center_sdk_test_src// 涉及到的源码文件
include_dirs = bus_center_sdk_test_inc
include_dirs += [
"unittest/common/",
"//utils/native/base/include",
]
...
}使用
./build.sh --product-name rk3568 --build-target DiscSdkTest --target-cpu arm64 --ccache
生成测试用例生成位置
OpenHarmony/out/rk3568/tests/unittest/dsoftbus/discovery/DiscSdkTest
(此版本是stripped的版本, 但是有函数名称, 如果没有, 说明IDA版本过低)为了方便调试, 可以在
OpenHarmony/out/rk3568/exe.unstripped/tests/unittest/dsoftbus/discovery/DiscSdkTest
位置找到not stripped
的版本.
调试器调试
64位系统的调试
在gdb-static下载gdbserver, 然后在ubuntu编译一个支持aarch64的gdb.
1 | $ apt-get install python-dev |
在机器上操作连接wifi网络, 使用gdbserver启动程序
1 | $ ./gdbserver-8.3.1-aarch64-le 192.168.1.4:1234 ./BusCenterSdkTest |
在Ubuntu使用编译的gdb连接程序:
1 | $ ./aarch64-linux-gnu-gdb |
为了方便调试, 可以使用文末的gdb脚本.
32位系统的调试(不建议, 可以忽略此节)
尝试过使用编译的gdb调试(参考编译gdb), 但是rk3568的32位版本的内核实现有点问题, 会在某些syscall调用中失败. 因此建议使用lldb调试. OpenHarmony SDK会带lldb调试器, C:\Users\xx\AppData\Local\OpenHarmony\Sdk\9\native\llvm\lib\clang\12.0.1\bin\arm-linux-ohos\lldb-server
(它也有64位的)
获取
hdc_std
工具, 可以网上下载, 安装了SDK也会自带C:\Users\vv\AppData\Local\OpenHarmony\Sdk\9\toolchains\hdc_std.exe
.传递lldb
1
2
3
4
5
6
7
8
9> .\hdc_std.exe list targets 查看设备
7001005458323933328a268f9c7f3900
> .\hdc_std.exe file send D:\lldb-server /data 将本地文件传递到设备的/data目录
FileTransfer finish, Size:xxx, File count = 1, time:16ms rate:1245.38kB/s
> .\hdc_std.exe shell 进入设备shell
# cd /data 进入/data目录
# mkdir test 新建目录便于测试
# chmod +x ./lldb_server
# ./lldb-server platform --listen "*:1234" --server 前提是设备的wifi有连接使用
C:\Users\vv\AppData\Local\OpenHarmony\Sdk\9\native\llvm\bin\lldb.exe
或者Ubuntu的lldb连接目标server1
2
3
4
5
6
7
8
9
10
11
12
13
14
15> .\lldb.exe --arch thumbv7
(lldb) platform select remote-linux
Platform: remote-linux
Connected: no
(lldb) platform connect connect://192.168.1.8:1234
Platform: remote-freebsd
Triple: arm-unknown-linux-unknown
OS Version: 5.10.93 (5.10.93)
Hostname: localhost
Connected: yes
WorkingDir: /
Kernel: #1 SMP Wed Dec 7 15:20:41 CST 2022
(lldb) platform set -w /data/test 设置测试目录为我们刚创建的test目录
(lldb) file ./DiscSdkTest 执行run的时候会将本地文件DiscSdkTest放置到目标目录
(lldb) run 开始运行目前32位的系统的lldb存在thumb识别问题, 调试会有很大问题.
gdbinit for aarch64
因为自带的gdb比较简单, 这里我生成一个gdbinit, 方便查看内存和寄存器, 以及单步.
使用时, 在~/.gdbinit添加以下内容即可
1 | set architecture aarch64 |