HarmonyOS Developer DevEco Studio使用指南-应用/服务调试
跨设备分布式应用/服务调试
DevEco Studio支持一个工程(单模块或多模块)连接多个设备,在设备之间能彼此通信的条件下(如分布式流转场景),支持对跨设备、跨模块、跨进程的HarmonyOS应用/服务进行调试。分布式应用/服务调试支持Java应用/服务调用Java应用/服务、JS应用/服务调用Java应用/服务,以及使用HarmonyOS IDL实现的跨设备场景,开发者在如下表中的方法处设置断点,当中断到该断点处,执行Step Into即可进入到被调用方法的实现处。
发起调用端(设备A) | 实现调用端(设备B) |
Java FA/PA:startAbility(Intent intent) | Java FA/PA:onStart(Intent intent) |
Java FA/PA:connectAbility(Intent intent,IAbilityConnection conn) | Java PA:onConnect(Intent intent) |
JS FA:FeatureAbility.startAbility(OBJECT) | Java PA/FA:onStart(Intent intent) |
Java:IRemoteObject.sendRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) | Java:IRemoteObject.onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) |
Java:HarmonyOS IDL方法调用处 | Java:HarmonyOS IDL方法实现处 |
分布式应用/服务调试流程
下面以一个设备A(FA)调用设备B(PA)的分布式调用场景来介绍分布式应用/服务调试流程,如下图所示:
- 开发者启动分布式调试任务。
- IDE调试器会分别在设备A和设备B上安装应用/服务,并启动调试。
- 开发者在设备A(FA)调用设备B(PA)的调用处设置断点,IDE调试器在该断点处中断。
- 执行Step Into操作,则会在设备B(PA)被调用的方法实现处中断。
- 开发者对设备B(PA)进行调试。
- 如果在设备B(PA)被调用的方法实现处执行Step Out,则退出设备B(PA)的调试,并在设备A调用处中断。
- 开发者停止调试任务。
- IDE调试器停止设备A和设备B的应用/服务运行,调试结束。
前提条件
调测的多个设备成功组网,包括连接到同一个WLAN网络和登录同一个华为帐号。
操作步骤
- 在涉及跨设备调用的代码行设置断点。
- 选择跨设备调试配置(Super App)选项,单击
按钮启动调试。
- 在弹出的设备选择窗口,指定调试设备对应的模块名称。
- 启动调试后,DevEco Studio将按照勾选的多个设备,分别启动多个调试会话窗口,命名为:“Super App-模块名”,如Super App-entry。
- 在代码执行到断点处(跨设备调用的代码处)中断,单击Step Into,快捷键为F7(macOS为F7),则会自动跳转到被调用代码接口方法处。
例如,以上图中的调试界面为例,在Phone中调用TV的音乐播放能力,单击Step Into,调试窗口将从“Super App-entry”跳转到“Super App-entrytv”窗口,同时,代码也会跳转到调用实现的接口方法处,无需开发者手动设置断点。
打印日志
DevEco Studio的日志系统包括HiLog日志和FaultLog日志系统,其中:
- HiLog日志系统:让应用/服务可以按照指定类型、指定级别、指定格式字符串打印日志内容,帮助开发者了解应用/服务的运行状态,更好地调试程序。
- FaultLog日志系统:FaultLog是为了满足HarmonyOS应用/服务开发者基本的故障定位需求而设计,能够帮助应用开发者快速查询、定位、导出应用故障信息。
打印Hilog日志
输出日志
在输出日志前,需要先调用isLoggable确认某个domain、tag和日志级别是否被禁止打印日志。使用示例:
hilog.isLoggable(0x0000, "testTag", hilog.LogLevel.INFO);
- 参数domain:用于指定输出日志所对应的业务领域,取值范围为0x0~0xFFFFF,开发者可以根据需要进行自定义。
- 参数tag:用于指定日志标识,可以为任意字符串,建议标识调用所在的类或者业务行为。
- 参数level:用于指定日志级别。
hilog中定义了DEBUG、INFO、WARN、ERROR、FATAL五种日志级别,并提供了对应的方法用于输出不同级别的日志,如下表所示:
表1 HiLog提供的主要接口
接口名 | 功能描述 |
debug(domain: number, tag: string, format: string, ...args: Array<Object>) | 输出DEBUG级别的日志。DEBUG级别日志表示仅用于应用/服务调试。 可以在DevEco Studio的terminal窗口或cmd里,通过命令“hdc shell hilogcat”设置可打印日志的等级为DEBUG。 |
info(domain: number, tag: string, format: string, ...args: Array<Object>) | 输出INFO级别的日志。INFO级别日志表示普通的信息。 |
warn(domain: number, tag: string, format: string, ...args: Array<Object>) | 输出WARN级别的日志。WARN级别日志表示存在警告。 |
error(domain: number, tag: string, format: string, ...args: Array<Object>) | 输出ERROR级别的日志。ERROR级别日志表示存在错误。 |
fatal(domain: number, tag: string, format: string, ...args: Array<Object>) | 输出FATAL级别的日志。FATAL级别日志表示出现致命错误、不可恢复错误。 |
- 参数domain和tag应与isLoggable中使用的一致。
- 参数format:格式字符串,用于日志的格式化输出。格式字符串中可以设置多个参数,例如格式字符串为“%s World”,“%s”为参数类型为string的变参标识,具体取值在args中定义。每个参数需添加隐私标识,分为{public}或{private},默认为{private}。{public}表示日志打印结果可见;{private}表示日志打印结果不可见,输出结果为<private>。
调试时可以通过命令“hilog -p off”指令,关闭隐私开关,明文显示private日志内容。 - 参数args:可以为0个或多个参数,是格式字符串中参数类型对应的参数列表。参数的数量、类型必须与格式字符串中的标识一一对应。
以输出一条INFO级别的信息为例,示例代码:
hilog.info(0xFF00, "testTag", "%{public}s World %{public}d", "hello", 3);
该行代码表示输出一个普通信息,格式字符串为:”%{public}s World %{public}d”。其中变参"%{public}s"为公共的字符串;%{public}d为公共的整型数。
查看日志信息
DevEco Studio提供了“Log > HiLog”窗口查看日志信息,开发者可通过设置设备、进程、日志级别和搜索关键词来筛选日志信息。搜索功能支持使用正则表达式,开发者可通过搜索自定义的业务领域值和TAG来筛选日志信息。
根据实际情况选择了设备和进程后,搜索标签“testTag”进行筛选,得到对应的日志信息。
结果输出:
10-27 10:07:04.456 20680-20939/com.example.myapplication I 0FF00/testTag: hello World 3
- 20680-20939表示进程的进程ID和线程ID。
- com.example.myapplication表示应用进程名。
- I表示日志级别为INFO。
- testTag为开发者自定义的日志标签。
- 日志内容中显示将实际取值填入字符串的结果。
HiLog窗口左侧各个按钮的作用为:
:单击该按钮可以向上翻页,日志窗口取消自动滚动。
:单击该按钮可以向下翻页,日志窗口取消自动滚动。如果翻页已到底部,日志窗口自动滚动。
:当该按钮处于选中状态时,日志自动换行显示,否则日志按行显示。
:当该按钮处于选中状态时,日志自动滚动到窗口底部,否则停留在当前日志显示处。
:单击该按钮可以重新开启日志接收,会清空日志缓存和窗口日志。
:单击该按钮可以清空窗口日志。
: 单击该按钮可以对当前选择的设备屏幕进行截屏,并保存在本地。不支持对包含密码输入的界面进行截屏。
:单击该按钮可以保存日志缓存到指定文件。
:自动选择和切换已连接的设备。
:过滤只展示App日志。
:单击该按钮可以关闭当前日志窗口。
日志打印实例
在按钮中增加一个单击事件,单击按钮时打印一条日志。
说明
本示例采用ArkTS语言为例,使用JS语言开发仅在UI部分代码有所不同,hilog部分代码通用。
- 新建一个工程,选择“Empty Ability”。
- 工程配置界面中,Model选择“FA ”、Language选择“ArkTS”。
- 在Project窗口单击“entry > src > main > ets > MainAbility > pages ”,打开工程中的“index.ets”文件,添加一个按钮,点击按钮打印日志。
示例代码如下:
// index.ets
import hilog from '@ohos.hilog';
@Entry
@Component
struct Index {
build() {
Row() {
Column() {
// 添加按钮,以响应用户点击
Button() {
Text('Next')
.fontSize(30)
.fontWeight(FontWeight.Bold)
}
.type(ButtonType.Capsule)
.margin({
top: 20
})
.backgroundColor('#0D9FFB')
.width('40%')
.height('5%')
// 跳转按钮绑定onClick事件,点击时打印日志
.onClick(() => {
hilog.isLoggable(0xFF00, "testTag", hilog.LogLevel.INFO);
hilog.info(0xFF00, "testTag", "%{public}s World %d", "hello", 3);
})
}
.width('100%')
}
.height('100%')
}
}
- 在真机/远程模拟器上运行该工程,单击应用/服务界面上的“Next”按钮。
- 在DevEco Studio的底部,切换到“Log”窗口,设置日志的过滤条件。选择当前的设备及进程,日志级别选择Info,搜索内容设置为“testTag”。此时窗口仅显示符合条件的日志。
打印FaultLog日志
FaultLog是由系统自动从设备进行收集,包括如下四类故障信息:
- App Freeze
- CPP Crash
- JS Crash
- Java Crash
FaultLog故障信息如下图所示,支持按照应用包名进行过滤、日志刷新、日志导出等功能。
如上图所示,FaultLog故障信息左侧按照应用/服务包名 > 故障类型 > 故障时间结构组成,选中具体的故障日期,则会在右侧展示详细的故障信息,便于开发者进行故障定位。