鸿蒙高级认证
单选题
- ArkTS支持以下哪个函数。
A. Object.hasOwnProperty();
B. Object.getOwnPropertyDescriptor();
C. Object.getOwnPropertyDescriptors();
D. Object.values();
- ArkTS支持以下哪些函数
A. Object.isExtensible();
B. Object.keys();
C. Object.getOwnPropertySymbols();
D. Object.isPrototypeOf();
- 下面关于方舟字节码格式PREF_IMM16_V8_V8描述正确的是
A. 8位操作码,8位立即数,16位id,8位寄存器
B. 16位前缀操作码,16位立即数,2个8位寄存器
C.16位前缀操作码,16位立即数,8位寄存器
D.8位操作码,8位立即数,2个8位寄存器
- 以下哪些赋值语句在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();
- 根据上面代码,以下解释正确的是
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. 本例子可以运行起来,所以代码没有问题。
B.在自定义组件Page的build方法里改变状态变量是非法操作,可能导致未定义的异常UI行为
。
C. 在ChangeMode里改变mode的值,会触发其父组件Page的Title内容的切换。
D. 为了避免@Prop的拷贝,可以优化使用@Link,在该例子中行为和@Prop一样。
- 从桌面冷启动如下应用代码,点击Change按钮5次,整个过程中,代码中的2条log依次出现的次数是:
class Data {
num: number
type: string
constructor(num: number, type: string) {
this.num = num;
this.type = type;
}
}
@Reusable
@Component
struct Item {
@State data: Data | undefined = undefined;
aboutToAppear(): void {
console.log("Demo log1");
}
aboutToReuse(params: ESObject): void {
console.log("Demo log2");
this.data = params.data
}
build() {
Text("num = " + this.data?.num + ", type = " + this.data?.type)
}
}
@Entry
@Component
struct Index {
data1: Data = new Data(1, "type1");
data2: Data = new Data(2, "type2");
@State data: Data = this.data1
build() {
Column() {
if (this.data.type == "type1") {
Item({ data: this.data }).reuseId(this.data.type)
} else {
Item({ data: this.data }).reuseId(this.data.type)
}
Button('Change').onClick(() => {
if (this.data === this.data1) {
this.data = this.data2
} else {
this.data = this.data1
}
})
}
}
}
A. 2,4
B.1,0
C. 6,0
D. 1,5
7.为了使isShow参数值与半模态界面的状态同步,可以使用下列那种方式双向绑定isShow参数?A
A.
// xxx.ets
@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.
// xxx.ets
@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%')
}
}
C.
// xxx.ets
@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%')
}
}
D.
// xxx.ets
@Entry
@Component
struct SheetTransitionExample {
@State isShow:boolean = false
@State isShow2:boolean = false
@State sheetHeight:number = 300;
@Builder myBuilder() {
Column() {
Button("change height")
。。。
- Text组件不支持以下哪种使用方式?
D
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();
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%')
}
}
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();
layout: TextLayoutManager = new TextLayoutManager()
controller1: TextController = new TextController();
async onPageShow() {
this.controller1.setLayout(this.layout)
}
- 如果想让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("100%").height("100%")
.hitTestBehavior(?)
.onTouch((event) => {
console.info('stack touched type: ' + (event as TouchEvent).type)
})
}.width(300).height(300)
}
}
A. HitTestMode.Default
B. HitTestMode.Block
C
. HitTestMode.Transparent
D. HitTestMode.None
- 现有一个宽高分别为200px的XComponent组件,其绑定了一个XComponentController(xcController),依次进行如下操作:
(1) xcController.setXComponentSurfaceRect( {surfaceWidth: 150, surfaceHeight: 500} )
(2) 设置XComponent组件的padding为{ top: 5px, left: 10px, bottom: 15px, right: 20px }
(3) 将XComponent组件大小改为300px×300px
(4) 给XComponent组件设置一个宽度为2px的边框
(5) xcController.setXComponentSurfaceRect( { offsetX: -20, offsetY: 50, surfaceWidth: 200, surfaceHeight: -100 } )
之后,调用xcController.getXComponentSurfaceRect()的返回值为
A. { offsetX: -20, offsetY: 50, surfaceWidth: 200, surfaceHeight: 500}
B.
{ offsetX: 75, offsetY: -100, surfaceWidth: 150, surfaceHeight: 500 }
C. { offsetX: 81, offsetY: -89, surfaceWidth: 200, surfaceHeight: 0 }
D. { offsetX: 81, offsetY: -89, surfaceWidth: 150, surfaceHeight: 500 }
- 以下哪份代码可以实现下图Grid布局
A. 通过设置GridItem的columnStart和columnEnd
// xxx.ets
@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的宽度
// xxx.ets
@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)
}
}
}
- 已知下列代码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. 3
C. 4
D. 1
- 项目需要同时进行应用和元服务的开发,并针对当前项目工程中的代码可以分别构建出应用和元服务的包,如何在DevEco Studio中设置不同的构建配置,达成这个目的
A. 修改工程级别的AppScope/app.json5中的bundleType值为app
B.
在模块级别build-profile.json5定义两个target,将两个target的bundleType分别设置成app和atomicServiceC. 修改工程级别的AppScope/app.json5中的bundleType值为atomicService
D.
在工程级别build-profile.json5定义两个product,将两个product的bundleType分别设置成app和atomicService
-
张工正在使用DevEco Studio进行一个复杂项目的开发工作,项目中包含了成千上万行代码且涉及众多模块。在重构代码的过程中,他意识到需要对一个核心类名进行更改,考虑到这个类在整个项目中被广泛引用,手动修改不仅耗时且容易出错。
基于DevEco Studio提供的代码编辑功能,以下哪个描述最准确地概述了张工如何高效且安全地完成对类名的更改,同时确保整个项目中所有相关引用同步更新?
A. 张工只需简单选中需要更名的类名,按下Delete键删除后直接输入新名称,DevEco Studio会自动识别并更新所有引用。
B. 张工在代码编辑器中右键点击该类名,选择“Find Usage”,手动浏览所有引用位置并逐一修改为新名称。
C. 张工需打开项目搜索功能,输入旧类名找到所有匹配项,逐一进行替换,完成更名操作。
D.
张工选中需要更名的类名,使用快捷键Shift+F6或右键菜单Refactor -> Rename,在弹出框中输入新名称并选择替换范围后,点击“Refactor”完成更名操作,确保所有相关引用自动更新
。
- 项目中包含多个模块和数千行代码。随着开发的深入,项目中的ArkTS源代码文件逐渐积累了大量import语句,其中不乏未使用的import以及不规范的排序情况,关于DevEco Studio的编辑器的“Optimize Imports”,以下说法正确的是
A.
可以在菜单栏中依次点击“Code” > “Reformat Code”来达到优化import的目的,因为“Optimize Imports”功能已整合进“Reformat Code”中
。B. 在DevEco Studio中,没有直接的“Optimize Imports”功能,需要安装第三方插件来实现这个需求。
C. 为了快速清理未使用的import,可以选中项目根目录,按下快捷键Ctrl+Alt+O(在macOS上为Control+Option+O),让DevEco
Studio自动识别并移除所有未使用的import,并自动按照预设规则排序和合并import。D. 应该手动遍历每个ArkTS文件,逐一检查并删除未使用的import语句,然后按照字母顺序手动排序剩余的import。
- 小李正在使用DevEco Studio进行HarmonyOS应用的开发工作,他需要对一个频繁被调用的函数calculateData()进行重构,为了帮助小李高效地找到calculateData()函数的所有引用位置,并确保重构时考虑周全,以下哪个步骤是正确的使用DevEco Studio
A.
小李只需将光标定位在calculateData()函数名上,右键点击并选择“Find Usages”,或者直接使用快捷键Alt + F7(macOS为Option + F7),DevEco Studio会自动列出该函数在项目中的所有引用位置
。B. 小李应该在菜单栏中选择“Navigate” > “Class”来打开类浏览器,从中找到calculateData()函数,并在此界面中手动检查所有引用。
C. 小李应将光标置于calculateData()函数的名称上,按下Ctrl + Shift + F(macOS为Command + Shift + F)全局搜索该函数名,然后在搜索结果中筛选出真正的调用位置。
D. 小李应当在项目目录树中找到calculateData()函数所在的文件,直接双击打开文件,然后逐行扫描代码以手动查找该函数的所有调用位置。
- 项目需要为不同的设备形态(如手机、智能手表)提供定制化构建。请说明如何在DevEco Studio中设置不同的构建配置,以生成针对不同设备的hap包?
A. 在工程级别build-profile.json5定义多个product,在每个product的config/deviceType中定义不同的设备类型
B. 在模块级别build-profile.json5定义多个target,在每个target的config/distributionFilter中定义不同的设备类型
C. 在工程级别build-profile.json5定义多个product,在每个product的config/distributionFilter中定义不同的设备类型
D.
在模块级别build-profile.json5定义多个target,在每个target的config/deviceType中定义不同的设备类型
- 小华正在使用DevEco Studio开发一款基于HarmonyOS的ArkUI应用,该应用需要实现一个功能,即当用户点击按钮时,通过ArkTS/JS API调用系统的分享功能。小华对具体的API调用细节不太熟悉,如何通过DevEco Studio快速查阅相关的API文档。
A. 小华在代码编辑区直接键入分享功能相关的API调用代码,如 arkui.getShare(),然后按F1键,期望编辑器能自动跳转到该API的文档页面。
B. 小华应该先停止编码工作,打开浏览器,手动搜索关键词“HarmonyOS ArkUI分享API”,在官方网站的文档页面中寻找相关API的使用方法。
C.
小华将鼠标悬停在编辑器中已经键入或打算键入的API调用(例如 @system.router.push)上,等待编辑器自动弹出悬浮提示框,显示该API的简要信息和不同版本参数说明。随后,点击提示框右下角的“Show in API Reference”链接,直接跳转到详尽的API参考文档页面
。D. 小华右键点击代码编辑区,选择“Find Usages”选项,试图从其他地方引用该API的实例中学习如何使用分享功能。
- HarmonyOS应用开发团队正着手优化一款面向全球市场的在线教育应用,该应用在特定课程直播环节出现了性能波动和响应延迟的问题,严重影响用户体验。打算利用DevEco Profiler来进行性能优化。DevEco Profiler其设计核心和主要优势是什么
A. DevEco Profiler专注于用户界面设计的美化,使开发者操作更为直观
B. DevEco Profiler主要是一个自动化修复工具,能自动检测并解决所有HarmonyOS应用的性能问题
C.
DevEco Profiler依据Top-Down设计理念,通过高度整合的数据展示范式,提供从宏观到微观的性能数据分析,加速开发者定位和解决问题的过程
D. DevEco Profiler采用Bottom-Up设计原则,从底层代码细节开始逐步构建性能模型
- 在使用DevEco Studio的Profiler进行HarmonyOS应用或服务性能分析时,面对应用出现卡顿、加载慢等性能瓶颈问题,以下哪个描述最贴切地说明了“Time场景分析任务”的功能及其对开发者优化流程的帮助
A. Time场景分析任务在应用运行时,通过显示所有函数执行的耗时排序列表,辅助开发者手动对比寻找耗时最短的函数进行优化
B. Time场景分析任务仅提供应用/服务运行时的CPU使用率概览,帮助开发者粗略判断性能瓶颈,但不提供深入分析
C. Time场景分析任务专注于内存管理,帮助开发者监控应用内存泄漏,但对解决卡顿和加载耗时问题帮助有限
D.
Time场景分析任务展示热点区域内的CPU和进程级调用栈耗时情况,支持代码跳转,助力开发者快速定位并优化耗时较长的代码段
- HarmonyOS提供了多种包结构,每种包编译后的产物都不同,下面说法错误的是
A. hap包编译后的产物是.hap文件。
B. hsp包编译后的产物是.hsp文件。
C. har包编译后的产物是.har文件。
D.
app包编译后的产物是.app文件
。
- 在编译构建HAP时,会从HAP模块及依赖的模块中收集资源文件,如果不同模块下的资源文件出现重名冲突时,会按照优先级进行覆盖,现在有一个HAP依赖了两个HAR,依赖配置如下所示:
// oh-package.json5
{
"dependencies": {
"dayjs": "^1.10.4",
"lottie": "^2.0.0"
}
}
在资源覆盖时,以下优先级排序正确的是()
A. HAP包自身模块>dayjs模块>lottie模块>AppScope
B. AppScope>HAP包自身模块>lottie模块>dayjs模块
C. HAP包自身模块>lottie模块>dayjs模块>AppScope
D.
AppScope>HAP包自身模块>dayjs模块>lottie模块
- want参数的entities匹配规则错误的是
A.调用方传入的want参数的entities不为空,待匹配应用组件的skills配置中的entities为空,则entities匹配失败。
B.
调用方传入的want参数的entities为空,待匹配应用组件的skills配置中的entities不为空,则entities匹配失败
。C. 调用方传入的want参数的entities为空,待匹配应用组件的skills配置中的entities为空,则entities匹配成功。
D. 调用方传入的want参数的entities不为空,待匹配应用组件的skills配置中的entities不为空且包含调用方传入的want参数的entities,则entities匹配成功。
- 应用开发中使用的各类资源文件,需要放入特定子目录中存储管理,以下关于资源说法错误的是
A.resfile目录,应用安装后,resfile资源会被解压到应用沙箱路径,通过Context属性resourceDir获取到resfile资源目录后,可通过文件路径访问。
B.stage模型多工程情况下,共有的资源文件放到AppScope下的resources目录。
C. base目录是默认存在的目录,二级子目录element用于存放字符串、颜色、布尔值等基础元素,media、profile存放媒体、动画、布局等资源文件。
D.
rawfile目录,支持创建多层子目录,子目录名称可以自定义,文件夹内可以自由放置各类资源文件。目录中的资源文件会被编译成二进制文件,并赋予资源文件ID
。
- singleton模式的UIAbility,在冷启动时生命周期的执行顺序是:
A. onCreate->onBackground->onForeground
B. onCreate->onForeground->onWindowStageCreate
C. onCreate->onBackground->onWindowStageCreate
D.
onCreate->onWindowStageCreate->onForeground
- 1.在UIAbility的onCreate生命周期中通过EventHub的on注册"event1"和"event2"事件。
import { hilog } from '@kit.PerformanceAnalysisKit';
import { UIAbility, Want, AbilityConstant } from '@kit.AbilityKit';
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');
}
// ...
eventFunc(argOne: Context, argTwo: Context): void {
hilog.info(DOMAIN_NUMBER, TAG, 'receive. ' + `${argOne}, ${argTwo}`);
return;
}
}
2.在UI组件的click处理事件中调用如下的eventHubFunc,连续点击2次该控件后,运行日志输出是什么:D
import common from '@kit.AbilityKit';;
import { promptAction } from '@kit.ArkUI';
@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() {
// ...
}
.onClick(() => {
this.eventHubFunc();
promptAction.showToast({
message: $r('app.string.EventHubFuncA')
});
})
}
}
// ...
}
// ...
}
}
A.
[Example].[Entry].[EntryAbility] receive. []
[Example].[Entry].[EntryAbility] receive. [2,“test2”]B.
[Example].[Entry].[EntryAbility] receive. []
[Example].[Entry].[EntryAbility] receive. [2,“test2”]
[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. [2,“test2”]
- 通过aa工具拉起com.example.test的EntryAbility,并传参给EntryAbility,具体参数是number类型的[key1, 1] [key2,2] 和string类型的[key3, testString] [key4,‘’],
那边下面那个aa 命令是正确的:
A.
aa start -b com.example.test -a EntryAbility --pi key1 1 key2 2 --ps key3 testString --psn key4B.
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 --pi key2 2 --ps key3 testString --ps key4D.
aa start -b com.example.test -a EntryAbility --pi key1 1 --pi key2 2 --ps key3 testString --psn key4
- 某个应用开发了一个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.
3个
B. 1个
C. 2个
D. 4个
- 作为应用开发者,你使用hiAppEvent订阅了崩溃事件。应用崩溃后,从onReceive接口返回的AppEventInfo中()属性可以获取崩溃调用栈信息。
A. eventType
B. name
C.
params
D. domain
- hiAppEvent提供的Watcher接口,()属性不配置,会导致编译报错,产生"ArkTS Compiler Error".
A.
name
B. triggerCondition
C. onTrigger
D. onReceive
- 当标记了@Reuseable的自定义组件实现了组件复用后,这个组件的复用范围是什么?
A. 整个应用内都可以复用
B. 整个页面都可以复用
C.
标记了@Reuseable的自定义组件的父组件范围内
D. 标记了@Reuseable的自定义组件的外层容器节点范围内
- ArkUI组件复用的作用机制是减少了什么时间从而降低了丢帧率?
A.
组件节点和对象的创建时间
B. 组件节点渲染时间
C. 数据挂载时间
D. 组件销毁时间
- 当使用状态变量进行ArkUI组件间数据通信的时候,如果两个组件间没有直接的嵌套关系(非父子和祖孙关系组件),但是他们又属于同一页面,最佳的装饰器应该选用哪个?
A.
LocalStorage
B. AppStorage
C. @State+@Link
D. @Provide+@Consume
- 下面持续集成描述哪项是错误的:
A. 持续集成在大型项目(有几十个项目组)也能应用,即便是项目组开发进度不统一也没问题
B. Martin Fowler说过,”持续集成并不能消除Bug,而是让它们非常容易发现和改正。”
C.
持续集成就是持续编译,二者异曲同工
D. 持续集成(CI, Continuous Intergation): 指频繁的,一天多次将代码集成到主干。
- 某业务团队的架构师发现某个特性用的频率比较少,但是这个特性占用空间资源还是比较大的。为了减少首包下载体积,准备将该特性解耦出来,并对外提供API方便主模块调用。以下说法正确的是()
A.
将该特性做成按需加载的hsp包,暴露接口给主模块使用
。B. 将该特性做成H5模块,通过web组件加载远程资源使用。
C. 将该特性做成动态加载的har包,暴露接口给主模块使用。
D. 将该特性做成hap包,通过Ability组件暴露出来给主app使用。
- 某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. 可以采用Navigation作为页面导航根容器,将其放在entry中,其他Module的页面作为Navigation的子页面。
D. 采用RouterModule作为中介者并用动态import解耦各个业务模块。
- 某App依赖了3个ohpm库,这3个库占用的体积都比较大。在App的技术架构中,有多个hap和多个hsp均依赖这3个库,为了减少app的首包大小,以下哪些做法是无效的?
A. 将3个ohpm库分别封装成3个hsp,并对外提供必要的接口。
B. 将3个ohpm库封装成1个hsp,并对外提供必要的接口。
C.
将这3个ohpm库封装到har包中,并对外提供必要的接口
。D. 将某些特性做成按需加载模块,若这3个ohpm仅在按需加载模块里面使用,则将其打包在按需加载模块中。
- 以下关于应用架构技术选型说法不正确的是()
A. 对于初始版本的应用,功能比较简单,可以考虑采用单HAP加上多个HAR工程构建代码工程。
B.
随着业务的发展,应用功能会越来越多,某些功能可以做成动态加载,动态加载的模块采用HAR工程来构建,方便复用和共享
。C. 元服务和应用可以共用一个代码工程,采用多目标产物构建方式,构建出应用和元服务两个产物,用于上架。
D. 一些应用的扩展能力,比如备份、服务卡片,可以采用ExtensionAbility做成单独的feature HAP包,独立分发。
- 关于短时任务开发使用的接口是
A.
使用requestSuspendDelay申请任务,使用getRemainingDelayTime获取任务剩余时间
B. 使用publishReminder发布一个提醒类通知,使用cancelReminder取消一个指定的提醒类通知
C. 使用startWork申请任务,使用stopWork取消任务,使用getWorkStatus获取任务状态
D. 使用startBackgroundRunning申请任务,使用stopBackgroundRunning取消任务
- 以下哪些方式可以实现ArkWeb同层渲染能力 ()
B
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)
<embed id="view" type="native/contents" width="100%" height="100%" style="background-color:red"/>
C.
Web(...).enableNativeEmbedMode(true)
<object 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"/>
- WebSocket连接开发步骤描述错误的是
A.
调用Session.start方法开启metadata数据输出
B. 根据URL地址,发起WebSocket连接
C. (可选)订阅WebSocket的打开、消息接收、关闭、Error事件
D. 使用完WebSocket连接之后,主动断开连接
E. 创建一个WebSocket连接,返回一个WebSocket对象
F. 导入需要的webSocket模块
- 以下关于HAP(Harmony Ability Package)说法正确的是()
A. 应用工程编出的app文件中,只能包含一个hap文件。
B.
应用工程如果包含多个Module,在应用市场上架时,会将多个.hap文件打包成一个.app文件
。C. DevEco Studio会在编译构建时,不需要对HAP进行一致性校验。
D. HAP是应用安装和运行的基本单位,在DevEco
Studio工程目录中,一个HAP对应一个Module。应用打包时,所有的Module都只能生成.hap文件。
- 某业务团队的架构师发现某个特性用的频率比较少,但是这个特性占用空间资源还是比较大的。为了减少首包下载体积,准备将该特性解耦出来,并对外提供API方便主模块调用。以下说法正确的是()
A. 将该特性做成hap包,通过Ability组件暴露出来给主app使用。
B.
将该特性做成动态加载的har包,暴露接口给主模块使用
。C. 将该特性做成H5模块,通过web组件加载远程资源使用。
D. 将该特性做成按需加载的hsp包,暴露接口给主模块使用。
- 在moduleA(HAP类型)中有一个图片名为image.png,在moduleB(HAR类型)也存在一个图片名为image.png,而moduleA依赖于moduleB,那么在moduleA的编译产物hap包中,image.png存在情况是:
A. 两者都不存在
B. 仅存在moduleA的image.png
C. 两者都存在
D. 仅存在moduleB的image.png
- 关于自动化测试描述正确的是:
A. 自动化测试因提高效率,减少重复工作的特性而被广泛采用;自动化测可以替代手动测试在处理复杂、难以预测的用户交互或特殊边界条件。
B.
Fuzz测试就是通过构造不规则的输入,从而触发程序的某种bug;Fuzz测试属于白盒测试。Fuzz测试也叫做模糊测试,通过输入非法字段,并观察软件是否异常来实现。一方面可以通过向软件输入非法字段,另一方面也可以通过向网络服务发送异常报文。C.
XTS子系统是认证测试套件的集合,当前包括acts(application compatibility test suite)应用兼容性测试套件,后续会拓展dcts(device compatibility test suite)设备兼容性测试套件等
。D. DT(开发者测试)就是UT,可看护的范围包括边界值问题、空指针或赋值错误,内部业务逻辑问题等等。
- 当使用状态变量进行ArkUI组件间数据通信的时候,如果两个组件间没有直接的嵌套关系(非父子和祖孙关系组件),但是他们又属于同一页面,最佳的装饰器应该选用哪个?
A. AppStorage
B. @State+@Link
C.
LocalStorage
D. @Provide+@Consume
- 为了提高性能,所以List组件支持懒加载,可以通过配置cachedCount属性设置缓存列表项的数量。当我们不设置List的属性cachedCount时,该属性的默认值是?
A.
1
B. 2
C. 0
D. 3
48.应用发生崩溃,()接口可以获取到崩溃时调用栈
A.
hiAppEvent
B. hiTraceMeter
C. hiDebug
D. hiLog
- hiAppEvent提供的Watcher接口,需要订阅到OS的崩溃事件,正确的实现方式(
B
)
A.
hiAppEvent.addWatcher({
name: "watcher",
appEventFilters: [
{
domain: hiAppEvent.domain.OS,
names: [hiAppEvent.event.APP_CRASH]
}
]
})
B.
hiAppEvent.addWatcher({
name: "watcher",
appEventFilters: [
{
domain: hiAppEvent.domain.OS,
names: [hiAppEvent.event.APP_CRASH]
}
],
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",
onReceive: (domain: string, appEventGroups: Array<hiAppEvent.AppEventGroup>) => {
}
})
- 一个应用的一个UIAblity,其exported字段配置为false,以下哪个场景可以拉起这个UIAbility。
A. caller应用在后台,有START_ABILITY_FROM_BACKGROUND权限;
B. caller应用在后台,申请了长时任务,有START_ABILITY_FROM_BACKGROUND权限;
C.
caller应用在后台,申请了长时任务,有START_INVISIBLE_ABILITY权限
;D. caller应用在后台,有START_INVISIBLE_ABILITY权限;
- 一个应用有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. 0个
B.
3个
C. 2个
D. 1个
- 在组件中,经常需要使用字符串、图片等资源。HSP中的组件需要使用资源时,一般将其所用资源放在HSP包内,而非放在HSP的使用方处,以符合高内聚低耦合的原则。下面访问HSP资源错误的是
A
A.
使用相对路径的方式,访问HSP中的资源。
Image("../../resources/base/media/example.png")
.id('example')
.borderRadius('48px')
B.
跨包访问HSP内资源时,推荐实现一个资源管理类,以封装对外导出的资源。
将需要对外提供的资源封装为一个资源管理类:
// 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/ResManager';
C.
通过$r访问HSP中的资源。
Image($r('app.media.example'))
.id('example')
.borderRadius('48px')
- 应用开发中使用的各类资源文件,需要放入特定子目录中存储管理,以下关于资源说法错误的是
A.
resfile目录,应用安装后,resfile资源会被解压到应用沙箱路径,通过Context属性resourceDir获取到resfile资源目录后,可通过文件路径访问。B.
base目录是默认存在的目录,二级子目录element用于存放字符串、颜色、布尔值等基础元素,media、profile存放媒体、动画、布局等资源文件。C. stage模型多工程情况下,共有的资源文件放到AppScope下的resources目录。
D.
rawfile目录,支持创建多层子目录,子目录名称可以自定义,文件夹内可以自由放置各类资源文件。目录中的资源文件会被编译成二进制文件,并赋予资源文件ID
。
- 下面的配置存在有几处错误()
module.json5配置文件:
{
"module": {
"name": "entry",
// ...
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
// ...
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"ohos.want.action.home"
]
}
],
"metadata": [
{
"name": "ohos.entry.shortcuts",
"resource": "$profile:shortcuts_config"
}
]
}
]
}
}
在/resources/base/profile/目录下配置shortcuts_config.json配置文件:
{
"shortcuts": [
{
"shortcutId": "id_test1",
"label": "shortcutLabel",
"icon": "$media:shortcutIcon",
"wants": [
{
"bundleName": "com.ohos.hello",
"moduleName": "entry",
"abilityName": "EntryAbility"
}
]
}
]
}
A. 4
B. 2
C. 3
D
. 1
- 在一个包含多个模块(如entry、feature、har、hsp等)的大型HarmonyOS应用项目中,如果要对某个静态共享模块构建出静态构建包产物,如何通过DevEco Studio进行构建
A. 选中hsp模块,点击通过菜单栏make module ‘hsp’
B. 选中hap模块,点击通过菜单栏make module ‘hap’
C. 选中har模块,点击build菜单栏build hap(s)
D.
选中har模块,点击build菜单栏make module ‘har’
- 开发者在编写ArkUI代码时,想要提前预览下所编写的组件的效果,下述哪个组件可以使用DevEco Studio Previewer正常预览?
D
A. @Preview @Component struct LinkSample { @Link message: string; build() { Text(this.message) } }
B. @Preview @Component struct ConsumeSample { @Consume name: string; build() { Text(this.name) } }
C. import { add } from ‘libnative.so’; @Preview @Component struct NativeSample { count: number = add(1, 2); build() { Text(
current count is ${this.count}
) } }D. @Preview @Component struct TitleSample { @StorageProp(‘title’)
title: string = ‘PlaceHolder’; build() { Text(this.title) } }
- 在HarmonyOS应用开发中,当开发者遇到需要分析Release版本应用的崩溃或异常堆栈信息时,为了准确地将堆栈追踪信息对应到源代码的具体位置,以下哪个描述是正确的做法或理解
A.
开发者需手动将Release构建生成的so文件与源代码进行映射,配合第三方工具进行堆栈信息还原,虽然过程繁琐,但最终能定位到问题代码位置B. DevEco Studio通过集成的Release应用堆栈解析功能,自动利用构建时产生的so文件、sourcemap文件、nameCache文件等,无需额外操作即可直接在Release应用中提供详细的源码级堆栈追踪信息
C.
DevEco Studio提供的Release应用堆栈解析功能,要求开发者在遇到问题时,需上传构建产物中的特定文件(如so、sourcemap、nameCache等)到指定工具或界面,借助这些文件辅助解析堆栈信息,实现从Release堆栈到源码的映射,便于快速定位问题
D. 因为Release应用经过优化和去除Debug信息,直接从堆栈跟踪到源代码行号是不可能的,开发者只能依靠日志信息手工推测问题所在
- 开发者小林正在使用DevEco Studio开发一款HarmonyOS应用,并在真机上进行调试。他在运行应用的过程中突然发现一处UI布局需要微调,希望在不中断当前应用运行的情况下看到调整效果,基于DevEco Studio提供的Hot Reload(热重载)能力,以下哪一种做法能让小林最有效地实现他的需求
A.
在不关闭应用的情况下,直接修改代码并保存,借助Hot Reload功能在真机上实时查看布局调整的效果
B. 使用模拟器替代真机进行调试,因为Hot Reload仅在模拟器上支持代码改动的即时生效
C. 继续运行应用,手动重启应用后检查布局是否符合预期
D. 立即停止应用,修改代码后重新编译并部署到真机上
- 在使用DevEco Studio的Profiler进行HarmonyOS应用性能优化的流程中,以下哪个步骤最恰当地描述了开发者利用Profiler工具进行性能问题识别、定位、优化及验证的完整过程
A. 仅通过创建深度分析任务,利用perf数据详细分析性能瓶颈,修改代码后,不需再进行验证直接发布应用
B. 首先使用“Realtime Monitor”实时监控,观察应用资源消耗,一旦发现CPU或内存异常,直接修改代码并重新编译
C.
利用“Realtime Monitor”初步识别性能瓶颈,创建深度分析任务定位根因,根据分析结果优化代码,再用“Realtime Monitor”验证优化效果
D. 在发现应用性能不佳时,直接查看代码逻辑,凭经验修改后,利用Profiler的“Realtime Monitor”确认资源消耗是否降低
- 在一个包含多个模块(如entry、feature、service、library等)的大型HarmonyOS应用项目中,如果某个模块feature对另外一个公共库模块library有依赖,如何通过DevEco Studio正确配置项目依赖关系
A.
在feature的oh-package.json5文件的dependencies字段中配置library的依赖
B. 无需配置,直接在代码中编写import xxx from ‘library’
C. 在feature的build-profile.json5文件的dependencies字段中配置library的依赖
D. 在library的oh-package.json5文件的dependencies字段中配置feature的依赖
- 下面哪种转场效果在入场动画时,表现为从透明度为0、相对于组件正常显示位置x方向平移100vp的状态,到默认的透明度为1、相对于组件不平移的状态,且透明度动画和平移动画的动画时长均为2000ms
A
A. TransitionEffect.OPACITY.animation({duration:2000}).combine(TransitionEffect.translate({x:100}))
B.
TransitionEffect.OPACITY.combine(TransitionEffect.translate({x:100}).animation({duration:2000}))C.
TransitionEffect.asymmetric(TransitionEffect.OPACITY.animation({duration:2000}), TransitionEffect.translate({x:100}).animation({duration: 2000}))D.
TransitionEffect.translate({x:100}).combine(TransitionEffect.OPACITY.animation({duration:2000}))
- 以下关于垂直滚动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行GridItem
多选题
- 某业务团队发现用户对他们App的某个特性使用率并不高,为了节省用户首次下载安装包的体积,考虑将该特性做成按需加载,那么推荐该特性使用的工程模块类型是?
A.
hsp
B. app
C. har
D.
hap
- 哪些是持续部署最佳实践?
A.
环境一致性:保持开发、测试、生产等环境的高度一致性
。B.
自动化部署流程:从代码提交到部署的整个流程应尽可能自动化
。C.
监控和回滚机制:实时监控部署后的应用状态,如有问题及时回滚
。D.
灰度发布:先在小部分用户或区域进行部署,观察没问题后再全面推广
。E. 手工配置管理:
1、直接修改生产环境上的配置来改变系统配置;
2、集群中各节点的行为有所不同;
3、靠人手工恢复环境。手动记载配置包括操作系统、应用服务器、关系型数据库管理系统、Web服务器或其他基础设施设置。
F. 手工部署:持续部署可以采用手工部署的方式发布软件:
1、有一份非常详尽的文档,该文档描述了执行步骤及每个步骤中易出错的地方;
2、以手工测试来确认该应用程序是否运行正确;
3、在发布时,常常会修正一些在发布过程中发现的问题。
G.
开发完成之后再向类生产环境部署:当软件被第一次部署到类生产环境(比如试运行环境)时,就是大部分开发工作完成时,至少是开发团队认为“该软件开发完成了”。
- 以下代码片段哪几处违反了ArkTS语法规范。
function foo(value: number) {
return value;
}
foo('');
foo(0);
foo(undefined);
foo(null);
A.
foo(undefined);
B. foo(0);
C.
foo(null);
D.
foo('');
- 以下代码片段哪几个函数违反了ArkTS语法规范。
function foo1(value1?: number, value2: number) {
if(value1 == undefined){
return value2;
}
return value1 + value2;
}
function foo2(value1: number, value2?: number) {
if (value2 == undefined) {
return value1;
}
return value1 + value2;
}
function foo3(value: number, ...array: number[]) {
return value;
}
function foo4( ...array: number[], value: number) {
return value;
}
A.
foo1
B. foo2
C. foo3
D.
foo4
- ArkTS对并发编程API和能力进行了增强,以下描述正确的是
A.
CPU密集型任务场景中,当任务不需要长时间(3分钟)占据后台线程,而是一个个独立的任务时,推荐使用TaskPool进行开发
。B. 默认情况下,Sendable数据在ArkTS并发实例间(包括主线程、TaskPool&Worker工作线程)传递的行为是拷贝传递。
C.
在并发API的形式上,目前主要有两种:Worker和TaskPool
。D. 单次I/O任务的开发场景中,必须使用TaskPool进行开发。
- 下面关于方舟字节码指令含义说明正确的是
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
- 下面关于ArkTS中export用法,正确的是
A.
export { export1 as alias1 } from "ets file name
";B.
export { export1 } from "ets file name"
;C.
export * as name from "ets file name"
D.
export * from "ets file name"
- 以下代码片段哪几处违反了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. let p = new Point(1.0, 1.0);
B.
p.z = 2.0;
C.
delete p.x;
D.
p.x = 'Hello!';
- ArkTS中不能使用以下哪些类型。
A.
any
B. tuple type
C. union type
D.
unknown
- 下面关于动态import描述正确的是
A.
HAR模块间只有变量动态import时可以进行模块解耦
B.
动态导入import()是个异步接口,调用后将返回一个promise
C. 常量动态import也必须配置runtimeOnly选项
D.
动态import根据入参是否为常量字符串分为常量动态import和变量动态import两种
- Image组件以下哪些方式可显示图片?
全选
A.
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%')
}
}
B.
@Entry
@Component
struct ImageExample {
build() {
Column({ space: 10 }) {
Image("https://www.example.com/xxx.png")
.width(100)
.height(100)
}
}
}
C.
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
}
}
D.
@Entry
@Component
struct ImageExample {
build() {
Column({ space: 10 }) {
Image($r('app.media.earth'))
.width(100)
.height(100)
}
}
}
- 以下哪些实现方式可实现文本字号20的效果(
不选带minFontSize(20),其余全选
)
A.
// 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 })
}
}
B.
// 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 })
}
}
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.
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%')
}
}
- 依次点击A、B、C、D四个按钮,其中不会触发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
- 如何实现类似下图布局
B、C
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()
@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%')
}
}
C.
@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 })
}
}
- 在使用DevEco Studio进行HarmonyOS应用开发和调试过程中,开发者小张遇到应用运行时意外终止的情况,他需要快速定位并解决导致应用崩溃的问题。以下哪些做法可以帮助小张有效分析和处理这些问题
A.
查看DevEco Studio log工具栏输出的错误日志,根据日志提示分析应用崩溃的具体原因及代码位置
B. 利用系统自动生成的FaultLog,包括App Freeze、CPP Crash、JS Crash、System
Freeze和ASan报告,这些报告会详细记录故障发生时的环境、堆栈信息和可能的故障原因,是排查问题的重要参考C.
若遇到App运行卡顿或系统整体无响应(App Freeze, System Freeze)的情况,可以通过性能分析工具中的Frame Insight和Allocation Insight功能,分析应用的资源消耗情况,寻找可能的瓶颈
D. 当怀疑问题是由于C++代码中的内存错误(如数组越界、内存泄露、重复释放内存)引起时,进入“Run/Debug
Configurations”设置界面,勾选启用Address Sanitizer
(ASan),然后重新部署应用进行测试以获取更详细的内存问题报告
- 在基于Stage模型开发的应用项目代码下,每个模块都存在一个module.json5配置文件,用于配置模块的基本信息,以下module.json5配置文件正确的是
A、B
A.
{
"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
}
]
}
}
B.
{
"module": {
"name": "bName",
"type": "shared",
"deviceTypes": [
"default",
"tablet"
],
"deliveryWithInstall": true,
"pages": "$profile:main_pages"
}
}
C.
{
"module": {
"name": "aName",
"type": "har",
"deviceTypes": [
"default", "tablet" ]
}
}
D.
{
"module": {
"name": "cName",
"type": "hsp",
"description": "$string:desc",
"deviceTypes": [
"default",
"tablet"
],
"deliveryWithInstall": true,
"pages": "$profile:main_pages"
}
}
- 使用如下的代码去启动一个ability时,哪种skills定义的组件能够被匹配到:
A、D
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",
"host": "www.test.com",
"type" : "text/plain"
}
]
}
]
B.
"skills": [
{
"uris":[
{
"scheme": "https",
"host": "www.test.com",
"pathStartWith" : "query/books",
"type" : "text/plain"
}
]
}
]
C.
"skills": [
{
"uris":[
{
"scheme": "https",
"host": "www.test.com",
"pathStartWith" : "query/books",
"type" : "text/*"
}
]
}
]
D.
"skills": [
{
"uris":[
{
"scheme": "https",
"type" : "text/*"
}
]
}
]
- HSP支持导出ArkUI组件、接口,供应用内的其他HAP/HSP引用,下面正确的是(
全选
)
A.
导出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;
}
对外暴露的接口,需要在入口文件index.ets中声明:
// library/index.ets
export { Log, add, minus } from './src/main/ets/utils/test';
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.
导出native方法,在HSP中也可以包含C++编写的so。对于so中的native方法,HSP通过间接的方式导出,以导出liblibrary.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';
- 某个应用的启动框架配置文件详细信息如下,以下说法正确的是:
{
"startupTasks": [
{
"name": "StartupTask_001",
"srcEntry": "./ets/startup/StartupTask_001.ets",
"dependencies": [
"StartupTask_002",
"StartupTask_003"
],
"runOnThread": "taskpool",
"waitOnMainThread": false
},
{
"name": "StartupTask_002",
"srcEntry": "./ets/startup/StartupTask_002.ets",
"dependencies": [
"StartupTask_004"
],
"runOnThread": "taskpool",
"waitOnMainThread": false
},
{
"name": "StartupTask_003",
"srcEntry": "./ets/startup/StartupTask_003.ets",
"runOnThread": "taskpool",
"waitOnMainThread": false
},
{
"name": "StartupTask_004",
"srcEntry": "./ets/startup/StartupTask_004.ets",
"runOnThread": "taskpool",
"waitOnMainThread": false
},
{
"name": "StartupTask_005",
"srcEntry": "./ets/startup/StartupTask_005.ets",
"runOnThread": "mainThread",
"waitOnMainThread": true
},
{
"name": "StartupTask_006",
"srcEntry": "./ets/startup/StartupTask_006.ets",
"runOnThread": "mainThread",
"waitOnMainThread": false,
"excludeFromAutoStart": true
}
],
"configEntry": "./ets/startup/StartupConfig.ets"
}
A. StartupTask_003会在StartupTask_004之后执行
B.
StartupTask_006会在AbilityStage的onCreate前初始化完成
C.
StartupTask_001会在StartupTask_004之后执行
;D.
StartupTask_005会在主线程执行
- 在基于Stage模型开发的应用项目代码下,都存在一个app.json5配置文件,用于配置应用的全局信息,以下app.json5配置文件错误的是
A、B
A.
{
"app": {
"bundleName": "com.example.myapplication",
"vendor": "example",
"versionCode": 1000000,
"versionName": "1.0.2",
"icon": "$media:app_icon",
"label": "app_name",
"bundleType": "app"
}
}
B.
{
"app": {
"bundleName": "com.example.myapplication",
"vendor": "example", "versionCode": 1000000,
"icon": "$media:app_icon",
"label": "$string:app_name",
"bundleType": "app"
}
}
C.
{
"app": {
"bundleName": "com.example.myapplication",
"vendor": "example",
"versionCode": 1000000,
"versionName": "1.0.2",
"icon": "$media:app_icon",
"label": "$string:app_name",
"bundleType": "app"
}
}
D.
{
"app": {
"bundleName": "com.example.myapplication",
"vendor": "example",
"versionCode": 1000000,
"versionName": "1.0.2",
"icon": "$media:app_icon",
"label": "$string:app_name"
}
}
- 通过如下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.vieData",
],
"entities":[
"entity.system.browsable",
],
"uris":[
{
"scheme": "http",
"host": "www.test.com",
"port": "8080",
"path": "path"
}
]
}
]
}
C.
{
"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
}
]
}
]
}
D.
{
"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
}
]
}
]
}
- 项目组开发的HarmonyOS应用工程,为了保护hap代码资产,如何在DevEco Studio中启用混淆的功能,并设置相应的混淆规则
A.
在混淆规则配置文件obfuscation-rules.txt中进行混淆规则的配置
B. release模式下将buildOption/arkOptions/ruleOptions/enable设置为false
C.
release模式下将buildOption/arkOptions/ruleOptions/enable设置为true
D. 在混淆规则配置文件consumer-rules.txt中进行混淆规则的配置
- List组件onScrollIndex事件触发时机是
A. List组件首次加载完成时触发
B.
List组件显示区域内第一个子组件或最后一个子组件或中间位置子组件索引值变化时触发
C. List组件滚动停止时触发
D.
List组件列表滚动时每帧触发
- 以下哪些是可以在Navigation中使用pushPathByName接口传递的params的参数类型
A. map<string,string>
B.
arrayBuffer
C.
record<string,string>
D.
string
- 以下关于ArkTS线程实例间传输实现方式描述正确的是(
全选
)
import { taskpool, worker } from '@kit.ArkTS';
@Sendable
class A {}
let a: A = new A();
@Concurrent
function foo(a: A) {}
let task: taskpool.Task = new taskpool.Task(foo, a)
let w = new worker.ThreadWorker("entry/ets/workers/Worker.ets")
taskpool.execute(task).then(() => {});
w.postMessageWithSharedSendable(a);
task.setCloneList([a]);
taskpool.execute(task).then(() => {});
w.postMessage(a);
A. w.postMessage(a);,Worker 共享传输实现方式
B. taskpool.execute(task).then(() => {});,TaskPool 共享传输实现方式
C. w.postMessageWithSharedSendable(a);,Worker 共享传输实现方式
D. task.setCloneList([a]); taskpool.execute(task).then(() => {});,TaskPool 共享传输实现方式
- 以下napi代码有问题的是
B、D
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.
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;
}
C.
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;
}
);
}
D.
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;
}
- 以下代码片段哪几个class/interface违反了ArkTS语法规范。
class Person {}
class Student extends Person {}
class Instructor implements Person {}
interface Shape {}
interface Circle implements Shape {}
class Square implements Shape {}
A.
Instructor
B.
Circle
C. Square
D. Student
- 当前动态import支持导入的模块类型有哪些?
全选
A. 动态import支持加载HSP模块
B. 动态import支持加载远程HAR模块
C. 动态import支持加载OHPM模块
D. 动态import支持加载本地HAR模块
- 下面代码符合ArkTS编程规范的是
ACD
A.
let maxCount = 10;
let isCompleted = false;
let pointX = 0;
let pointY = 0;
B.
let maxCount = 10, isCompleted = false;
let pointX, pointY;
pointX = 10; pointY = 0;
C.
for (let idx = 0; idx < 5; ++idx)
console.log(idx);
D.
if (condition) {
console.log('success');
}
- 哪些是持续集成最佳实践?
全选
A. 构建相同代码的 Pipeline 运行多次,得到结果不同。比如,基于同一代码基线,一条 Pipeline 构建了 5次,只要最后一次通过即可。
B. 快速反馈机制:让开发人员能迅速得知集成结果和测试状态。
C. 自动化构建:确保构建过程是完全自动化的,减少人为错误。
D. 通常项目上会有一个专职 Ops,在项目可以发布的时候手动触发部署流程,或者需要传递很多参数,让 Pipeline 运行起来。
E. 全面的测试套件:包括单元测试、集成测试、功能测试等,以提高代码质量。
F. 频繁提交代码:鼓励开发人员经常提交小的代码更改,以便更快地发现问题。
- 用户购买商品后,你需要及时发放相关权益。但实际应用场景中,若出现异常将导致应用无法知道用户实际是否支付成功,从而无法及时发放权益,即出现掉单情况。为了确保权益发放,你需要在以下哪些场景检查用户是否存在已购未发货的商品:
A.
createPurchase请求返回1001860051-由于已经拥有该商品,购买失败时
B.
createPurchase请求返回1001860001-内部错误时
C. finishPurchase请求返回1001860052-由于未拥有该商品,发货失败时
D.
应用启动时