华为认证题库
高级认证题库
题库可以保过
单选
1 . 以下哪个装饰器用来表示并发共享对象。
A. @Shared
B. @Sendable
C. @Style
D. @State
- 答案:B
2 . 在方舟字节码的函数调用规范中,前三个参数表示的含义分别是
A. new.Target
、函数对象本身、this
B. this
、函数对象本身、new.Target
C. 函数对象本身、new.Target
、this
D. new.Target
、this
、函数对象本身
- 答案:C
3 . 下面关于方舟字节码格式PREF_IMM16_V8_V8
描述正确的是
A. 16位前缀操作码,16位立即数,8位寄存器
B. 16位前缀操作码,16位立即数,2个8位寄存器
C. 8位操作码,8位立即数,2个8位寄存器
D. 8位操作码,8位立即数,16位id,8位寄存器
- 答案:B
4 . 以下关于Taskpool
和worker
的描述正确的是
A. 开发者需要自行管理taskpool
的数量及生命周期
B. TaskPool
支持任务延时执行
C. Worker
自行管理生命周期,开发者无需关心任务负载高低
D. TaskPool
和Worker
的任务执行时长上限都是无限制
- 答案:B
5 . 下面关于方舟字节码格式IMM16_ID16_IMM8
描述汇确的是
A. 16位前缀操作码,16位立即数,8位寄存器
B. 8位操作码,16位立即数,2个8位寄存器
C. 8位操作码,16位立即数,16位id,8位立即数
D. 8位操作码,16位立即数,16位id,8位寄存器
- 答案:C
6 . 如果要实现Row
组件内的子元素均匀排列,且第一个案与行首对齐,最后一个元素与行尾对齐,需要使用justifycontent
的哪个枚举值
A. SpaceBetween
B. SpaceEvenly
C. Start
D. End
- 答案:A
7 . 下面哪种转场效果在入场动画时,表现为从透明度为0
、相对于组件正常显示位置x
方向平移100vp
的状态,到默认的透明度为1
、相对于组件不平移的状态,且透明度动画和平移动画的动画时长均为2000ms
A. TransitionEffect.translate({ x:100 }).combine(TransitionEffect.OPACITY.animation({ duration: 2000 }))
B. TransitionEffect.OPACITY.animation({ duration: 2000 }).combine(TransitionEffect.translate({ x:100 }))
C. TransitionEffect.OPACiTY.combine(TransitionEffect.translate({ x:100 }).animation({ duration: 2000 })
D. TransitionEffect.asymmetric(TransitionEffect.OPACITY.animation({ duration:2000 }), TransitionEffectranslate({ x:100).animation({ duration: 2000 }))
- 答案:B
8 . 如果想让outer button
响应事件,hitTestBehavior
该怎么配
import promptAction from '@ohos.promptAction';
// xxx.ets
@Entry
@Component
struct HitTestBehaviorExample {
build() {
// outer stack
Stack() {
Button('outer button')
.onClick((event) => {
promptAction.showToast({ message: `click事件触发-----++++2` });
})
// inner stack
Stack() {
Button('inner button')
.onTouch((event) => {
promptAction.showToast({ message: `click事件触发-----------1` });
})
}.width(300).height(300)
}
}
}
A. HitTestMode.None
B. HitTestMode.Default
C. HitTestMode.Transparent
D. HitTestMode.Block
- 答案:C
9 . 依次点击A、B、C、D四个按钮,其中不会触发UI刷新的是
class Info {
name: string;
constructor(name: string) {
this.name = name;
}
}
@Entry
@Component
struct Index {
@State nameList: Info[] = [new Info("Tom"), new Info("Bob"), new Info("John")]
build() {
Column() {
ForEach(this.nameList, (item: Info) => {
Text(`${item.name}`)
Button("A")
.onClick(() => {
this.nameList.push(new Info("Lucy"));
})
Button("B")
.onClick(() => {
this.nameList[0] = new Info("Eric");
})
Button("C")
.onClick(() => {
this.nameList[0].name = "Jim";
})
Button("D")
.onClick(() => {
this.nameList = [new Info("Barry"), new Info("Cindy"), new Info("David")];
})
})
}
}
}
A. C
B. B
C. D
D. A
- 答案:A
10 . 使用promptAction.showToast
如何设置显示在其他应用之上?
A. 无需配置,默认显示在其他应用之上
B. ToastShowMode.SYSTEM_TOP_MOST
C. ToastShowMode.DEFAULT
D. ToastShowMode.TOP_MOAST
- 答案:D
11 . 以下关于ArkUI NavDestination
组件的生命周期执行顺序中正确的是
A. onWillappear->onAppear->onWillShow->onShow->onWillHide->onHidden->onWillDisappear->onDisappear
B. onWillappear->onAppear->onWillShow->onShow->onWillHide->onWillDisappear->onHidden->onDisappear
C. onWillappear->onWillShow->onShow->onAppear->onWillHide->onHidden->onWillDisappear->onDisappear
D. onWillappear->onAppear->onWillShow->onShow->onWillDisappear->onWillHide->onHidden->onDisappear
- 答案:A
12 . 开发者小李遇到了一个复杂的问题,该问题仅在特定的代码执行路径上出现,且难以复现。他使用的是C++
进行核心算法开发,代码的逻辑密集且对性能要求极高,DevEco studio
为C/C++
开发者提供的高级调试能力,以下哪个能力可以帮助小李査看代码历史执行路径,回溯到关键的变量状态
A. 实时代码修改与运行时效果查看 : 支持在调试过程中修改代码并立即查看修改效果,适用于快速迭代,但不聚焦于问题追溯
B. 反向调试能力: 允许开发者在调试过程中回退回到之前的代码行或断点,不仅查看过去的堆栈信息,还能重现历史的全局、静态和局部变量状态,帮助深入理解代码历史行为,特别是对于复杂逻辑和难以复现的bug定位至关重要
C. 代码静态分析 : 提供静态代码检查工具,通过语法和逻辑分析帮助预防潜在错误,但不涉及运行时问题定位
D. 传统调试模式 : 仅允许在当前断点暂停代码执行,查看调用堆栈和当前变量信息,但无法追溯历史执行状态
- 答案:B
13 . 小李正在使用DevEco Studio
进行HarmonyOS
应用的开发工作,他需要对一个频繁被调用的函数calculateData()
进行重构,为了帮助小李高效地找到calculateData()
函数的所有引用位置,并确保重构时考虑周全,以下哪个步骤是正确的使用DevEco studio
A. 小李只需将光标定位在calculateData()
函致名上,右键点击并选择"Find Usages"
,或者直接使用快捷键Alt + F7 (macOS为Option + F7)
,DevEco Studio
会自动列出该函数在项目中的所有引用位置。
B. 小李应将光标置于calculateData()
函数的名称上,按下Ctrl+Shift+F(macOS为Command + Shift + F)
全局搜索该函数名,然后在搜索结果中筛选出真正的调用位置。
C. 小李应该在菜单栏中选择"Navigate" > "Class"
来打开类浏览器,从中找到calculateData()
函数,井在此界面中手动检查所有引用。
D. 小李应当在项目目录树中找到calculateData()
函数所在的文件,直接双击打开文件,然后逐行扫描代码以手动査找该函数的所有调用位置。
- 答案:B
14 . 当前您在开发一个ArkTS
、Stage
模型的HarmonyOS
工程,关于当前ArkTS
工程目录结构,下列选项说法错误的是?
A. oh-package.json5
:描述依赖配置,如:依赖覆盖(overides)
、依赖关系重写(overrideDependencyMap)
和参数化配置(parameterFle)
等
B. build-profile.json5
:应用级编译构建任务脚本。
C. AppScope > app.json5
:应用的全局配置信息。
D. entry > src > main > modue.json5
: Stage
模型模块配置文件,主要包含HAP
的配置信息、应用在具体设备上的配置信息以及应用的全局配置信息
- 答案:B
15 . DevEco Studio
提供HarmonyOS
应用/服务的UI
预览界面与源代码文件问的双向预览功能,支持ets
文件与预览器界面的双向预览。关于双向预览,下列选项说法错误的是
A. 选中预览器UI
界面中的组件,则组件树上对应的组件将被选中,同时代码编辑器中的布局文件中对应的代码块高亮显示。
B. 双向预览不支持通过组件的属性面板实时修改属性或样式。
C. 选中布局文件中的代码块,则在UI
界面会高亮显示,组件树上的组件节点也会呈现被选中的状态
D. 选中组件树中的组件,则对应的代码块和UI
界面也会高亮显示。
- 答案:B
16 . 项目中包含多个模块和数千行代码。随着开发的深入,项目中的ArkTS
源代码文件逐渐积累了大量import
语句,其中不乏未使用的import
以及不规范的排序情况,关于DevEco Studio
的编辑器的"Optimize Imports"
,以下说法正确的是
A. 为了快速清理末使用的import
,可以选中项目根目录,按下快捷键Ctrl+Alt+O(在macOS上为Control+Opion+O)
,让DevEco Studio
自动识别并移除所有未使用的import
,并自动按器预设规则排序和合并import
。
B. 可以在菜单栏中依次点击"Code" > "Reformat Code"
来达到优化import
的目的,因为"Optimize imports"
功能已整合进"Reformnat Code"
中。
C. 在DevEco Studio
中,没有直接的"Optimize lmports"
功能,需要安装第三方插件来实现这个需求。
D. 应该手动遍历每个ArkTS
文件,逐一检查并删除未使用的import
语句,然后按照字母顺序手动排序剩余的import
.
- 答案:B
17 . 在组件中,经常需要使用字符串、图片等资源。HSP中的组件需要使用资源时,一般将其所用资源放在HSP包内,而非放在HSP的使用方处,以符合高内聚低耦合的原则。下面访问HSP资源错误的是
A. 通过$r访问HSP中的资源。lmage($r('app.media.example))id('example').borderRadius('48px')
B. 使用相对路径的方式,访问HSP中的资源。lmage("../../resources/base/media/examplepng").id(example).borderRadius('48px')
C.
// library/src/main/ets/ResManager.ets
export class ResManager{
static getPic(: Resource{
return $r(app.media.pic');
}
static getDesc(): Resource{
return $r('app.string.shared_desc');
}
//对外暴露的接口,需要在入口文件index.ets中声明:
//library/index.ets
export {ResManager } from './src/main/ets/ResManaqer';
- 答案:B
18 . HAR(Harmony Archive)
是HarmonyOS
提供的共享包,以下关于HAR
的描述错误的是
A. HAR
不支持使用page
页面。
B. HAR
不支持引用AppScope
目录中的资源。在编译构建时,AppScope
中的内容不会打包到HAR
中,因此会导致HAR
资源引用失败。
C. HAR
可以作为二方库和三方库提供给其他应用使用,如果需要对代码资产进行保护时,建议开启混淆能力。
D. HAR
不支持在设备上单独安装/运行,只能作为应用模块的依赖项被引用。
- 答案:A
19 . want
参数的entities
匹配规则错误的是
A. 调用方传入的want
参数的entities
为空,待匹配应用组件的skills
配置中的entities
为空,则entities
匹配成功。
B. 调用方传入的want
参数的entities
不为空,待匹配应用组件的skills
配置中的entities
为空,则entities
匹配失败。
C. 调用方传入的want
参数的entities
不为空,待匹配应用组件的skills
配置中的entities
不为空且包含调用方传入的want
参数的entities
,则entities
匹配成功。
D. 调用方传入的want
参数的entities
为空,待匹配应用组件的skills
配置中的entities
不为空,则entities
匹配失败。
- 答案:D
20 . 作为一个应用开发者,想搭建运维平台,想在应用内定时读取当前的内存信息,可以通过()接口来实现。
A. hiChecker
B. hiDebug
C. hiAppEvent
D.hiLog
- 答案:B
21 . 关于ArkUI
的ForEach
和LazyForEach
,下列说法错误的是?
A. 当在滚动容器中使用了LazyForEach
,框架会根据滚动容器可视区域按需创建组件,当组件滑出可视区域外时,框架会进行组件销毁回收以降低内存占用。
B. ForEach
和LazyForEach
会根据定义的键值生成规则为数据源的每个数组项生成唯一键值,并创建相应的组件。
C.长列表滚动场景,优先使用ForEach
。
D.LazyForEach
需要配合cachedCount
和组件复用一起使用,以达到性能的最优表现。
- 答案:C
22 . 根据上面代码,以下解释正确的是
enum Mode {
fullScreen,
halfScreen
}
@Entry
@Component
struct Page {
@State title: string = "";
@State mode: Mode = Mode.fullScreen;
isShownTitle(): boolean {
if (this.mode == Mode.fullScreen) {
this.title = "Title";
return true;
} else {
this.title = "Section";
return false;
}
}
build() {
Column() {
if (this.isShownTitle()) {
Text(`${this.title}`)
} else {
Text(`${this.title}`)
}
ChangeMode({ mode: this.mode })
}
}
}
@Component
struct ChangeMode {
@Prop mode: Mode;
build() {
Row( {space: 20}) {
Button('full screen').onClick(() => {
this.mode = Mode.fullScreen;
})
Button('half screen').onClick(() => {
this.mode = Mode.halfScreen;
})
}
}
}
A. 在自定义组件Page
的build
方法里改变状态变量是非法操作,可能导致未定义的异常UI行为。
B. 在ChangeMode
里改变mode
的值,会触发其父组件Page
的Title
内容的切换。
C. 本例子可以运行起来,所以代码没有问题
D. 为了避免@Prop
的拷贝,可以优化使用@Link
,在该例子中行为和@Prop
一样。
- 答案:C
23 . 以下示例代码中可以进行动画的属性有哪些?
@Component
struct MyComponent {
@State compWidth: number = 100;
@Stale compHeight: number = 100;
@State compRadius: number = 32;
build() {
Column(){}
.width(this.compWidth) //1
.height(this.compHeight) //2
.animation({curve: Curve.Ease, duration: 200 })
.borderRadius(this.compRadius) //3
.onclick(() => {
this.compWidth += 10;
this.compHeight += 10;
this.compRadius += 4;
})
}
A. 1、3
B. 2、3
C. 1、2、3
D. 1、2
- 答案:C
24 . 以下哪些赋值语句在ArkTS中是合法
class C{}
let value1: number = null;
let value2: string | null = null;
let value3: string | undefined = null;
let value4: C = null;
A. value3
B. value2
C. value1
D. value4
- 答案:B
25 . 以下哪些赋值语句在ArkTS中是合法的
class A {
v: number = 0;
}
class B extends A {
u: string = '';
}
class C {
v: number = 0;
}
let a1: A = new C();
let a2: A = new B();
let a3: B = new A();
let a4: C = new B();
A. a2
B. a1
C. a4
D. a3
- 答案:A
26 . singleton模式的UIAbility,在冷启动时生命周期的执行顺序是:
A. onCreate -> onForeground -> onWindowStageCreate
B. onCreate -> onBackground -> onForeground
C. onCreate -> onBackground -> onWindowStageCreate
D. onCreate -> onWindowStageCreate -> onForeground
- 答案:D
27 . 可以通过下下面那个接口拉起导航类的垂域面板
A. startAbility
B. startAbilityByType
C. startAbilityForResult
D. srtAbilityByCall
- 答案:B
28 . 为了提高性能,所以List
组件支持懒加载,可以通过配置cachedCount
属性设置缓存列表项的数量。当我们不设置List
的属性cachedcount
时,该属性的默认值是?
A. 3
B. 0
C. 2
D. 1
- 答案:D
29 . 应用程序开发调试过程中,经常需要安装新应用进行调测,下面安装应用操作错误的是
A. hdc install -p ohosapp hap
B. bm install -p /data/app/
C. bm install -p ohosapp.hap
D. bm install -p ohosapp.hap -r
- 答案:A
30 . 关于短时任务开发使用的接口是
A. 使用startWork
申请任务,使用stopWork
取消任务,使用getWorkStatus
获取任务状态
B. 使用requestSuspendDelay
申请任务,使用getRemainingDelayTime
获取任务剩余时间
C. 使用publishReminder
发布一个提醒类通知,使用cancelReminder
取消一个指定的提醒类通知
D. 使用startBackgrcondRunning
申请任务,使用stopBackgroundRunning
取消任务
- 答案:B
31 . List
组件onScrollIndex
事件触发时机是
A. List组件首次加载完成时触发
B. List组件列表滚动时每帧触发
C. List组件滚动停止时能发
D. List组件显示区域内第一个子组件或最后一个子组件或中间位置子组件索引值变化时触发
- 答案:D
31 . 在moduleA
(HAP类型)中有一个图片名为image.png
,在moduleB
(HAR类型)也存在一个图片名为image.png
,而且moduleA
依赖于moduleB
,那么在moduleA
的编译产物hap
包中,image.png
存在情况是:
A. 两者都不存在
B. 仅存在moduleA
的image.png
C. 两者都存在
D. 仅存在moduleB
的image.png
- 答案:B
32 . 以下关于垂直滚动Grid
组件使用cachedCount
属性的说明正确的是
A. 设置cachedCount为1,则Grid在显示范围上下各缓存1个GridItem
B. 设置cachedCount为1,则Grid在显示范围上下各缓存1行GridItem
C. 设置cachedCount为1,则Grid在显示范围下方缓存1个GridItem
D. 设置cachedCount为1,则Grid在显示范围下方缓存1行Gridltem
- 答案:A
33 . 为了使isShow
参数值与半模态界面的状态同步,可以使用下列那种方式双向绑定isShow
参数?
A.
@Entry
@Component
struct SheetTransitionExample {
@State isShow: boolean = false
@State isShow2: boolean = false
@State sheetHeight: number = 300
@Builder myBuilder() {
Column() {
Button("change height")
.margin(10)
.fontSize(20)
.onClick(() => {
this.sheetHeight = 500
})
}
.width('100%')
.height('100%')
}
build() {
Column() {
Button("transition modal 1")
.onClick(() => {
this.isShow = true
})
.fontSize(20)
.margin(10)
.bindSheet($$this.isShow, this.myBuilder(), {
height: this.sheetHeight,
})
}
.justifyContent(FlexAlign.Center)
.width('100%')
.height('100%')
}
}
B.
@Entry
@Component
struct SheetTransitionExample {
@State isShow: boolean = false
@State isShow2: boolean = false
@State sheetHeight: number = 300;
@Builder myBuilder() {
Column() {
Button("change height")
.margin(10)
.fontSize(20)
.onClick(() => {
this.sheetHeight = 500
})
}
.width('100%')
.height('100%')
}
build() {
Column() {
Button("transition modal 1")
.onClick(() => {
this.isShow = true
})
.fontSize(20)
.margin(10)
.bindSheet(@@this.isShow, this.myBuilder(), {
this.height: this.sheetHeight,
})
}
.justifyContent(FlexAlign.Center)
.width('100%')
.height('100%')
}
}
C.
@Entry
@Component
struct SheetTransitionExample {
@State isShow: boolean = false
@State isShow2: boolean = false
@State sheetHeight: number = 300;
@Builder myBuilder() {
Column() {
Button("change height")
.margin(10)
.fontSize(20)
.onClick(() => {
this.sheetHeight = 500
})
}
.width('100%')
.height('100%')
}
build() {
Column() {
Button("transition modal 1")
.onClick(() => {
this.isShow = true
})
.fontSize(20)
.margin(10)
.bindSheet(&&this.isShow, this.myBuilder(), {
this.height: this.sheetHeight,
})
}
.justifyContent(FlexAlign.Center)
.width('100%')
.height('100%')
}
}
D.
@Entry
@Component
struct SheetTransitionExample {
@State isShow: boolean = false
@State isShow2: boolean = false
@State sheetHeight: number = 300;
@Builder myBuilder() {
Column() {
Button("change height")
.margin(10)
.fontSize(20)
.onClick(() => {
this.sheetHeight = 500
})
}
.width('100%')
.height('100%')
}
build() {
Column() {
Button("transition modal 1")
.onClick(() => {
this.isShow = true
})
.fontSize(20)
.margin(10)
.bindSheet(this.isShow, this.myBuilder(), {
this.height: this.sheetHeight,
})
}
.justifyContent(FlexAlign.Center)
.width('100%')
.height('100%')
}
}
- 答案:A
34 . 以下哪份代码可以实现下图Grid
布局
A. 通过设置GridItem
的columnStart
和columnEnd
@Entry
@Component
struct GridExample3 {
numbers: String[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
scroller: Scroller = new Scroller()
build() {
Column({ space: 5 }) {
Grid(this.scroller) {
ForEach(this.numbers, (day: string) => {
if (day === '0' || day === '5') {
GridItem() {
Text(day)
.fontSize(16)
.backgroundColor(0xF9CF93)
.width('100%')
.height(80)
.textAlign(TextAlign.Center)
}.columnStart(1).columnEnd(4)
} else {
GridItem() {
Text(day)
.fontSize(16)
.backgroundColor(0xF9CF93)
.width('100%')
.height(80)
.textAlign(TextAlign.Center)
}
}
}, (day: string) => day)
}
.columnsTemplate('1fr 1fr 1fr 1fr')
.columnsGap(10)
.rowsGap(10)
.scrollBar(BarState.Off)
.width('100%')
.backgroundColor(0xFAEEE0)
.height(350)
}
}
}
B. 通过GridLayoutOptions
@Entry
@Component
struct GridExample3 {
numbers: String[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
scroller: Scroller = new Scroller()
layoutOptions1: GridLayoutOptions = {
regularSize: [1, 1],
irregularIndexes: [0, 5],
}
build() {
Column({ space: 5 }) {
Grid(this.scroller, this.layoutOptions1) {
ForEach(this.numbers, (day: string) => {
GridItem() {
Text(day)
.fontSize(16)
.backgroundColor(0xF9CF93)
.width('100%')
.height(80)
.textAlign(TextAlign.Center)
}
}, (day: string) => day)
}
.columnsTemplate('1fr 1fr 1fr 1fr')
.columnsGap(10)
.rowsGap(10)
.scrollBar(BarState.Off)
.width('100%')
.backgroundColor(0xFAEEE0)
.height(350)
}.align(Alignment.Center)
}
}
C. 通过设置不同GridItem
的宽度
@Entry
@Component
struct GridExample3 {
numbers: String[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
scroller: Scroller = new Scroller()
columnGap: number = 10
gridItemWidth: number = 80
build() {
Column({ space: 5 }) {
Grid(this.scroller) {
ForEach(this.numbers, (day: string) => {
if (day === '0' || day === '5') {
GridItem() {
Text(day)
.fontSize(16)
.backgroundColor(0xF9CF93)
.width(this.gridItemWidth * 4 + this.columnGap * 3)
.height(80)
.textAlign(TextAlign.Center)
}
} else {
GridItem() {
Text(day)
.fontSize(16)
.backgroundColor(0xF9CF93)
.width(this.gridItemWidth)
.height(80)
.textAlign(TextAlign.Center)
}
}
}, (day: string) => day)
}
.columnsTemplate('1fr 1fr 1fr 1fr')
.columnsGap(this.columnGap)
.rowsGap(10)
.scrollBar(BarState.Off)
.width('100%')
.backgroundColor(0xFAEEE0)
.height(350)
}
}
}
- 答案:B
35 . 开发者小林正在使用DevEco Studio
开发一款HarmonyOS
应用,并在真机上进行调试。他在运行应用的过程中突然发现一处UI
布局需要微调,希望在不中断当前应用运行的情况下看到调整效果,基于DevEco Studio
提供的Hot Reload
(热重载)能力,以下哪种做法能让小林最有效地实现他的需求
A. 在不关闭应用的情况下,直接修改代码并保存,借助Hot Reload功能在真机上实时查看布局调整的效果
B. 使用模拟器替代真机进行调试,因为Hot Reload仅在模拟器上支持代码改动的即时生效
C. 继续运行应用,手动重启应用后检查布局是否符合预期
D. 立即停止应用、修改代码后重新编译并部署到真机上
- 答案:A
36 . 小华正在使用DevEco studio
开发一款基于HarmonyOS
的ArkUI
应用,该应用需要实现一个功能,即当用户点击按钮时,通过ArkTS/JS API
调用系统的分享功能。小华对具体的API
调用细节不太熟悉,如何通过DevEco Studio
快速查阅相关的API
文档。
A. 小华在代码编辑区直接键入分享功能相关的API
调用代码,如arkui.getShare()
,然后按F1键,期望编辑器能自动跳转到该API的文档页面。
B. 小华右键点击代码编辑区,选择"Find Usages"
选项,试图从其他地放引用该API
的实例中学习如何使用分享功能
C. 小华应该先停止编码工作,打开浏览器,手动搜索关键词"HarmonyOS ArkUI 分享API"
,在官方网站的文档页面中寻找相关API
的使用方法。
D. 小华将鼠标悬停在编辑器中已经键入或打算键入的API
调用(例如 @system.router.push
)上,等待编辑器自动弹出悬浮提示框,显示该API
的简要信息和不同版本参数说明。随后,点击提示框右下角的"Show in API Reference"
链接。直接跳转到详尽的API
参考文档页面。
- 答案:D
37 . 使用DevEco Studio进行复杂的跨设备功能开发与调试工作,期间频繁依赖本地模拟器来模拟多样化的设备环境。在这样的背景下,以下关于DevEco Studio本地模拟器所支持的规格与功能,哪一项描述是准确的
A. 本地模拟器当前不支持单元测试框架和UI测试框架的运行
B. 本地模拟器上运行的应用无需进行签名,简化了调试过程
C. 本地模拟器和真机的能力没有任何差异,真机上可以支持的能力在模拟器上都可以
D. 本地模拟器当前不支持查看HiLog以及FaultLog
- 答案:B
38 .
在
UIAbility
的onCreate
生命周期中通过EventHub
的on
注册"event1"
和"event2"
事件。import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; const DOMAIN_NUMBER: number = 0xFF00; const TAG: string = '[EventAbility]'; export default class EntryAbility extends UIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { //获取UIAbility实例的上下文 let context = this.context; //获取eventHub let eventhub = this.context.eventHub; //执行订阅操作 eventhub.on('event1', this.eventFunc); eventhub.on('event2', this.eventFunc); hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onCreate') hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); } //... eventFunc(argOne: Context, argTow: Context): void { hilog.info(DOMAIN_NUMBER, TAG, 'receive.' + `${argOne}, ${argTow}`); return; } }
在
UI
组件的click
处理事件中调用如下的eventHubFunc
,连续点击2次该控件后,运行日志输出是什么:import { promptAction } from '@kit.ArkUI' import { common } from '@kit.AbilityKit'; @Entry @Component struct Page_EventHub { private context = getContext(this) as common.UIAbilityContext eventHubFunc(): void { this.context.eventHub.emit('event1'); this.context.eventHub.emit('event2', 2, 'test2'); this.context.eventHub.off('event1'); } build() { Column() { //... List({ initialIndex: 0 }) { ListItem() { Row() { //... } .backgroundColor(Color.Brown) .width('50%') .height('10%') .onClick(() => { this.eventHubFunc(); promptAction.showToast({ message: $r('app.string.app_name') }) }) } } .width('100%') .height('100%') //... } //... } }
A.
[Example].[Entry].[EntryAbility] receive.[]
[Example].[Entry].[EntryAbility] receive.[2, "test2"]
[Example].[Entry].[EntryAbility] receive.[2, "test2"]
B.
[Example].[Entry].[EntryAbility] receive.[]
[Example].[Entry].[EntryAbility] receive.[2, "test2"]
C.
[Example].[Entry].[EntryAbility] receive.[]
[Example].[Entry].[EntryAbility] receive.[2, "test2"]
[Example].[Entry].[EntryAbility] receive.[]
D.
[Example].[Entry].[EntryAbility] receive.[]
[Example].[Entry].[EntryAbility] receive.[2, "test2"]
[Example].[Entry].[EntryAbility] receive.[]
[Example].[Entry].[EntryAbility] receive.[2, "test2"]
- 答案:A
39 . hiAppEvent
提供的Watcher
接口,需要订阅到OS的崩溃事件,正确的实现方式()
A.
hiAppEvent.addWatcher({
name: "watcher",
appEventFilters: [
{
domain: hiAppEvent.domain.OS,
names: [hiAppEvent.event.APP_CRASH]
}
],
onReceive: (domain: string, appEventGroups: Array<hiAppEvent.AppEventGroup>) => {
}
})
B.
hiAppEvent.addWatcher({
name: "watcher",
onReceive: (domain: string, appEventGroups: Array<hiAppEvent.AppEventGroup>) => {
}
})
C.
hiAppEvent.addWatcher({
name: "watcher",
appEventFilters: [
{
names: [hiAppEvent.event.APP_FREEZE]
}
],
onReceive: (domain: string, appEventGroups: Array<hiAppEvent.AppEventGroup>) => {
}
})
D.
hiAppEvent.addWatcher({
name: "watcher",
appEventFilters: [
{
domain: hiAppEvent.domain.OS,
names: [hiAppEvent.event.APP_CRASH]
}
]
})
- 答案:A
40 . 应用发生崩溃,()接口可以获取到崩溃时调用栈
A. hiAppEvent
B. hiDebug
C. hiLog
D. hiTraceMeter
- 答案:A
41 . 以下关于HAP ( Harmony Ability Package )
说法正确的是()
A. 应用工程编出的app文件中,只能包含一个hap文件
B. HAP是应用安装和运行的基本单位,在DevEco Studio工程目录中,一个HAP对应一个Module。应用打包时,所有的Module都只能生成.hap文件
C. 应用工程如果包含多个Module,在应用市场上架时,会将多个.hap文件打包成一个.app文件。
D. DevEco Studio会在编译构建时,不需要对HAP进行一致性校验
- 答案:C
42 . 以下关于动态import说法正确的是
A.动态import支持加载HSP模块、HAR模块、OHPM包、Native库
B. 动态import和静态import相比,灵活性更好,性能更好。
C.动态import支持懒加载,所以不能用于提升页面的加载速度
D.动态import不支持导入SDK的API,如@ohos.
- 答案:A
43 . 在一个包含多个模块(如entry、feature、service、library等)的大型HarmonyOS应用项目中,如果某个模块feature对另外一个公共库模块library有依赖,如何通过DevEco studio正确配置项目依赖关系
A.在feature的build-profile.json5文件的dependencies字段中配置library的依赖
B.无需配置,直接在代码中编写importxxxfrom 'library
C.在library的oh-package.json5文件的dependencies字段中配置feature的依赖
D.在feature的oh-package.json5文件的dependencies字段中配置library的依赖
- 答案:D
44 . hiAppEvent提供的Watcher接口,()属性不配置,会导致编译报错,产生"ArkTS Compiler Error"
A.onReceive
B.triggerCondition
C.onTrigger
D.name
- 答案:D
45 . 某个应用开发了一个UIAbilityA,其启动模式是specified,并且对应的AbilityStage的实现如下:
import AbilityStage from '@ohos.app.ability.AbilityStage';
import type Want from '@ohos.app.ability.Want';
export default class MyAbilityStage extends AbilityStage {
this.instanceIndex = 0;
onAcceptWant(want: Want): string {
if (want.abilityName === 'UIAbilityA') {
if (want.parameters && want.parameters.instanceKey === 'test') {
return `test_instance_` + this.instanceIndex++;
} else {
return 'test_instance';
}
}
return 'MyAbilityStage';
}
}
//依次调用如下方法4次启动UIAbilityA,value分别是"test" "test" "testA" "testA",则当前运行期UIAbility实例有几个
function testSpecified(context, value) {
let want: Want = {
deviceId: '',
bundleName: 'com.samples.stagemodelabilitydevelop',
abilityName: 'UIAbilityA',
moduleName: 'entry',
parameters: {
instanceKey: value
}
};
context.startAbility(want).then(() => {
hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in starting UIAbilityA.');
}).catch((err: BusinessError) => {
hilog.error(DOMAIN_NUMBER, TAG, `Failed to start UIAbilityA. Code is ${err.code}, message is ${err.message}`);
})
}
A. 4个
B. 2个
C. 3个
D. 1个
- 答案 C
46 . Text组件不支持以下哪种使用方式?
A.
@Entry
@Component
struct SpanExample {
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) {
Text() {
Span('In Line')
Span(' Component')
Span(' !')
}
}.width('100%').height(250).padding({ left: 35, right: 35, top: 35 })
}
}
B.
@Entry
@Component
struct styledStringDemo {
scroll: Scroller = new Scroller();
layout: TextLayoutManager = new TextLayoutManager()
controller1: TextController = new TextController();
async onPageShow() {
this.controller1.setLayout(this.layout)
}
build() {
Column() {
Text(undefined, { controller: this.controller1 })
}.width('100%')
}
}
C.
@Entry
@Component
struct TextExample {
build() {
Column({ space: 8 }) {
Text('textShadow').fontSize(9).fontColor(0xCCCCCC).margin(15).width('90%')
}
}
}
D.
@Entry
@Component
struct styledStringDemo {
scroll: Scroller = new Scroller();
mutableStyledString: MutableStyledString = new MutableStyledString("test hello world", [{
start: 0,
length: 5,
styledKey: StyledStringKey.FONT,
styledValue: new TextStyle({ fontColor: Color.Pink })
}]);
controller1: TextController = new TextController();
async onPageShow() {
this.controller1.setStyledString(this.mutableStyledString)
}
build() {
Column() {
Text(undefined, { controller: this.controller1 })
}.width('100%')
}
}
- 答案 B
47 . 一个应用有2个UIAbility组件,其module.json中abilities标签的配置如下方代码。
在手机设备上,执行如下操作后:
1.启动UIAbility1,然后back键返回销毁UIAbility1;
2.启动UIAbility2, 然后back键返回销毁UIAbility2;
3.启动UIAbility2, 然后back键返回销毁UIAbility2;
进入多任务列表,能看看到该应用的几个任务视图:
"abilities": [
{
"name": "UIAbility1",
"srcEntry": "./ets/entryability/Ability1.ets",
"description": "$string:EntryAbility_desc",
"icon": "$media:icon",
"label": "$string:Ability1_label",
"startWindowIcon": "$media:icon",
"startWindowBackground": "$color:start_window_background",
"exported": true,
"launchType": multiton
},
{
"name": "UIAbility2",
"srcEntry": "./ets/entryability/Ability2.ets",
"description": "$string:Ability2_desc",
"icon": "$media:icon",
"label": "$string:Ability2_label",
"startWindowIcon": "$media:icon",
"startWindowBackground": "$color:start_window_background",
"exported": true,
"launchType": singleton,
"removeMissionAfterTerminate":true
}
]
A.3个
B.1个
C.2个
D.0个
- 答案 A
48 . 某App依赖了3个ohpm库,这3个库占用的体积都比较大。在App的技术架构中,有多个hap和多个hsp均依赖这3个库,为了减少app的首包大小,以下哪些做法是无效的?
A.将3个ohpm库封装成1个hsp,并对外提供必要的接口。
B.将3个ohpm库分别封装成3个hsp,并对外提供必要的接口,
C.将这3个ohpm库封装到har包中,并对外提供必要的接口。
D.将某些特性做成按需加载模块,若这3个ohpm仅在按需加载模块里面使用,则将其打包在按需加载模块中。
- 答案:C
49 . 在一个包含多个模块(如entry、feature、har、hsp等)的大型Harmonyos应用项目中,如果要对某个静态共享模块构建出静态构建包产物,如何通过DevEco studio进行构建
A.选中hap模块,点击通过菜单栏make module hap
B.选中hsp模块,点击通过菜单栏make module "hsp
C.选中har模块,点击build菜单栏build hsp(s)
D.选中har模块,点击build莱单栏make module 'har'
- 答案:D
50 . 张工正在使用DevEco studio进行一个复杂项目的开发工作,项目中包含了成千上万行代码且涉及众多模块。在重构代码的过程中,他意识到需要对一个核心类名进行更改,考虑到这个类在整个项日中被广泛引用,于动修改不仅耗时且容易出错。基于DevEco Studio提供的代码编辑功能,以下哪个描述最准确地概述了张工如何高效且安全地完成对类名的更改,同时确保整个项目中所有相关引用同步更新?
A.张工只需简单选中需要更名的类名,按下Delete键删除后直接输入新名称,DevEco Studio会自动识别并更新所有引用。
B.张工选中需要更名的类名,使用快捷键Shift+F6或右键菜单Refactor->Rename,在弹出框中输入新名称并选择替换范围后,点击"Refactor"完成更名操作,确保所有相关引用自动更新。
C.张工在代码编辑器中右键点击该类名,选择“Find Usage”,手动浏览所有引用位置并逐一修改为新名称。
D,张工需打开项目搜索功能,输入旧类名找到所有匹配项,逐一进行替换,完成更名操作。
- 答案: B
51 . 项目需要为不同的设备形态(如手机、智能于表)提供定制化构建。请说明如何在DevEco studio中设置不同的构建配置,以生成针对不同设备的hap包?
A.在工程级别build-profile.json5定义多个product,在每个product的config/distributionFilter中定义不同的设备类型
B.在模块级别build-profile.json5定义多个target,在每个target的config/distributionFilter中定义不同的设备类型
C.在模块级别build-profile.json5定义多个target,在每个target的config/deviceType中定义不同的设备类型
D.在工程级别build-profile.json5定义多个product,在每个product的config/deviceType中定义不同的设备类型
- 答案 : C
52 . 应用开发中使用的各类资源文件,需要放入特定子日录中存储管理,以下关于资源说法错误的是
A.resfile目录,应用安装后,resfile资源会被解压到应用沙箱路径,通过Context属性resourceDir获取到resfile资源目录后,可通过文件路径访问。
B.base目录是默认存在的目录,一级子目录element用于存放字符串、颜色、布尔值等基础元素,media、profile存放媒体、动画、布局等资源文件.
C.stage模型多工程情况下,共有的资源文件放到AppScope下的resources日录。
D.rawfile目录,支持创建多层子目录,子目录名称可以自定义,文件来内可以自由放置各类资源文件。目录中的资源文件会被编译成一进制文件,并赋予资源文件ID。
- 答案 : D
53 . Harmonyos提供了多种包结构,每种包编译后的产物都不同,下面说法错误的是
A.hsp包编译后的产物是.hsp文件。
B.har包编译后的产物是.har文件。
C.app包编译后的产物是.app文件。
D.hap包编译后的产物是.hap文件。
- 答案: C
54 . 当使用状态变量进行ArkUI组件间数据通信的时候,如果两个组件间没有直接的嵌套关系(非父子和祖孙关系组件),但是他们又属于同一页面,最佳的装饰器应该选用哪个?
A.AppStorage
B.@State+@Link
C.@Provide+@Consume
D.LocalStorage
- 答案 : D
55 . 关于静态检查描述错误的是:
A.静态检查可以检测代码中的语法错误和潜在的逻辑错误,也支持检测代码在运行时现的错误,因此静态检查可以替代动态测试。
B.静态检查是指使用静态代码分析工具对软件的“静态”(不运行的)代码进行分析的一种方法,找出代码中潜在的漏洞。静态代码分析器检查源代码,找出特定的漏洞,并检查代码是否符合各种编码标准。
C.静态分析工具也在不断改进和升级。使用高级的静态分析工具可以提高代码检测的准确性和效率。例如,一些静态分析工具可以检测代码中的内存泄漏、死锁问题,从而提高代码的质量和可靠性。
D.HarmonyOS应用可以采用ARKTS静态检查工具Codelinter或者CodeArts工具来做静态代码分析。
- 答案 : A
56 . 在使用DevEco Studio的Profiler进行HarmonyOS应用性能优化的流程中,以下哪个步骤最恰当地描述了开发者利用Profiler工具进行性能问题识别、定位、优化及验证的完整过程
A. 仅通过创建深度分析任务,利用perf数据详细分析性能瓶颈,修改代码后,不需再进行验证直接发布应用
B. 在发现应用性能不佳时,直接查看代码逻辑,凭经验修改后,利用Profiler的“Realtime Monitor”确认资源消耗是否降低
C. 利用“Realtime Monitor”初步识别性能瓶颈,创建深度分析任务定位根因,根据分析结果优化代码,再用“Realtime Monitor”验证优化效果
D. 首先使用“Realtime Monitor”实时监控,观察应用资源消耗,一旦发现CPU或内存异常,直接修改代码并重新编译
- 答案:C
57.现有一个宽高分别为200px的XComponent组件,其绑定了一个XComponentControllen(XcContreller),依次进行如下操作:
(1)xcController,setXcomponentSurfaceRect( {fsurfacewidth: 150,
surfaceHeight:500})
(2)设置XComponent组件的padding力{top:5px,left:10px,bottom: 15px, right:20px}
(3)将XComponent组件大小政为300pxx300px
(4)给XComponent组件设置一个宽度为2px的边框
(5)xcController.setXcomponentsurfaceRect( { offsetx:-20,offsetY:50,surfacewidth:200,su-faceHeight:-100})之后,调用xccontroller.getxcomponentsurfaceRect()的返回值为
A.{offsetX:81, offsetY:-89,surfacewidth:150,surfaceHeight: 500 }
B.{offsetx-20,offsety:50,surfacewidth:200.surfaceHeight.500 }
C.{foffsetX:81,offsetY:-89,surfacewidth:200,surfaceHeight: 0 }
D.{offsetX:75,offsetY:-100,surfacewidth:150.surfaceHeight: 500 }
- 答案 D
58.开发者张工想要高效地管理Harmonyos设备中的文件,包括查看文件列表、进行文件搜索、新建及删除操作,以及在设备与PC间传输文件,而无需使用命令行工具。以下哪个选项最能准确概括张工能通过哪个一具直接在DevEco studio界面完成上述所有操作。
A. DevEco Studio的Proiect Explorer
B.DevEco Studio的Device File Browser
C.DevEco Studio的Terminal面板
D.DevEco Studio的Log面板
- 答案 B
59.通过aa工具拉起com.example.test的EntnyAbility,并传参给EntryAbility,具体参数是number类型的[key1,1] [key2,2]和string类型的[key3,teststring] [key4,''],那边下面那个aa 命令是正确的:
A. aa start -b com.example test -a EntryAbility --pi key1 1 --pi key2 2 --ps key3 testString --psn key4 "
B.aa start -b com.example.test -a EntryAbility --pi key1 1 -- pi key2 2 --ps key3 testString --psn key4
C.aa start -b com.example.test -a EntryAbility --pi key1 1 key2 2 --ps key3 testString --psn key4
D.aa start -b com,example.test -a EntryAbility pi key1 1 --pi key2 2 --ps key3 testString --ps key4
- 答案 B
60.某业务团队的架构师发现某个特性用的频率比较少,但是这个特性占用空间资源还是比较大的。为了减少首包“载体积,准备将该特性解耦出来,并对外提供API方便主模块调用。以下说法正确的是()
A.将该特性做成hap包,通过Ability组件暴露出来给主app使用
B.将该特性做成H5模块,通过web组件加载远程资源使用。
C.将该特性做成按需加载的hsp包,暴露接口给主模块使用
D.将该特性做成动态加载的har包,暴露接口给主模块使用
- 答案 C
61.以下关于应用架构技术选型说法不正确的是()
A.一些应用的扩展能力,比如备份、服务卡片,可以采用ExtensionAbility做成单独的feature HAP包,独立分发。
B.元服务和应用可以共用一个代码工程,采用多目标产物构建方式,构建出应用和元服务两个产物、用于上架。
C.随着业务的发展,应用功能会越来越多,某些功能可以做成动态加载,动态加载的模块采用HAR工程来构建,方便复用和共享。
D、对于初始版本的应用,功能比较简单,可以考虑采用单HAP加上多个HAR工程构建代码工程。
- 答案 C
62.开发者开发了一个应用,该应用只有一个hap包,其module.json5中abilities的配置如下所示,包含1个UIAbility(无Web组件)、1个FormExtensionAbility组件、1个WorkSchedulerExtensionAbility组件,那么该应用在运行过程中,最多会存在几个应用进程:
"abilities": [
{
"name" : "EntryAbility",
"srcEntry" : "./etc/entryability/EntryAbility.ts",
"description" : "$string:EntryAbility_desc",
"exported" : ture
}
],
"extensionAbilities": [
{
"name": "ClockFormExtensionAbility",
"srcEntrance": "./ets/form/ClockFormExtensionAbility.ts",
"type": "form"
},
{
"name": "TipWorkSchedulerExtensionAbility",
"srcEntrance": "./ets/service/TipWorkSchedulerExtensionAbility.ts",
"type": "workScheduler"
}
]
A. 2个
B. 3个
C. 1个
D. 4个
- 答案 B
63.开发者在编写ArkUI代码时,想要提前预览下所编写的组件的效果,下述哪个组件可以使用DevEco Studio Previewer正常
A. import { add } from 'libnative.so'; @Preview @Component struct NativeSample { count: number = add(1, 2); build() { Text(current count is ${this.count}
) } }
B. @Preview @Component struct TitleSample { @StorageProp('title') title: string = 'PlaceHolder'; build() { Text(this.title) } }
C. @Preview @Component struct ConsumeSample { @Consume name: string; build() { Text(this.name) } }
D. @Preview @Component struct LinkSample { @Link message: string; build() { Text(this.message) } }
- 答案 B
64.在使用DevEco Studio进行混合语言开发时,开发者小李通过Napi引用了Native 接口的文件(例如d.ts文件)。他想要直接从这些接口跳转到其对应的C/C++函数实现处进行代码审查。请从以下选项中选择最合适的操作步骤来帮助小李实现这一目标
A. 在声明或引用了Native接口的文件中,比如d.ts文件,小李可以直接选中接口名称,右键点击并在弹出的菜单中选择“Go To > Implementation(s)”(转到> 实现)。还可以使用快捷键Ctrl+Alt+B;如果是macOS用户,则使用Command+Option+B,直接跳转到对应的C/C++函数实现位置。
B. 小李应该打开包含TypeScript接口声明的文件,然后手动在项目中搜索相应的C/C++源文件,逐个检查以找到匹配的函数实现。
C. 为了查看C/C++函数实现,小李必须先切换到DevEco Studio的C/C++开发环境视图,之后在项目的资源管理器中找到对应的C/C++源文件手动打开,才能查看函数代码
D. 小李可以将鼠标光标置于想要查看实现的接口名称上,按下鼠标右键,在出现的上下文菜单中寻找并点击“Find Usages”(查找用法),在结果中筛选出C/C++的实现。
- 答案 A
65.项目中涉及多个类的继承与重写。为了快速实现子类对父类方法的重写,小华想利用DevEco Studio提供的便捷功能来提高开发效率。他了解到,通过一个特定的操作流程,可以直接依据父类的模板生成子类中需要重写的方法代码,而无需手动编写完整方法体,在DevEco Studio中,如何正确使用Override Methods功能来快速生成子类需要重写的方法代码
A. 通过菜单栏File > Settings,配置Override Methods快捷方式,之后在代码中仅需选中父类方法名,即可自动在子类中生成重写代码。
B. 将光标放置于任何代码行,按下Ctrl+B,然后在弹出菜单中选择Override Methods,之后勾选需要重写的方法并确认。
C. 将光标定位到子类的定义处,按下Ctrl+O(或右键单击选择Generate... > Override Methods),在弹出的对话框中选择要重写的方法,点击OK完成生成。
D. 在项目结构视图中找到目标子类,双击打开后直接在代码编辑区输入重写方法的签名,DevEco Studio将自动完成剩余代码。
- 答案 C
66.在编译构建HAP时,会从HAP模块及依赖的模块中收集资源文件,如果不同模块下的资源文件出现重名冲突时,会按照优先级进行覆盖,现在有一个HAP依赖了两个HAR,依赖配置如下所示:
// oh-package.json5 { "dependencies": { "dayjs": "^1.10.4", "lottie": "^2.0.0" } }
在资源覆盖时,以下优先级排序正确的是()
A. HAP包自身模块>lottie模块>dayjs模块>AppScope
B. AppScope>HAP包自身模块>lottie模块>dayjs模块
C. HAP包自身模块>dayjs模块>lottie模块>AppScope
D. AppScope>HAP包自身模块>dayjs模块>lottie模块
- 答案 D
67.张工在使用DevEco Studio开发Harmonyos应用时,遇到了代码编译警告和错误为了提高开发效率,哪一项正确描述了张上如何利用DevEco Studio的Quick Fix功能来有效管理和修复代码中的问题?
A.张工通过双击Shift键打开搜索框,输入"problems"打开问题工具面板,双击具体告警条目可直 接跳转到问题代码行。接着,将光标置于告警位置,利用弹出的悬浮窗选择合适的修复建议或 点击“More actions"以查看更多修复选项。
B.张工应该首先使用Ctl+Shitt+F快捷键全局搜索问题,然后手动在搜索结果中找出代码警告和 错误的原因及位置。
C.张工在代码编辑界面看到红色波浪线标记的错误时、直接右键点击错误代码,选择“Delete Line”以移除错误代码行,从而“修复”问题。
D.张工只需在代码编辑界面按下F1键,DevEco Studio会自动识别当前光标所在行的错误并直接修 复。
- 答案 A
68.下面持续交付&持续部署描述哪个是正确的:
A.在持续交付实践中,要考虑处理故障回滚和紧急修复,以确保系统在出现问题时能够快速恢复和 修复。
B.持续交付可以随时随地部署到生产环境
C.持续交付(CD,Continuous Delivery):指的是,频繁的将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。它强调的是,不管怎么更新,软件是随时随地可以交付的。
D.持续部署是将代码库中的任何更改都应该自动且快速地投入生产环境。持续部署等同于持续交付。
- 答案 C
69.关于代理提醒开发使用的接口是
A.使用startWork申请任务,使用stopWork取消任务,使用getWorkStatus获取任务状态
B.使用publishReminder发布一个提醒类通知,使用cancelReminder取消一个指定的提醒类通知
C.使用startBackgroundRunning申请任务,使用stopBackgroundRunning取消任务
D.使用requestSuspendDelay申请任务,使用getRemainingDelayTime获取任务剩余时间
- 答案 B
70.以下对系统兼容性的理解正确的是
A.已发布的系统能力有可能会发生非兼容性变更,比如新增特性或修改问题导致的行为不兼容,这种情况下应用需要关注changelog并进行适配。
B.应用不需要关注系统的兼容性变化,那都是系统开发人员需要关注的事情
C.安全法律法规等不可控因素会导致系统非兼容性变更,开发者需要积极适配
D.系统能力都会保持绝对的兼容性,不能因为任何非兼容性的修改而导致开发者成本上升
- 答案 A
71.Websocket连接开发步骤描述错误的是
A.调用Session.start方法开启metadata数据输出
B.(可选)订阅WebSocket的打开、消息接收、关闭、Error事件
C.创建一个WebSocket连接,返回一个WebSocket对象
D.根据URL地址,发起WebSocket连接
E.使用完WebSocket连接之后,主动断开连接
F.导入需要的webSocket模块
- 答案 A
72.关于自动化测试描述正确的是:
A.XTS子系统是认证测试套件的集合,当前包括acts(application compatibility test suite)应用兼容性测试套件,后续会拓展dcts(device compatibility test suite)设备兼容性测试套件等。
B.自动化测试因提高效率,减少重复工作的特性而被广泛采用;自动化测可以替代手动测试在处理复杂、难以预测的用户交互或特殊边界条件。
C.DT(开发者测试)就是UT,可看护的范围包括边界值问题、空指针或赋值错误,内部业务逻辑问题等等。
D.Fuzz测试就是通过构造不规则的输入,从而触发程序的某种bug;Fuzz测试属于白盒测试。Fuzz测试也叫做模糊测试,通过输入非法字段,并观察软件是否异常来实现。一方面可以通过向软件输入非法字段,另一方面也可以通过向网络服务发送异常报文。
- 答案 A
73.关于长时任务开发使用的接口是
A.使用requestSuspendDelay申请任务,使用getRemainingDelayTime获取任务剩余时间
B.使用startBackgroundRunning生请任务,使用stopBackgroundRunning取消任务
C.使用publishReminder发布一个提醒类通知,使用cancelReminder取消一个指定的提醒类通知
D.使用startWork申请任务,使用stopWork取消任务,使用getWorkStatus获取任务状态
- 答案 B
74.我们需要避免在逐帧调用的接口中执行耗时操作,下面哪个选项不属于上述的接口?
A.onAreaChange
B. onTouch
C.aboutToReuse
D.onScroll
- 答案 C
75 . 从桌面冷启动如下应用,点击Change
按钮5次,整个过程中,代码中的2条log
依次出现的次数,最初和最后画面上显示的[num=?]
的数字是
// PageOne.ets
@Component
export struct PageOneTmp {
@Consume('pageInfos') pageInfos: NavPathStack;
build() {
NavDestination() {
Column() {
Button( 'toPageTwo',{ stateEffect:true,type: ButtonType.Capsule })
.width( '80%')
.height(40)
.margin(20)
.onClick(() => {
this.pageInfos.pushPathByName( "pageTwo","")
})
Button('get',{ stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(()=>{
console.log('获取全部名为name的NavDestination页面的位置索引',
JSON.stringify(this.pageInfos.getIndexByName('pageOne')))
})
}
.width('100%')
.height('100%')
}
.title('pageOne')
.onBackPressed(()=>{
const popDestinationInfo =this.pageInfos.pop()
console.log('pop' + '返回值' + JSON.stringify(popDestinationInfo))
return true
})
}
}
export class Pages {
names: string =""
values:NavPathStack | null = null
}
@Builder
export function pageTwoTmp(info:Pages){
NavDestination(){
Column(){
Button( 'toPageOne',{stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() =>{
(info.values as NavPathStack)
.pushPathByName( 'pageOne', null)
})
}
.width('100%')
.height('100%')
}
.title('pageTwo')
.onBackPressed(() => {
(info.values as NavPathStack).pop()
return true
})
}
A. 2,4,1,2
B. 0,6,1,6
C. 1,5,1,6
D. 2,4,1,6
- 答案 A
76 . 已知下列代码PageOne
页面为navigation
中的某一子页面,依次点击PageOne
页面中toPageTwo
按钮,PageTwo
页面中toPageOne
按钮,此时获取当前页面的路由栈数量为多少
// PageOne.ets
@Component
export struct PageOneTmp {
@Consume('pageInfos') pageInfos: NavPathStack;
build() {
NavDestination() {
Column() {
Button('toPageTwo', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pageInfos.pushPathByName('pageTwo', "")
})
.width('100%')
.height('100%')
}
}
.title('pageOne')
.onBackPressed(() => {
const popDestinationInfo = this.pageInfos.pop()
console.log('pop' + '返回值' + JSON.stringify(popDestinationInfo))
return true
})
}
}
// PageTwo.ets
export class Pages {
names: string = ""
values: NavPathStack | null = null
}
@Builder
export function pageTwoTmp(info: Pages) {
NavDestination() {
Column() {
Button('toPageOne', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
(info.values as NavPathStack).pushPathByName('pageOne', null)
})
}
.width('100%')
.height('100%')
}.title('pageTwo')
.onBackPressed(() => {
(info.values as NavPathStack).pop()
return true
})
}
A. 2
B. 1
C. 4
D. 3
- 答案 D
77 . HarmonyOS
应用开发团队正着手优化一款面向全球市场的在线教育应用,该应用在特定课程直播环节出现了性能波动和响应延迟的问题,严重影响用户体验。打算利用DevEco Profiler
来进行性能优化。DevEco Profiler
其设计核心和主要优势是什么
A. DevEco Profiler
采用Bottom-Up
设计原则,从底层代码细节开始逐步构建性能模型
B. DevEco Profier
依据Top-Down
设计理念,通过高度整合的数据展示范式,提供从宏观到微观的性能数据分析,加速开发者定位和解决问题的过程
C. DevEco Profiler
专注于用户界面设计的美化,使开发者操作更为直观
D. DevEco Profler
主要是一个自动化修复工具,能自动检测并解决所有HarmonyOS
应用的性能问题
- 答案 B
78 . 在HarmonyOS
应用开发中,当开发者遇到需要分析Release
版本应用的崩溃或异常堆栈信息时,为了准确地将堆栈追踪信息对应到源代码的具体位置,以下哪个描述是正确的做法或理解
A. DevEco Studio
通过集成的Release
应用堆栈解析功能,自动利用构建时产生的so
文件、source map
文件、nameCache
文件等,无需额外操作即可直接在Release
应用中提供详细的源码级堆栈追踪信息
B. DevEco Studio
提供的Release
应用堆栈解析功能,要求开发者在遇到问题时,需上传构建产物中的特定文件(如so
、sourcemap
、nameCache
等)到指定工具或界面,借助这些文件辅助解析堆栈信息,实现从Release
堆栈到源码的映射,便于快速定位问题
C. 开发者需手动将Release
构建生成的so
文件与源代码进行映射,配合第三方工具进行堆栈信息还原,虽然过程繁琐,但最终能定位到问题代码位置
D. 因为Release
应用经过优化和去除Debug
信息,直接从堆栈跟踪到源代码行号是不可能的,开发者只能依靠日志信息手工推测问题所在
- 答案 B
79 . 项目需要同时进行应用和元服务的开发,并针对当前项目工程中的代码可以分别构建出应用和元服务的包,如何在DevEco Studio
中设置不同的构建配置达成这个目的
A. 修改工程级别的AppScope/app.json5
中的bundleType
值为atomicService
B. 在工程级别build-profile.json5
定义两个product
,将两个product
的bundleType
分别设置成app
和atomicService
C. 在模块级别build-profle.json5
定义两个target
,将两个target
的bundleType
分别设置成app
和atomicService
D. 修改工程级别的AppScope/app.json5
中的bundleType
值为app
- 答案 B
80. 下面的配置存在有几处错误()
app.json5配置文件:
{
"app": {
"bundleName": "com,example.myapplication",
"vendor": "example" ,
"versioncode": 1000000,
"versionName": "1.0.2",
"icon": "$media:app_icon",
"label": "$string:app_name",
"bundleType" : "app"
}
}
module.json5配置文件:
{
"module": {
"name" : "feature",
// ...
"atomicService":{
"preloads":[
{
"moduleName": "feature"
}
]
}
}
}
A. 2
B. 3
C. 1
D. 4
- 答案 A
81 . 一个应用的一个UIAbility
,其exported
字段配置为false
,以下哪个场景可以拉起这个UIAbility
A.caller
应用在后台,有START_INVISIBLE_ABILITY
权限
B.caller
应用在后台,申请了长时任务,有START_INVISIBLE_ABILITY
权限;
C.caller
应用在后台,有START_ABILITY_FROM_BACKGROUND
权限;
D.caller
应用在后台,申请了长时任务,有START_ABILITY_FROM_BACKGROUND
权限
- 答案 B
82 . 作为应用开发者,你使用hiAppEvent
订阅了崩溃事件。应用崩溃后,从onReceive
接口返回的AppEventInfo
中()属性可以获取崩溃调用栈信息
A. params
B. name
C. domain
D. eventType
- 答案 A
83 . ArkUI
组件复用的作用机制是减少了什么时间从而降低了丢帧率?
A. 组件节点渲染时间
B. 组件节点和对象的创建时间
C. 组件销毁时间
D. 数据挂载时间
- 答案 B
84 . ArkTS支持以下哪个函数
A. Object.hasOwnProperty();
B. Object.values();
C. Object.getOwnPropertyDescriptors();
D. Object.getOwnPropertyDescriptor();
- 答案 B
85.ArkTs支持以下哪些函数
A. Object.isPrototypeOf();
B. Object.keys();
C. Object.isExtensible();
D. Object.getOwnPropertySymbols();
- 答案 B
86.某App有A、B、C、D四个团队分别负责ModuleA、ModuleB、ModuleC和ModuleD四个业务模块,
着业务的发展,ModuleA需要跳转到ModuleB、ModuleC的页面,ModuleB需要跳转到ModuleC、ModuleD的界面,ModuleC需要跳转到ModuleA的界面,ModuleD需要跳转到ModuleB和ModuleC的界面。由于复杂的依赖关系,导致一旦有变化就需要知会各个团队,所以该团队的架构师想要解耦各个业务模块,以下哪些做法是不推荐的()
A.在RouterModule中采用路由表方式解耦各个业务模块。
B.采用静态import方式引入对应跳转的页面。
C.采用RouterModule作为中介者并用动态import解耦各个业务模块。
D.可以采用Navigation作为页面导航根容器,将其放在entry中,其他Module的页面作为Navigation的子页面。
- 答案 B
87.关于代码的门禁理解正确的是:
A.代码门禁是一项代码质量保障措施。目的是要求开发人员提交的代码必须满足一些要求才能合入代码仓库。门禁必须强制要求包括编译通过、单元测试覆盖率达标、代码静态检查无告警、全量功能测试里例、DFX专项测试都通过。
B.代码门禁则是在代码合并之前就验证代码来保护主干分支的完整性。通过这种方式,可以保护主分支代码避免因合码导致的构建中断,以确保 master分支代码始终是可部署的,并且不会因明显的错误而影响到你能在并行开发的同事工作。
C.门禁级检查的范围和版本级检查的范围保持一致,尽可能多的在MR门禁阶段就拦截防护住问题,保障问题可以及时清理掉。
D.标准 Cl构建是在代码合并后检查已提交代码的功能完整性,这种方法会导致代码合并到master后编译失败导致没有可用版本部署。通过提高滚动构建的频度就可以代替代码门禁、保障代码主干及时发现并解决问题。
- 答案 B
88.在使用DevEco studio的Profiler进行Harmony0s应用或服务内存管理优化时,以下哪个描述最准确地概述了“Allocation Insight”功能在识别和解决内存问题中的作用
A.Allocation Insight主要关注于内存碎片整理,减少内存分配的不连续性问题,对内存泄漏和溢出问题的检测不是其主要功能
B.Allocation-lnsight详细展示应用运行时的每条语句柄分配记录,便于开发者逐一检查内存使用但不提供内存泄漏的自动识别功能
C.Allocation Insight通过分析应用服务运行时的内存分配及使用情况,辅助定位内存泄漏、内存抖动和溢出问题,支持优化内存使用
D.Allocation Insight仅提供内存分配总量的概览,帮助开发者宏观了解内存使用趋势,但对于具体泄漏或抖动问题无能为力
- 答案 C
89.关于ArkUl的ForEach和LazyForEach,下列说法错误的是?
A.LazyForEach需要配合cachedCount和组件复用一起使用,以达到性能的最优表现。
B.ForEach和LazyForEach会根据定义的键值生成规则为数据源的每个数组项生成唯一键值,并创建相应的组件。
C.长列表滚动场景,优先使用ForEach。
D.当在滚动容器中使用了LazyForEach框架会根据滚动容器可视区域按需创建组件,当组件滑出可视区域外时,框架会进行组件销毁回收以降低内存占用,
- 答案 C
90.一个复杂的项目,该项目不仅包含主入口模块(Entry Module),还有多个特性的功能模块(Feature Modules/HSP),
并且这些模块间存在着相互调用关系。为了确保在调试过程中能够完整地测试所有交互逻辑,需要将涉及到的所有模块的HAP包都部署到目标设备上。请从以下选项中选择正确的操作步骤来配置DevEco Studio,以便一次性部署和调试项目中的多个模块
A.进入“Run >Edit Configurations"菜单在“Deploy Multi Hap”选项卡下,勾选“Deploy Multi Hap Packages”,随后在列表中选择需要部署的模块。
B.无需特殊配置,DevEco Studio会自动检测到项目中的所有模块依赖,并在每次调试运行时自动部署所有相关HAP包
C.在项目结构界面手动选择每个模块,单独编译并逐一将生成的HAP包通过HDC命令推送到设备上。
D.直接点击运行按钮,DevEco Studio会弹出对话框询问需要部署哪些模块,从中选择需要的模块后开始调试。
- 答案 A
91.当标记了@Reuseable的自定义组件实现了组件复用后,这个组件的复用范围是什么?
A.整个应用内都可以复用
B.标记了@Reuseable的自定义组件的父组件范围内
C.整个页面都可以复用
D.标记了@Reuseable的自定义组件的外层容器节点范围内
- 答案 B
92.当您开始开发一个应用/服务时,首先需要根据工程创建向导,创建一个新的工程,工具会自动生成对应的代码和资源模板。关于新建工程,下列选项说法正确的是?
A.Compatible SDK是兼容的最低API Version.
B.应用包名(Bundle name)必须为以点号(.)分隔的字符串,且至少包含三段,每段中仅允许使用英文字母、数字,如“com.example.myapplication".
C.工程文件本地存储路径(Save location)允许包含中文字符。
D.创建用于Lite Wearable设备的工程,可以选择Native C++工程模板。
- 答案 A
93.在使用DevEco Studio的Profiler进行HarmonyOS应用或服务性能分析时,面对应用出现卡顿、加载慢等性能瓶颈问题,以下哪个描述最贴切地说明了“Time场景分析任务”的功能及其对开发者优化流程的帮助
A.Time场景分析任务在应用运行时,通过显示所有函数执行的耗时排序列表,辅助开发者手动对比寻找耗时最短的函数进行优化
B.Time场景分析任务展示热点区域内的CPU和进程级调用栈耗时情况,支持代码跳转,助力开发者快速定位并优化耗时较长的代码段
C.Time场景分析任务专注于内存管理,帮助开发者监控应用内存泄漏,但对解决卡顿和加载耗时问题帮助有限
D.Time场景分析任务仅提供应用/服务运行时的CPU使用率概览,帮助开发者粗略判断性能瓶颈,但不提供深入分析
- 答案 B
94.开发者小张正在使用DevEco Studio开发一款HarmonyOS应用,他遇到了一个仅在应用实际运行环境中出现的问题,需要调试已部署在设备上的应用以定位问题根源,为了能够在应用已经运行的情况下介入调试,小张应该采用哪种调试方法
A.Run without Debugging,先让应用自由运行,随后手动附加调试器
B.使用Debug功能,将应用重新推包运行调试
C.Attach Debugger to Process,这允许他连接到正在运行的应用进程进行调试。
D.使用“Profile”功能,因为这同样能提供对运行时应用的监控与调试能力。
- 答案 C
95.关于延迟任务开发使用的接口是
A.使用requestSuspendDelay申请任务使用getRemainingDelayTime获取任务剩余时间
B.使用publishReminder发布一个提醒类通知,使用canceIReminder取消一个指定的提醒类通知
C.使用startBackgroundRunning申请任务,使用stopBackgroundRunning取消任务
D.使用startWork申请任务,使用stopWork取消任务,使用getWorkStatus获取任务状态
- 答案 D
96.一个应用项目工程中,模块依赖关系如下图所示,那么在最终编译结果.app文件中存在的编译产物是:
A. A.hap + D.hsp
B.A.hap+ B.har+ D.hsp
C.A.hap+B.har+C.har+ D.hsp
D.A.hap+D.hsp+C.har
- 答案 A
97.下面持续集成描述哪项是错误的:
A.Martin Fowler说过,”持续集成并不能消除Bug,而是让它们非常容易发现和改正。
B.持续集成在大型项目(有几十个项目组)也能应用,即便是项目组开发进度不统一也没问题
C.持续集成(Cl,Continuous Intergation)指频繁的,一天多次将代码集成到主干
D.持续集成就是持续编译,二者异曲同工
- 答案 D
98.Studio中创建Module,下列选项哪种方式是错误的?
A.鼠标移到工程目录顶部,单击鼠标右键,选择New>Module..,开始创建新的Module,此时该module将创建在工程根目录下。
B.选中工程目录中任意文件,然后在菜单栏选择File>New>Module.,开始创建新的Module,此时该module将创建在工程根目录下。
C.在工程根目录下创建一个新的Directory,可在该目录下单击鼠标右键,选择New>Module.,创建新的 Module,此时module将创建在该文件目录下。
D.在hvigor目录下,单击鼠标右键,选择New > Module....创建新的Module此时module将创建在该文件目录下,
- 答案 D
多选题
1 . hiAPPEvent
提供Watcher
接口,订阅到的系统事件,那些包含HiLog
日志
A. 卡死事件
B. 崩溃事件
C. 启动耗时事件
D. CPU高负载事件
- 答案:A B C D
2 . 用户购买商品后,你需要及时发放相关权益。但实际应用场景中,若出现异常将导致应用无法知道用户实际是否支付成功,从而无法及时发放权益,即出现调单情况,为了确保权益发放,你需要在以下那些场景检查用户是否存在已购未发货商品:
A. finishPurchase
请求返回1001860052-由于未拥有该商品,发货失败时
B. createPurchase
请求返回1001860051-由于已经拥有该商品,购买失败时
C. 应用启动时
D. createPurchase
请求返回1001860001-内部错误时
- 答案 : B C D
3 . 以下哪些方式可以实现ArkWeb同层渲染能力()
A.
web(...).enableNativeEmbedMode(true) .registerNativeEmbedRule("object", "test")
<object id="view" type="test/contents" width="100%" height="100%"style="background-color:red"/>
B.
Web(...).enableNativeEmbedMode(true)
<object id="view"type="native/contents"width="100%" height="100%"style="background-color:red"/>
C.
Web(...).enableNativeEmbedMode(true)
<embed id="view" type="native/contents" width="100%" height="100%" style="background-color:red"/>
D.
Web(...).enableNativeEmbedMode(true).registerNativeEmbedRule( "native", "test")
<object id="view"type="native/contents"width="100%"height="100%"style="background-color:red"/>
- 答案: C D
4 . 以下关于Taskpool和Worker的描述正确的是
A.Worker支持取消已发起的任务
B.Worker的任务执行时长上限是无限制
C.TaskPool不支持线程复用
D.TaskPool支持设置任务的优先级
- 答案: B D
5 . ArkTS是鸿蒙生态的应用开发语言。以下哪些选项是ArkTs的设计理念
A. ArkTS不支持null-satety特性。
B. 通过规范强化静态检查和分析,减少运行时的类型检查,从而降低了运行时负载,提升执行性能。
C. 通过规范强化静态检查和分析,使得许多错误在编译时可以被检测出来,降低代码运行错误的风险。
D. ArkTS保留了TS大部分的语法特性,帮助开发者更容易上手ArkTS。
- 答案 B C D
6 . 下面关于动态import描述正确的是
A. 动态import根据入参是否为常量字符串分为常量动态import和变量动态import两种
B. 动态导入import()是个异步接口,调用后将返回一个promise
C. HAR模块间只有变量动态import时可以进行模块解耦
D. 常量动态import也必须配置runtimeOnly选项
- 答案 A B C
7 . ArkTS是鸿蒙生态的应用开发语言。下列说法正确的是
A. ArKTS提供了声明式UI范式、状态管理支持等相应的能力,让开发者可以以更简洁、更自然的方式开发应用。
B. ArKTS在保持TypeScrpt(简称TS)基本语法风格的基础上,进一步通过规范强化静态检查和分析,使得在程序运行之前的开发期能检测更多错误,提升代码健壮性,并实现更好的运行性能。
C. TS/JS代码支持import ArkTS代码。
D. 针对JavaScript(简称JS)/TS并发能力支持有限的问题,ArkTS对并发编程API和能力进行了增强。
- 答案: A B D
8 . 下面关于Node-API数据类型描述正确的是
A. napi_status:是一个枚举数据类型,表示Node-API接口返回的状态信息
B. napi threadsafe_function_release_mode:该枚举类型定义了两个常量,用于指定线程安全函数的调用模式
C. napi_env:用于表示Node-API执行时的上下文
D. napi threadsafe_function_call_mode:该枚举类型定义了两个常量,用于指定在何时释放线程安全函数的回调函数
- 答案: A C
9 . 以下代码片段哪几处违反了ArkTS语法规范
function foo(value1:number,value2:number){
return value1 + value2;
}
foo();
foo(1, 2);
foo(1,2,3);
foo(1,2,3,4);
A. foo(1.2.3.4);
B.foo();
C.foo(1.2);
D.foo(1,2.3);
- 答案: A B D
10 . List组件onScrollIndex
事件触发时机是
A. List组件列表滚动时每帧触发
B. Llst组件滚动停止时触发
C. List组件首次加载完成时触发
D. List组件显示区域内第一个子组件或最后一个子组件或中间位置子组件索引值变化时触发
- 答案:C D
11 . 下面代码符合ArkTs编码规范的是
A.
let maxCount =10,iscompleted = false
let pointx, pointY;
pointX=10;pointY=0;
B.
let maxCount = 10;
let isCompleted = false;
let pointX=0;
let pointY =0;
C.
for(let idx=0;idx<5;++idx)
console.log(idx);
D.
if(condition) {
console.log('success');
}
- 答案:B D
12 . 在ArkTS ,以下那些声明类的方式是正确的
class C1{
value:number = 0
}
class C2 {
value:number;
constructor(value:number) {
this.value = value
}
}
class C3{
constructor(value:number) {
this.value = value
}
}
class C4{
value:number;
}
A:C1
B:C2
C:C3
D:C4
- 答案 :A B
13 . 以下关于LocalStorage
的说法正确有哪些?
A. 被@Component
装饰的组件最多可以访问一个LocalStorage
实例和AppStorage
,未被@Entry
装饰的组件不可被独立分配LocalStorage
实例,只能接受父组件的LocalStorage
实例。
B. LocalStorage
中的所有属性都是不可变的。
C. 组件树的根节点,即被@Entry
装饰的@Component
, 可以被分配一个LocalStorage
实例,此组件的所有子组件实例将自动获得对该LocalStorage
实例的访问权限。
D. 应用程序可以创建多个LocalStorage
实例,LocalStorage
实例可以在页面内共享,也可以通过GetShared
接口,获取在UIAbility
里创建的GetShared
,实现跨页面、UIAbility
内共享
- 答案 : A C D
14 . 在开发过程中,我们可以将每个功能模块作为一个独立的Module进行开发。关于Module,下列选项说法正确的是?
A.Static Library:静态共享库。HAR中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝。
B.Shared Library:动态共享库。HSP中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份。
C.entry类型的Moduie:应用的主模块,包含应用的入口界面、入口图标和主功能特性,编译后生成enty类型的HAP,每一个应用分发到周一类型的设备上的应用程序包,可以包含一个或多个entry类型的HAP。
D.feature类型的Module:应用的动态特性模块,编译后生成feature类型的HAP。一个应用中可以包含一个或多个feature类型的HAP,也可以不包含。
- 答案:A B D
15 . 使用ArkUI组件复用之后,还是没有显著提升列表滑动场景的性能,属于组件复用未生效可能的原因有?
A.在aboutToReuse回调函数中更新了冗余的状态变量
B.页面嵌套了过多自定义组件。
C.复用的自定义组件中使用if等条件渲染语句导致结构不相同,未使用reuseld标记
D.没有在aboutToReuse更新关联的状态变量数据。
- **答案:**A B C
16 . 以下代码片段哪几处违反了ArkTS语法规范,
function foo(value:number){
return value;
}
foo('');
foo(0);
foo(undefined);
foo(null);
A. foo('');
B. foo(null);
C. foo(undefined);
D.foo(0);
- 答案:A B C
17 . 下面关于混淆规则描述正确的是
A. --disable-obfuscation:关闭所有混淆
B. -enable-export-obfuscation:开启直接导入或导出的类或对象的名称和属性名混淆
C. -enable-property-obfuscatlon:开启顶层作用域名称混淆
D. -enable-toplevel-obfuscation: 开启属性混淆
- 答案: A B
18 . 应用开发的有些场景中,如果希望根据条件导入模块或者按需导入模块,可以使用动态导入代替静态导入,下面导入场景中适合使用动态import的是
A.当静态导入的模块很明显的占用了大量的系统内存且被使用的可能性很低。
B.当静态导入的模块很明显的降低了代码的加载速度且被使用的可能性很低,或者并不需要马上使用它。
C.当被导入的模块,在加载时并不存在,需要异步获取。
D.当被导入的模块说明符,需要动态构建。
- 答案: A B C D
19 . ArkTS对并发编程API和能力进行了增强,以下描述正确的是
A. CPU密集型任务场景中,当任务不需要长时间(3分钟)占据后台线程,而是一个个独立的任务时,推荐使用TaskPool进行开发。
B. 单次I/〇任务的开发场景中,必须使用TaskPool进行开发。
C. 默认情况下,Sendable数据在ArKTS并发实例间(包括主线程、TaskPool&Worker工作线程)传递的行为是拷贝传递。
D. 在并发API的形式上,目前主要有两种:Worker和TaskPool。
- 答案: A D
20 . 在基于Stage模型开发的应用项目代码下,每个模块都存在一个module.json5配置文件,用于配置模块的基本信息,以下module.json5配置文件正确的是
A.
{
"module": {
"name": "cName",
"type": "hsp",
"description": "$string:desc",
"deviceTypes": [
"default",
"tablet"
],
"deliveryWithInstall": true,
"pages": "$profile:main_pages"
}
}
B.
{
"module": {
"name": "bName",
"type": "shared",
"deviceTypes": [
"default",
"tablet"
],
"deliveryWithInstall": true,
"pages": "$profile:main_pages"
}
}
C.
{
"module": {
"name": "application",
"type": "feature",
"description": "$string:module_desc",
"mainElement": "ApplicationAbility",
"deviceTypes": [
"default",
"tablet"
],
"deliveryWithInstall": true,
"installationFree": false,
"pages": "$profile:main_pages",
"abilities": [
{
"name": "ApplicationAbility",
"srcEntry": "./ets/applicationability/ApplicationAbility.ets",
"description": "$string:ApplicationAbility_desc",
"icon": "$media:icon",
"label": "$string:ApplicationAbility_label",
"startWindowIcon": "$media:startIcon",
"startWindowBackground": "$color:start_window_background",
"exported": true
}
]
}
}
D.
{
"module": {
"name": "aName",
"type": "har",
"deviceTypes": [
"default", "tablet" ]
}
}
- 答案:B C D
21 . 小华正在使用DevEco studio开发一个复杂的Harmonyos应用,他意识到代码中有一段逻辑被多次重复使用,为了优化代码结构和减少几余,他决定将这段逻辑提取出来作为一个独立的方法。同时,他也注意到有些常用的硬编码值可以抽象为常量,以提高代码的可读性和维护性。小华希望利用DevEco studio的代码重构功能来高效完成这些任务,通过以下哪些操作来实现代码重构,以提升编码效率
A. 选中需要重构的代码块,右键点击选择“Refactor”,然后选择“Extract Method"来将代码块转换为一个新的函数/方法
B. 如果小华识别到一组相关的对象字面值可以抽象为一个接口,他可以直接通过“Refactor"菜单中的"Extract Iinterface”功能实现
C. 为了简化复杂类型的多次书写,小华可以选择特定类型字面量,通过“Refactor"菜单下的"Extrac Type Alias”来创建类型别名
D. 若需要将局部变量提升为类成员变量,小华只需简单选中变量名,右键选择“Refactor”->“Promote Local Variable
- 答案: A B
22 . 下面关于混淆的描述正确的是
A. 支持顶层作用域名称、属性名称、文件名称等多种混淆功能
B.修改应用混淆配置、新配置需要重新全量编译应用才能生效
C.在工程build-profile.json5中的obfuscation.ruleOptions,.fies字段中配置该工程的混淆配置,该配置仅在编译该工程时生效。
D.可以在HAR模块工程的build-profile.json5中的obfuscation.consumerfiles字段中配置导出的混淆配置,该配置仅在编译依赖该HAR的模块时生效
- 答案: A B
23 . 依次点击abcd 按钮 其中不会触发UI刷新的
@Entry
@Component
struct Index
{
@State count: number = 0;
@State @Watch('onValueChange') value: number = 50;
onValueChange() {this.count = this.value;}
build()
{
Column()
{
Text(`${this.count}`)
Button("A")
.onClick(() => {
this.count = 0;
})
Button("B")
.onClick(()=>{
for (let i = 0; i < 1000; i++) {
this.count = i
}
for (let i = 1000; i >0 ; i--) {
this.count = i;
}
this.count--
})
Button("C").onClick(()=>{
this.value = 100
})
Button("D")
.onClick(()=>{
setInterval(()=>{
this.count++
},1000)
})
}
}
}
A. A
B. B
C. C
D. D
- 答案: A B
24 . 如下ABC 3处手势,有机会执行的是哪几处
@Entry
@Component
struct ListTest {
scroller: Scroller = new Scroller()
scroller2: Scroller = new Scroller()
scroller3: Scroller = new Scroller()
private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
private childRecognizer: GestureRecognizer = new GestureRecognizer()
private currentRecognizer: GestureRecognizer = new GestureRecognizer()
private lastOffset: number = 0
build() {
Stack({ alignContent: Alignment.TopStart }) {
Scroll(this.scroller) {
Column() {
Text("Scroll Area")
.width('90%')
.height(150)
.backgroundColor(0xFFFFFF)
.borderRadius(15)
.fontSize(16)
.textAlign(TextAlign.Center)
.margin({ top: 10 })
List({ space: 20, initialIndex: 0 }) {
ForEach(this.arr, (item: number) => {
ListItem() {
Text('' + item)
.width('100%')
.height(100)
.fontSize(16)
.backgroundColor(Color.Blue)
.textAlign(TextAlign.Center)
.borderRadius(10)
}
}, (item: string) => item)
}
.listDirection(Axis.Vertical) // 排列方向
.scrollBar(BarState.Off)
.friction(0.6)
.divider({
strokeWidth: 2,
color: 0xFFFFFF,
startMargin: 20,
endMargin: 20
}) // 每行之间的分界线
.edgeEffect(EdgeEffect.None) // 边缘效果设置为Spring
.height(1000)
.width('90%')
.id("inner")
}.width('100%')
}
.id("outer")
.height(600)
.scrollable(ScrollDirection.Vertical) // 滚动方向纵向
.scrollBar(BarState.On) // 滚动条常驻显示
.scrollBarColor(Color.Gray) // 滚动条颜色
.scrollBarWidth(10) // 滚动条宽度
.edgeEffect(EdgeEffect.None)
.onScroll((xOffset: number, yOffset: number) => {
console.info(xOffset + ' ' + yOffset)
})
.onScrollEdge((side: Edge) => {
console.info('To the edge')
})
.onScrollStop(() => {
console.info('Scroll Stop')
})
}
}
}
A.
.gesture(
TapGesture({ count: 2 })
.onAction((event: GestureEvent) => {
if (event) {
this.value = JSON.stringify(event.fingerList[0])
}
})
)
B.
.gesture(
PanGesture({PanDirection.Vertical})
.onActionUpdate((event: GestureEvent)=>{
console.log("zcb onActionUpdate event offsetY " + event.offsetY + " this.lastOffset " + this.lastOffset + " this.childRecognizer.getGestureState() " + this.childRecognizer.getState())
})
)
C.
.parallelGesture(
PanGesture({PanDirection.Vertical})
.onActionUpdate((event: GestureEvent)=>{
console.log("zcb onActionUpdate event offsetY " + event.offsetY + " this.lastOffset " + this.lastOffset + " this.childRecognizer.getGestureState() " + this.childRecognizer.getState())
})
)
- 答案:A C
25 . 一个应用通常会包含多种功能,将不同的功能特性按模块来划分和管理是一种良好的设计方式。在开发过程中,我们可以将每个功能模块作为一个独立的Module进行开发,下面关于Module的说法正确的是
A.feature类型的Module,应用的动态特性模块,一个应用中可以包含一个或多个feature类型的模块,也可以不包
B.Library类型的Module,用于实现代码和资源的共享,有两种类型,分别为Static Library和Shared Library两种类型
C.Ability类型的Module,用于实现应用的功能和特性,有两种类型,分别为entry和feature。
D.entry类型的Module,是应用的主模块,一个应用只能包含唯一个entry类型的HAP。
- 答案:A B C
26 . 在大型软件工程中,一般会伴随着多团队开发,各团队开发自己的业务模块,最后再由集成交付团队集成到一起。下面哪些是大应用模块化开发最佳实践
A.若多个模块依赖了不同版本的HAR,使用OHPM的overrides机制配置指定使用哪个版本的HAR,以减少包大小。
B.避免用户首次下载应用耗时过长,及过多占用用户空间,不常用功能做成按需加载。
C.一次上架多端部署。
D.使用路由表进行模块间解耦。
- 答案:A B C D
27 . 以下代码片段哪几个函数违反了ArkTS语法规范
A.
function foo1(value1?:number,value2:number){
if (value1 == undefined) {
return value2
}
return value1+value2
}
B.
function foo2(value1:number,value2?:number){
if (value2 == undefined) {
return value1
}
return value1+value2
}
C.
function foo3(value:number,...array:number[]){
return value
}
D.
function foo4(...array:number[],value:number){
return value
}
- 答案: A D
28 . 下面代码符合ArKTS编程规范的是
A.
if (isJedi){
fight();
}
B.
const arr = [1,2,3]
C.
if (flag){
//...
}else {
//...
}
D.
function fight():void{
console.log('Swooosh!');
}
- 答案 : A B C D
29 . 为了加快构建速度,提高开发效率,可以如何调整hvigor配置,从而优化构建速度
A.启用hvigor的incremental,在增量场景下检查任务是否可以跳过
B.启用hvigor的typeCheck,在增量场景下进行对hvigorfile.ts进行类型检查
C.启用hvigor的parallel,在增量场票下进行并行编译处理
D.启动hvigor的daemon模式,在增量场景下复用缓存
- 答案 A C D
30 . 下面关于方舟字节码文件格式描述正确的是
A.方舟字节码文件中数据类型uint32_t表示32-bit无符号整数,采用大端字节序
B. 方舟字节码文件中不包含字节码文件内容的adler32校验和
C.方舟字节码文件是ArKTS/TS/JS编译后的二进制产物
D.方舟字节码文件中数据类型uint16_t表示16-bit无符号整数,采用小端字节序
- 答案:C D
31 . Image组件以下哪些方式可显示图片?
A.
import image from '@ohos.multimedia.image'
@Entry
@Component
struct ImageExample {
@State imagePixelMap: image.PixelMap | undefined = undefined
async aboutToAppear() {
this.imagePixelMap = await this.getPixmapFromMedia($r('app.media.app_icon'))
}
build() {
Column() {
Image(this.imagePixelMap)
.width(200)
.height(200)
}
}
private async getPixmapFromMedia(resource: Resource) {
let unit8Array = await getContext(this)?.resourceManager?.getMediaContent({
bundleName: resource.bundleName,
moduleName: resource.moduleName,
id: resource.id
})
let imageSource = image.createImageSource(unit8Array.buffer.slice(0, unit8Array.buffer.byteLength))
let createPixelMap: image.PixelMap = await imageSource.createPixelMap({
desiredPixelFormat: image.PixelMapFormat.RGBA_8888
})
await imageSource.release()
return createPixelMap
}
}
B.
@Entry
@Component
struct ImageExample {
build() {
Column({ space: 10 }) {
Image("https://www.example.com/xxx.png")
.width(100)
.height(100)
}
}
}
C.
@Entry
@Component
struct ImageExample {
build() {
Column({ space: 10 }) {
Image($r('app.media.earth'))
.width(100)
.height(100)
}
}
}
D.
import { DrawableDescriptor } from '@ohos.arkui.drawableDescriptor'
@Entry
@Component
struct ImageExample {
private resManager = getContext().resourceManager
build() {
Row() {
Column() {
Image((this.resManager.getDrawableDescriptor($r('app.media.drawable').id) as DrawableDescriptor))
}.height('50%')
}.width('50%')
}
}
- 答案:A B C D
32 . 以下代码片段哪几处违反了ArkTS语法规范。
class Point {
public x: number
public y: number
constructor(x: number, y: number) {
this.x = x
this.y = y
}
}
let p = new Point(1.0, 1.0);
delete p.x;
p.z = 2.0;
p.x = 'Hello!';
A.p.z = 2.0;
B.let p = new Point(1.0, 1.0);
C.delete p.x;
D.p.x = 'Hello!';
- 答案:A C D
33 . Code Linter针对ArkTS/TS代码进行最佳实践/编程规范方面的检查,最佳实践/编程规范方面的检查规则可以配置,针对codelinter的配置项一下哪些说法是正确的
A. ruleSet:配置检查使用的规则集,规则集支持一次导入多条规则。
B. ignore:配置无需检查的文件目录,其指定的目录或文件需使用相对路径格式,相对于code-linter.json5所在工程根目录,例如:build/**/*
。
C. files:配置待检查的文件名单,如未指定目录,规则适用于所有文件,例如:["**/*.ets","**/*.js","**/*.ts"]
。
D. rules:可以基于ruleSet配置的规则集,新增额外规则项,但是无法修改ruleSet中规则默认配置
- 答案:A B C
34 . 当前动态import支持导入的模块类型有哪些?
A. 动态import支持加载HSP模块
B.动态import支持加载本地HAR模块
C.动态import支持加载OHPM模块
D.动态import支持加载远程HAR模块
- 答案 : A B C D
35 . 下面关于ArkTs中import用法,正确的是
A. import * as name from "ets file name"
B. import { export1 as alias1 } from "ets file name".
C.import defaultExport from "ets file name"
D. import {export1 } from "ets file name" ;
- 答案 : A B C D
36 . 下面关于方舟字节码指令含义说明正确的是
A.假设寄存器v0存放了对象A,寄存器v1存放了对象B,那么执行指令"mov v0,v1"后,v0存放对象B,v1存放对象B
B.假设寄存器v0存放了对象A,累加器(acc)存放了对象B,那么执行指令"lda v0"后,v0存放对象B,acc存放对象B
C.假设寄存器v0存放了对象A,累加器(acc)存放了对象B,那么执行指令"lda v0"后,v0存放对象A,acc存放对象A
D.假设寄存器v0存放了对象A,寄存器v1存放了对象B,那么执行指令"mov v0,v1"后,v0存放对象A,v1存放对象A
- 答案:A C
37.哪些是持续集成最佳实践?
A.频繁提交代码:鼓励开发人员经常提交小的代码更改,以便更快地发现问题。
B.自动化构建:确保构建过程是完全自动化的,减少人为错误。
C.快速反馈机制:让开发人员能迅速得知集成结果和测试状态。
D.构建相同代码的 Pipeline 运行多次,得到结果不同。比如,基于同一代码基线,一条 Pipeline构建了5 次,只要最后一次通过即可。
E.通常项目上会有一个专职 Ops,在项目可以发布的时候手动触发部署流程,或者需要传递很多参数,让 Pipeline 运行起来。
F.代码审查:在集成前进行代码审查,及时发现潜在问题
G.全面的测试套件:包括单元测试、集成测试、功能测试等、以提高代码质量。
- 答案 ABCFG
38.哪些是持续部署最佳实践?
A.环境一致性:保持开发、测试、生产等环境的高度一致性。
B. 自动化部署流程:从代码提交到部署的整个流程应尽可能自动化。
C.手工配置管理:
1、直接修改生产环境上的沉置来改变系统配置:
2、集群中各节点的行为有所不同:
3、靠人手工恢复环境。手动记载配置包括操作系统、应用服务器、关系型数据库管理系统Web服务器或其他基础设施设置。
D.监控和回滚机制:实时监控部署后的应用状态,如有问题及时回滚。
E.开发完成之后再向类生产环境部署:当软件被第一次部署到类生产环境(比如试运行环境)时,就是大部分开发工作完成时,至少是开发团队认为“该软件开发完成了”
F.灰度发布:先在小部分用户或区域进行部署,观察没问题后再全面推广
G.手工部署:持续部署可以采用手工部署的方式发布软件:
1、有一份非常详尽的文档,该文档描述了执行步骤及每个步骤中易出错的地方
2、以手工测试来确认该应用程序是否运行正确:
3、在发布时,常常会修正一些在发布过程中发现的问题。
- 答案 ABDF
39.Harmonyos应用开发者小张,正在利用DevEcostudio进行一款复杂应用的UI界面调试。小张了解到ArkUI Inspector是DevEco studio内置的一项强大工具,能够显著提升UI调试效率。基于ArkUl Inspector的特性描述,下列哪些描述是正确的
A.UI快照管理:支持导出应用的U1界面为快照图片,并允许这些快照被导入回ArkUlInspector中,便于离线分析或分享讨论UI设计方案
B.UI效果查看:开发者能够查看连接真机上运行的应用程序的UI显示效果,页面组件树结构,以及选中组件的属性信息
C.性能监控:提供详细的UI渲染性能指标,帮助开发者识别布局瓶颈和渲染效率问题,从而优化应用性能
D.交互式组件选择:用户既可以在组件树视图中选择组件,使UI界面上对应组件高亮显示并展示其属性详情,也可以直接在以布局显示界面上点士选择组件
- 答案 AB
40.通过如下openLink的接口启动,如下哪些配置的UIAbility不可能被拉起
import { hilog } from '@kit.PerformanceAnalysisKit';
import { UIAbility, common, OpenLinkOptions } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
export default class MyAbility extends UIAbility {
onForeground() {
let link: string = "https://www.example.com"
let openLinkOptions: OpenLinkOptions = {
appLinkingOnly: true,
parameters: {demo_key: "demo_value"}
};
try {
this.context.openLink(
link,
openLinkOptions,
(err, result) => {
hilog.error(DOMAIN, TAG, 'openLink callback error.code:' + JSON.stringify(err));
}
).then(()=>{
hilog.info(DOMAIN, TAG, 'open link success.');
}).catch((err: BusinessError)=>{
hilog.error(DOMAIN, TAG, 'open link failed, errCode ' + JSON.stringify(err.code));
})
}
catch (e) {
hilog.error(DOMAIN, TAG, 'exception occured, errCode ' + JSON.stringify(e.code));
}
}
}
A.
{
"name": "TargetAbility",
"skills": [
{
"actions":[
"ohos.want.action.sendData",
],
"entities":[
"entity.system.browsable",
],
"uris":[
{
"scheme": "http",
"host": "www.test.com",
"port": "8080",
"path": "path",
"autoVerify": ture
}
]
}
]
}
B.
{
"name": "TargetAbility",
"skills": [
{
"actions":[
"ohos.want.action.viewData",
],
"entities":[
"entity.system.browsable",
],
"uris":[
{
"scheme": "https",
"host": "www.test.com",
"port": "8080",
"path": "path",
"autoVerify": ture
}
]
}
]
}
C.
{
"name": "TargetAbility",
"skills": [
{
"actions":[
"ohos.want.action.sendData",
],
"entities":[
"entity.system.browsable",
],
"uris":[
{
"scheme": "https",
"host": "www.test.com",
"port": "8080",
"path": "path",
"autoVerify": ture
}
]
}
]
}
D.
{
"name": "TargetAbility",
"skills": [
{
"actions":[
"ohos.want.action.vieData",
],
"entities":[
"entity.system.browsable",
],
"uris":[
{
"scheme": "http",
"host": "www.test.com",
"port": "8080",
"path": "path"
}
]
}
]
}
- 答案 ACD
41.以下哪些是可以在Navigation中使用pushPathByName接日传递的params的参数类型
A. map<string,string>
B. string
C.record<string,string>
D.arrayBuffer
、
- 答案 B C D
42.如何实现类似下图布局
A.
@Entry
@Component
struct Demo {
// 忽略其他辅助代码
dataSource: ItemDataSource = new ItemDataSource(100)
itemHeightArray: number[] = []
colors: number[] = [0xFFC0CB, 0xDA70D6, 0x6B8E23, 0x6A5ACD, 0x00FFFF, 0x00FF7F]
scroller: Scroller = new Scroller()
aboutToAppear() {
this.getItemSizeArray()
}
build() {
Scroll() {
Column() {
Grid() {
GridItem() {
Text('GoodsTypeList')
}
.backgroundColor(this.colors[0])
GridItem() {
Text('AppletService')
}
.backgroundColor(this.colors[1])
GridItem() {
Text('ReloadData')
}
.backgroundColor(this.colors[2])
}
.rowsGap(10)
.columnsTemplate('1fr')
.rowsTemplate('1fr 1fr 1fr')
.width('100%')
.height(100)
.margin({
top: 10,
left: 5,
bottom: 10,
right: 5
})
Grid() {
LazyForEach(this.datasource, (item: number) => {
GridItem() {
// 使用可复用自定义组件
ReusableItem({ item: item })
}
.width('100%')
.height(this.itemHeightArray[item % 100])
.backgroundColor(this.colors[item % 5])
}, (item: number) => '' + item + this.itemHeightArray[item % 100])
}
.columnsTemplate("1fr 1fr")
.columnsGap(10)
.rowsGap(5)
.width('100%')
.nestedScroll({
scrollForward: NestedScrollMode.PARENT_FIRST,
scrollBackward: NestedScrollMode.SELF_FIRST
})
}
}
.scrollBar(BarState.Off)
.edgeEffect(EdgeEffect.None)
}
}
B.
@Entry
@Component
struct Demo {
// 忽略其他辅助代码
dataSource: ItemDataSource = new ItemDataSource(100)
itemHeightArray: number[] = []
colors: number[] = [0xFFC0CB, 0xDA70D6, 0x6B8E23, 0x6A5ACD, 0x00FFFF, 0x00FF7F]
scroller: Scroller = new Scroller()
aboutToAppear() {
this.getItemSizeArray()
}
build() {
Column() {
List({ scroller: this.scroller, space: 10 }) {
ListItem() {
Grid() {
GridItem() {
Text('GoodsTypeList')
}.backgroundColor(this.colors[0])
GridItem() {
Text('AppletService')
}.backgroundColor(this.colors[1])
GridItem() {
Text('ReloadData')
}.backgroundColor(this.colors[2])
}
.rowsGap(10)
.columnsTemplate('1fr')
.rowsTemplate('1fr 1fr 1fr')
.width('100%')
.height(100)
}
ListItem() {
WaterFlow() {
LazyForEach(this.datasource, (item: number, index: number) => {
FlowItem() {
// 使用可复用自定义组件
ReusableItem({ item: item + index })
}
.width('100%')
.height(this.itemHeightArray[item % 100])
.backgroundColor(this.colors[item % 5])
}, (item: number) => '' + item + this.itemHeightArray[item % 100])
}
.id('waterflow')
.columnsTemplate("1fr 1fr")
.columnsGap(10)
.rowsGap(5)
.width('100%')
.height('100%')
.nestedScroll({
scrollForward: NestedScrollMode.PARENT_FIRST,
scrollBackward: NestedScrollMode.SELF_FIRST
})
}
}
.scrollBar(BarState.Off)
.edgeEffect(EdgeEffect.None)
}
.width('100%')
.padding({ left: 10, right: 10 })
}
}
C.
@Entry
@Component
struct Demo {
// 忽略其他辅助代码
dataSource: ItemDataSource = new ItemDataSource(100)
itemHeightArray: number[] = []
colors: number[] = [0xFFC0CB, 0xDA70D6, 0x6B8E23, 0x6A5ACD, 0x00FFFF, 0x00FF7F]
scroller: Scroller = new Scroller()
@State sections: WaterFlowSections = new WaterFlowSections()
sectionMargin: Margin = { top: 10, left: 5, bottom: 10, right: 5 }
oneColumnSection: SectionOptions = {
itemsCount: 3,
crossCount: 1,
rowsGap: 10,
margin: this.sectionMargin,
onGetItemMainSizeByIndex: (index: number) => {
return this.itemHeightArray[index % 100]
}
}
lastSection: SectionOptions = {
itemsCount: 97,
crossCount: 2,
margin: this.sectionMargin,
onGetItemMainSizeByIndex: (index: number) => {
return this.itemHeightArray[index % 100]
}
}
aboutToAppear() {
this.setItemSizeArray()
// 初始化瀑布流分组信息
let sectionOptions: SectionOptions[] = []
sectionOptions.push(this.oneColumnSection)
sectionOptions.push(this.lastSection)
this.sections.splice(0, 0, sectionOptions)
}
build() {
WaterFlow({ scroller: this.scroller, sections: this.sections }) {
LazyForEach(this.dataSource, (item: number) => {
FlowItem() {
ReusableFlowItem({ item: item })
}
.width('100%')
.backgroundColor(this.colors[item % 5])
}, (item: string) => item)
}
.columnsGap(10)
.rowsGap(5)
.backgroundColor(0xFAEEE0)
.width('100%')
.height('100%')
}
}
- 答案 B C
43.在使用DevEco studio进行Harmonyos应用开发和调试过程中,开发者小张遇到应用运行时意外终止的情况,他需要快速定位并解决导致应用崩溃的问题。以下哪些做法可以帮助小张有效分析和处理这些问题
A. 利用系统自动生成的FaultLog,包括AppFreeze、Cpp Crash、JS Crash、System Freeze和ASan报告,这些报告会详细记录故障发生时的环境、堆械信息和可能的故障原因,是排查问题的重要参考
B:若遇到App运行卡顿或系统整体无响应(App Freeze,System Freeze)的情况;可以通过性能分析工具中的Frame insight和Allocation insight功能,分析应用的资源清耗情况,寻找可能的瓶颈
C.查看DevEco Studio log工具栏输出的错误日志,根据日志提示分析应用崩溃的具体原因及代码位置
D.当怀疑问题是由于C++代码中的内存错误(如数组越界、内存泄露、重复释放内存)引起时,进入"Run/Debug Configurations"设置界面,勾选启用Addres Sanitizer (Asan),然后重新部署应用进行测试以获取更详细的内存问题报告
- 答案 A D
44.使用如下的代码去启动一个ability时,哪种skills定义的组件能够被匹配到
let want = {
"uri" : "https://www.test.com:8080/query/books",
"type" : "text/plain"
}
context.startAbility(want).then((data))=> {
console.log(TAG + "startAbility success");
}).catch((err))=> {
console.log(TAG + "startAbility failed.");
}
A.
"skills": [
{
"uris":[
{
"scheme": "https",
"type" : "text/*"
}
]
}
]
B.
"skills": [
{
"uris":[
{
"scheme": "https",
"host": "www.test.com",
"pathStartWith" : "query/books",
"type" : "text/plain"
}
]
}
]
C.
"skills": [
{
"uris":[
{
"scheme": "https",
"host": "www.test.com",
"type" : "text/plain"
}
]
}
]
D.
"skills": [
{
"uris":[
{
"scheme": "https",
"host": "www.test.com",
"pathStartWith" : "query/books",
"type" : "text/*"
}
]
}
- 答案 A B C D
45.某个应用的启动框架配置文件详细信息如下,以下说法正确的是:
{
"startupTasks":[
{
"name":"startupTask 001",
"srcEntry":"./ets/startup/StartupTask 001.ets",
"dependencies":[
"StartupTask 002",
"StartupTask 003"
],
}
}
A.StartupTask_003会在StartupTask_004之后执行
B.StartupTask_006会在AbilityStage的onCreate前初始化完成
C.StartupTask 001会在StartupTask 004之后执行;
D.StartupTask005会在主线程执行
- 答案 B C D
46.下列代码符合Node-API开发规范的是
A.
static napi_value Demo3(napi_env env, napi_callback_info info)
{
size_t argc=2;
napi_value argv[2]={nullptr};
napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr);
// 业务代码
return nullptr;}
B.
static napi value Demol(napi_env env, napi_callback_info info)
{
size_t argc;
napi_value argv[10]={nullptr};
napi_get_cb_info(env, info,&argc, argv, nullptr, nullptr);
return nullptr;}
C.
static napi value Demo4(napi_env env, napi_callback_info info)
{
size_t argc = 5;
napi_value argv[3]={nullptr};
napi_get_cb_info(env, info,&argc, argv, nullptr, nullptr);
return nullptr;}
D.
static napi_value Demo2(napi_env env, napi_callback_info info)
{
size_t argc =0;
napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr);
if(argc ==0){
return nullptr;
}
napi_value* argv=new napi_value[argc];
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
// 业务代码
delete argv;
return nullptr;
}
- 答案 A D
47.HSP支持导出ArkUI组件、接口,供应用内的其他HAP/HSP引用,下面正确的是
A.
导出native方法,在HSP中也可以包含C++编写的so。对于so中的native方法,HSP通过间接的方式导出,以导出library.so的乘法接口multi为例:
// library/src/main/ets/utils/nativeTest.ts
import native from 'liblibrary.so';
export function nativeMulti(a: number, b: number): number {
let result: number = native.multi(a, b);
return result;
}
对外暴露的接口,需要在入口文件index.ets中声明:
// library/index.ets
export { nativeMulti } from './src/main/ets/utils/nativeTest';
B.
导出ArkUI组件
// library/src/main/ets/components/MyTitleBar.ets
@Component
export struct MyTitleBar {
build() {
Row() {
Text($r('app.string.library_title'))
.id('library')
.fontFamily('HarmonyHeiTi')
.fontWeight(FontWeight.Bold)
.fontSize(32)
.fontColor($r('app.color.text_color'))
}
.width('100%')
}
}
对外暴露的接口,需要在入口文件index.ets中声明:
// library/index.ets
export { MyTitleBar } from './src/main/ets/components/MyTitleBar';
C.
导出ts类和方法
// library/src/main/ets/utils/test.ts
export class Log {
static info(msg: string): void {
console.info(msg);
}
}
export function add(a: number, b: number): number {
return a + b;
}
export function minus(a: number, b: number): number {
return a - b;
- 答案 A B C
48.以下数据类型中,哪些是Sendable数据
import {lang} from "@kit.ArkTS"
class C{}
interface I extends lang.ISendable
A.number
B.string
C.class C
D. interfacel
- 答案 A B D
49.下面关于混淆的描述正确的是
A.API10及以上版本的Stage模型、编译模式为release时,默认开启代码混淆功能;默认的混淆功能仅会混淆函数参数和局部变量的名称。
B.针对工程源码的混淆可以降低工程被破解攻击的风险,缩短函数名、类名和属性名,减小应用的大小。
C.混淆支持ArKTS/TS/JS文件的混淆
D.代码混淆已经被集成了到SDK中,可以在DevEcoStudio中方便地使用。
- 答案 A B C D
50.项目组开发的Harmony0s应用工程,为了保护hap代码资产,如何在DevEcostudio中启用混淆的功能,并设置相应的混淆规则
A.在混淆规则配置文件consumer-rules.txt中进行混淆规则的配置
B.在混淆规则配置文件obfuscation-rules.txt中进行混淆规则的配置
C.release模式下将buildOption/arkOptions/ruleOptions/enable设置为false
D.release模式下将buildOption/arkOptions/ruleOptions/enable设置为true
- 答案 B D
51.以下代码片段哪几个class/interface违反了ArkTS语法规范
class Person {}
class student extends Person {}
class Instructor implements Person {}
interface Shape {}
interface Circle implements Shape {}
class Square implements Shape {}
A.Circie
B.Student
C.Square
D.Instructor
- 答案 A D
52.某业务团队发现用户对他们App的某个特性使用率并不高,为了节省用户首次下载安装包的体积,考虑将该特性做成按需加载,那么推荐该特性使用的工程模块类型是?
A. har
B.hsp
C.app
D.hap
- 答案 B D
53.ArkTs中不能使用以下哪些类型
A. any
B. tuple type
C.unknown
D.union type
- 答案 A C
54.如果想让grid上的捏合手势手势生效,而不跟grid上的滚动手势形成冲突,.xxxx?手势接口应该怎么配置?
Grid() {
ForEach(this.numbers, (day: string) => {
ForEach(this.numbers, (day: string) => {
GridItem() {
Text(day)
.fontSize(16)
.backgroundColor(0xF9CF93)
.width('100%')
.height(80)
.textAlign(TextAlign.Center)
}
}, (day: string) => day)
}, (day: string) => day)
}
.columnsTemplate('1fr '.repeat(this.columns))
.columnsGap(10)
.rowsGap(10)
.width('90%')
.scrollBar(BarState.Off)
.backgroundColor(0xFAEEE0)
.height('100%')
.cachedCount(3)
// 切换列数item位置重排动画
.animation({
duration: 300,
curve: Curve.Smooth
})
.xxxx?(
PinchGesture()
.onActionEnd((event: GestureEvent) => {
console.info('end scale:' + event.scale)
// 手指分开,减少列数以放大Item,触发阈值可以自定义,示例为2
if (event.scale > 2) {
this.columns--
} else if (event.scale < 0.6) {
this.columns++
}
// 可以根据设备屏幕宽度设定最大和最小列数,此处以最小1列最大4列为例
this.columns = Math.min(4, Math.max(1, this.columns));
AppStorage.setOrCreate('columnsCount', this.columns)
})
)
A. parallelGesture
B. gesture
C. GesureGroup
D. priorityGesture
- 答案 A B D
55.在ArkTS中,以下代码片段正确的是
A.
function fn(x: string | number): string {
return 'value: ' + x;
}
type funcType = (ns: string | number) => string;
let func: funcType = fn;
B.
function fn(x: string | number): string {
return 'value: ' + x;
}
type funcType = (ns: string) => string;
let func: funcType = fn;
C.
function fn(x: string | number): void {
console.log('value: ' + x);
}
type funcType = (ns: string | number) => string;
let func: funcType = fn;
D.
function fn(x: string): string {
return x;
}
type funcType = (ns: string | number) => string;
let func: funcType = fn;
- 答案 A B
56.在使用DevEco Studio进行Harmony0s应用开发和调试过程中,开发者小张遇到应用运行时意外终止的情况,他需要快速定位并解决导致应用崩溃的问题。以下哪些做法可以帮助小张有效分析和处理这些问题
A.当怀疑问题是由于C++代码中的内存错误(如数组越界、内存泄露、重复释放内存)引起时,进入“Run/Debug Configurations”设置界面,勾选启用Address Sanitizer(ASan),然后重新部署应用进行测试以获取更详细的内存问题报告
B.查看DevEco Studio log工具栏输出的错误日志,根据日志提示分析应用崩溃的具体原因及代码位置
C.若遇到App运行卡顿或系统整体无响应(App Freeze,System Freeze)的情况,可以通过性能分析工具中的Frame Insight和Allocation Insight功能,分析应用的资源消耗情况,寻找可能的瓶颈
D.利用系统自动生成的FaultLog,包括AppFreeze、CPP Crash、JS Crash、System Freeze和ASan报告,这些报告会详细记录故障发生时的环境、堆栈信息和可能的故障原因、是排查问题的重要参考
- 答案 A D
57.开发者小李正在使用DevEco Studio开发一款面向HarmonyOS的应用,该应用需要在多种设备上表现出一致的稳定性和优秀的用户体验。
为了确保高质量的发布,小李意识到需要实施一套全面的测试策略,覆盖代码的自动化测试和手动测试,还需要衡量代码的测试覆盖率,以确定测试的充分性。在DevEco Studio的测试框架下,以下描述中,哪些是正确的
A.Instrument Test:测试用例存储于项目的ohosTest日录,要求在HarmonyOS设备或模拟器上执行,兼容ArKTS与JS语言编写。
B.DevEco Studio的测试框架提供测试用例执行能力,包含基础接口以编写和输出测试结果,鼓励用户创建易于维护的自动化测试脚本,并且统计代码覆盖率
C.无论选择Instrument Test还是LocalTest,DevEco Studio均内置了详尽的测试报告功能,实时显示测试进度,且直接在IDE中可查看代码覆盖率报告无需外部工具。
D.Local Test:测试用例位于test日录,无需设备或模拟器环境,直接在本地执行,专注于ArkTS语言,推荐适用于API版本11及以上的Hvigor工程,目前特别限于Stage模型,并不涵盖C/C++方法。
- 答案 AB CD
58.如下哪些方式可实现图片动态播放?
A.
@Entry
@Component
struct ImageExample {
build() {
Column({ space: 10 }) {
Image($r('app.media.earth')) //对应资源图片名后缀为gif
.width(100)
.height(100)
}
}
}
B.
import {AnimationOptions, AnimatedDrawableDescriptor} from '@ohos.arkui.drawableDescriptor'
import image from '@ohos.multimedia.image'
@Entry
@Component
struct ImageExample {
pixelmaps: Array<PixelMap> = [];
options: AnimationOptions = {duration:2000, iterations:1};
@State animated: AnimatedDrawableDescriptor | undefined = undefined;
async aboutToAppear() {
this.pixelmaps = await this.getPixelMaps();
this.animated = new AnimatedDrawableDescriptor(this.pixelmaps, this.options);
}
build() {
Column() {
Row() {
Image(this.animated)
.width('500px').height('280px')
}.height('50%')
Row() {
Button('once').width(100).padding(5).onClick(() => {
this.options = {duration:2000, iterations:1};
this.animated = new AnimatedDrawableDescriptor(this.pixelmaps, this.options);
}).margin(5)
}
}.width('50%')
}
private async getPixmapListFromMedia(resource: Resource) {
let unit8Array = await getContext(this)?.resourceManager?.getMediaContent({
bundleName: resource.bundleName,
moduleName: resource.moduleName,
id: resource.id
})
let imageSource = image.createImageSource(unit8Array.buffer.slice(0, unit8Array.buffer.byteLength))
let createPixelMap: Array<image.PixelMap> = await imageSource.createPixelMapList({
desiredPixelFormat: image.PixelMapFormat.RGBA_8888
})
await imageSource.release()
return createPixelMap
}
private async getPixelMaps() {
let Mypixelmaps:Array<PixelMap> = await this.getPixmapListFromMedia($r('app.media.icon'))//对应资源图片名后缀为gif
return Mypixelmaps;
}
}
C.
import {AnimationOptions, AnimatedDrawableDescriptor} from '@ohos.arkui.drawableDescriptor'
import image from '@ohos.multimedia.image'
@Entry
@Component
struct ImageExample {
pixelmaps: Array<PixelMap> = [];
options: AnimationOptions = {duration:2000, iterations:1};
@State animated: AnimatedDrawableDescriptor | undefined = undefined;
async aboutToAppear() {
this.pixelmaps = await this.getPixelMaps();
this.animated = new AnimatedDrawableDescriptor(this.pixelmaps, this.options);
}
build() {
Column() {
Row() {
Image(this.animated)
.width('500px').height('280px')
}.height('50%')
Row() {
Button('once').width(100).padding(5).onClick(() => {
this.options = {duration:2000, iterations:1};
this.animated = new AnimatedDrawableDescriptor(this.pixelmaps, this.options);
}).margin(5)
}
}.width('50%')
}
private async getPixmapFromMedia(resource: Resource) {
let unit8Array = await getContext(this)?.resourceManager?.getMediaContent({
bundleName: resource.bundleName,
moduleName: resource.moduleName,
id: resource.id
})
let imageSource = image.createImageSource(unit8Array.buffer.slice(0, unit8Array.buffer.byteLength))
let createPixelMap: image.PixelMap = await imageSource.createPixelMap({
desiredPixelFormat: image.PixelMapFormat.RGBA_8888
})
await imageSource.release()
return createPixelMap
}
private async getPixelMaps() {
Mypixelmaps.push(await this.getPixmapFromMedia($r('app.media.icon'))) //对应资源图片名后缀为png
return Mypixelmaps;
}
}
D.
@Entry
@Component
struct ImageAnimatorExample {
@State iterations: number = 1
build() {
Column({ space: 10 }) {
ImageAnimator()
.images([
{
src: $r('app.media.img1')
},
{
src: $r('app.media.img2')
},
{
src: $r('app.media.img3')
},
{
src: $r('app.media.img4')
}
])
.duration(2000)
.fillMode(FillMode.None).iterations(this.iterations).width(340).height(240)
.margin({ top: 100 })
}.width('100%').height('100%')
}
}
- 答案 AB D
59.以下关于ArKTS线程实例间传输实现方式描述正确的是
A.taskpool.execute(task).then(()=>);TaskPool 共亨传输实现方式,
B.w.postMessageWithSharedSendable(a);Worker 共享传输实现方式
C.task.setCloneList([a]);taskpool.execute(task).then(()=>{);,TaskPool 共享传输实现方式
D.w.postMessage(a);,Worker 共享传输实现方式
- 答案 AB
60.处于安全因素考虑,ArkTS不支持以下哪些语法。
A.with()
B.Object.entries()
C.eval()
D.new Function('a', 'b', 'return a + b')
- 答案 A C D
61.在开发HarmonyOs应用的多元化测试环境中,DevEco Studio引|入了本地模拟器
(Local Emulator)作为重要工具,旨在帮助开发者在个人开发机器上高效模拟HarmonyOS环境进行应用或服务的快速运行与细致调试。请根据本地模拟器的实际应用场景与系统要求,选出所有正确的描述选项
A.开发者需要注意的是,DevEco Studio的本地模拟器可以在虚拟机内部进一步运行,以节省硬件资源。
B.DevEco Studio的本地模拟器允许开发者在个人电脑上模拟HarmonyOS环境,便于应用或服务的运行与调试,
C.mac计算机配置方面,为了确保本地模拟器的稳定运行,推荐至少配备8GBRAM.
D.为了保证流畅的运行和调试体验,本地模拟器推荐macos系统版本至少为12.5以上。
- 答案 BCD
62.以下哪些实现方式可实现文本字号20的效果
A.
import { LengthMetrics, LengthUnit } from '@ohos.arkui.node'
@Entry
@Component
struct Index {
fontStyleAttr: TextStyle = new TextStyle({fontSize:LengthMetrics.vp(20)});
mutableStyledString: MutableStyledString = new MutableStyledString("hello", [{
start: 0,
length: 5,
styledKey: StyledStringKey.FONT,
styledValue: this.fontStyleAttr
}]);
controller: TextController = new TextController();
async onPageShow() {
this.controller.setStyledString(this.mutableStyledString)
}
build() {
Column() {
// 显示属性字符串
Text(undefined, { controller: this.controller })
}.width('100%')
}
}
B.
// xxx.ets
@Entry
@Component
struct Index {
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) {
Text('This is the text with the height adaptive policy set')
.width('80%')
.height(90)
.minFontSize(20)
}.width('100%').height(250).padding({ left: 35, right: 35, top: 35 })
}
}
C.
@Entry
@Component
struct SpanExample {
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) {
Text() {
Span('span letter spacing')
.letterSpacing(3)
.fontSize(20)
}.fontSize(30)
}.width('100%').height(250).padding({ left: 35, right: 35, top: 35 })
}
}
D.
// xxx.ets
@Entry
@Component
struct Index {
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) {
// 文本水平方向对齐方式设置
// 单行文本
Text('TextAlign set to Center.')
.textAlign(TextAlign.Center)
.fontSize(20)
.border({ width: 1 })
.padding(10)
.width('100%')
}.height(600).width(350).padding({ left: 35, right: 35, top: 35 })
}
}
- 答案 A C D
63.Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,以下关于Navigation组件说法正确的是()
A.Navigation只能在entry类型的Module中使用
B.Navigation子页面的根容器可以采用如Column、Row这些容器组件
C.Navigation的页面显示模式有单页面,分栏和自适应三种显示模式
D.Navigation的子页面可以来自不同的Module
- 答案 C D
63.在ArkTS中,以下哪些声明类的方式是正确的
class C1 {
value: number = 0;
}
class C2 {
value: number;
constructon(value: number){
this.value = value;
}
}
class c3 {
constructor(value: number){
this.value = value;
}
}
class C4 {
value: number;
}
A.C1
B.C2
C.C3
D.C4
- 答案 A B
64.在ArkTS中,以下哪些属性的声明是正确的。
class C{
value1: number = 0;
value2?:number = null;
value3: number |undefined = undefined;
value4?: number;
}
A.vaule1
B.vaule2
C.vaule3
D.vaule4
- 答案 A D
65. 下面关于ArkTs中export用法,正确的是
A. export* as name from "ets file name"
B. export{ export1 as alias1 } from "ets file name".
C.export * from "ets file name"
D. export{export1 } from "ets file name" ;
- 答案 : A B C D
66.以下napi代码有问题的是
A.
static napi_value Demo(napi_env env, napi_callback_info info)
{
constexpr size_t arrSize = 1000;
napi_value arrBuffer = nullptr;
void *data = nullptr;
napi_create_arraybuffer(env, arrSize * sizeof(int32_t), &data, &arrBuffer);
int32_t *i32Buffer = reinterpret_cast<int32_t *>(data);
for (int i = 0; i < arrSize; i++) {
i32Buffer[i] = i;
}
return arrBuffer;
}
B.
static napi_value Demo(napi_env env, napi_callback_info info)
{
size_t argc = 1;
napi_value args[1] = {nullptr};
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
napi_value sizeObj = nullptr;
napi_handle_scope scope = nullptr;
napi_open_handle_scope(env, &scope);
napi_call_function(env, nullptr, args[0], 0, nullptr, &sizeObj);
napi_close_handle_scope(env, scope);
int64_t width = 0;
napi_value result = nullptr;
napi_get_element(env, sizeObj, 0, &result);
napi_get_value_int64(env, result, &width);
return result;
}
C.
napi_ref g_ref = nullptr;
/***** excute in main thread *****/
static napi_value DemoInMainThread(napi_env env, napi_callback_info info)
{
napi_value string = nullptr;
napi_create_string_utf8(env, "bar", NAPI_AUTO_LENGTH, &string);
napi_create_reference(env, string, 1, &g_ref);
return string;
}
/***** excute in worker thread *****/
static napi_value DemoInWorkerThread(napi_env env, napi_callback_info info)
{
napi_value string = nullptr;
napi_get_reference_value(env, g_ref, &string);
napi_value object = nullptr;
napi_create_object(env, &object);
napi_set_named_property(env, object, "foo", string);
return object;
}
D.
struct CallbackContext {
napi_env env = nullptr;
napi_ref callbackRef = nullptr;
int32_t retData = 0;
};
void callbackTest(CallbackContext *context)
{
uv_loop_s *loop = nullptr;
napi_get_uv_event_loop(context->env, &loop);
uv_work_t *work = new uv_work_t;
context->retData = 1;
work->data = (void *)context;
uv_queue_work(
loop, work, [](uv_work_t *work) {},
// using callback function back to JS thread
[](uv_work_t *work, int status)
{
CallbackContext *context = (CallbackContext *)work->data;
napi_value callback = nullptr;
napi_get_reference_value(context->env, context->callbackRef, &callback);
napi_value retArg;
napi_create_int32(context->env, context->retData, &retArg);
napi_value ret;
napi_call_function(context->env, nullptr, callback, 1, &retArg, &ret);
napi_delete_reference(context->env, context->callbackRef);
if (work != nullptr) {
delete work;
}
delete context;
}
);
}
- 答案 A B