应用开发中使用的各类资源文件,需要放入特定子目录中存储管理,以下关于资源说法错误的是
A. stage模型多工程情况下,共有的资源文件放到AppScope下的resources目录。
B.resfile目录,应用安装后,resfile资源会被解压到应用沙箱路径,通过Context属性resourceDir获取
到resfile资源目录后,可通过文件路径访问。
C.rawfile目录,支持创建多层子目录,子目录名称可以自定义,文件夹内可以自由放置各类资源文件。目录中的资源文件会被编译成二进制文件,并赋予资源文件ID。
D.base目录是默认存在的目录,二级子目录element用于存放字符串、颜色、布尔值等基础元素,media、profile存放媒体、动画、布局等资源文件。
关于代码门禁理解正确的是
A.代码门禁是一项代码质量保障措施。目的是要求开发人员提交的代码必须满足一些要求才能合入代码仓库。门禁必须强制要求包括编译通过、单元测试覆盖率达标、代码静态检查无告警、全量功能测试用例、DFX专项测试都通过。
B.门禁级检查的范围和版本级检查的范围保持一致,尽可能多的在MR门禁阶段就拦截防护住问题,保障问题可以及时清理掉。
C. 构建是在代码合并后检查已提交代码的功能完整性,这种方法会导致代码合并到master后编译失败导致没有可用版本部署。通过提高滚动构建的频度就可以代替代码门禁,保障代码主干及时发现并解决问题。
D.代码门禁则是在代码合并之前就验证代码来保护主千分支的完整性。通过这种方式,可以保护主分支代码避免因合码导致的构建中断,以确保 master 分支代码始终是可部署的,并且不会因明显的错误而影响到你正在并行开发的同事工作。
一个应用项目工程中,模块依赖关系如下图所示,那么在最终编译结果.app文件中,存在的编译产物是:
A.A.hap + B.har + D.hsp
B.A.hap + B.har + C.har + D.hsp
C.A.hap + D.hsp + C.har
D.A.hap + D.hsp
应用程序开发调试过程中,经常需要安装新应用进行调测,下面安装应用操作错误的是
A. bm install -p ohosapp.hap
B. bm install-p /data/app/
C. bm install -p ohosapp.hap -r
D.hdc install-p ohosapp.hap
我们需要避免在逐帧调用的接口中执行耗时操作,下面哪个选项不属于上述的接口?
A. onTouch
B. aboutToReuse
C. onScroll
D.onAreaChange
一个应用有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.0个
C.1个
D.2个
以下哪些赋值语句在ArkTS中是合法。
class C {}
let value1: number = null;
let value2: string | null = null;
let value3: string | undefined = null;
let value4: C = null
A.value2
B.value1
C.value4
D.value3
如何实现类似下图布局
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 })
}
}
关于静态检查描述错误的是:
A.静态检查 可以检测代码中的语法错误和潜在的逻辑错误,也支持检测代码在运行时现的错误,因此静态检查可以替代动态测试。
B.静态检查 是指使用静态代码分析工具对软件的“静态"(不运行的)代码进行分析的一种方法,找出代码中潜在的漏洞。静态代码分析器检查源代码,找出特定的漏洞,并检查代码是否符合各种编码标准。
C.静态分析工 具也在不断改进和升级。使用高级的静态分析工具可以提高代码检测的准确性和效率。例如,一些静态分析工具可以检测代码中的内存泄漏、死锁问题,从而提高代码的质量和可靠性。
D. HarmonyOS应用可以采用ARKTS静态检查工具
一个复杂的项目,该项目不仅包含主入口模块(Entry Module), 还有多个特性的功能模块
(Feature Modules/HSP), 并且这些模块间存在着相互调用关系。为了确保在调试过程中能够完整地测试所有交互逻辑,需要将涉及到的所有模块的HAP包都部署到目标设备上。请从以下选项中选择正确的操作步骤来配置DevEco Studio, 以便一次性部署和调试项目中的多个模块
A.无需特殊配置, DevEco Studio会自动检测到项目中的所有模块依赖,并在每次调试运行时自动部署所有相关HAP包。
B.直接 点击运行按钮,DevEco Studio会弹出对话框询问需要部署哪些模块,从中选择需要的模块后开始调试。
C. 进入“Run> Edit Configurations'菜单,
在“Deploy Multi Hap"选项卡下,勾选“DeployMulti Hap Packages",随后在列表中选择需要部署的模块。
D.在项目结构界面手动个选择每个模块,单独编译并逐一将生成的HAP包通过HDC命令推送到设备上
以下关于应用架构技术选型说法不正确的是()
A. 对于初始版本的应用,功能比较简单,可以考虑采用单HAP加上多个HAR工程构建代码工程。
B.随着业务的发展,应用功能会越来越多,某些功能可以做成动态加载,动态加载的模块采用HAR工程来构建,方便复用和共享。
C.一些应用的扩展能力,比如备份、服务卡片,可以采用ExtensionAbility做成单独的feature HAP包独立分发。
D.元服务和应用可以共用一个代码工程,采用多目标产物构建方式,构建出应用和元服务两个产物,用于上架。
应用发生崩溃,()接口可以获取到崩溃时调用栈
A. hiLog
B. hiTraceMeter
C.hiDebug
D. hiAppEvent
现有一个宽高分别为200px的XComponent组件,其绑定了一个
XComponentController(xcController),依次进行如下操作:
(1)xcController.setXComponentSurfaceRect( {surfaceWidth: 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,surfaceHeight:-100})之后,调用xcController.getXComponentSurfaceRect()的返回值为
A. { offsetX: 81, offsetY: -89, surfaceWidth: 150, surfaceHeight: 500 }
B. f offsetX: 75, offsetY: -100, surfaceWidth: 150, surfaceHeight: 500 }
c.{ offsetX: 81, offsetY: -89, surfaceWidth: 200, surfaceHeight: 0 }
D. { offsetX: -20, offsetY: 50, surfaceWidth: 200, surfaceHeight: 500 }
在moduleA(HAP类型)中有一个图片名为image.png,在moduleB(HAR类型)也存在一个图片名为image.png,而moduleA依赖于moduleB,那么在moduleA的编译产物hap包中,image.png存在情况是:
A.仅存在moduleA的image.png
B.仅存在moduleB的image.png
C.两者都存在
D.两者都不存在
如下哪些方式可实现图片动态播放?
A.
@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%')
}
}
B.
import {AnimationOptions, AnimatedDrawableDescriptor} from '@ohos.arkui.drawableDescriptor'
import image from '@ohos.multimedia.image'
@Entry
@Component
struct ImageExample {
pixelmaps: Array
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;
}
}
C.
import {AnimationOptions, AnimatedDrawableDescriptor} from '@ohos.arkui.drawableDescriptor'
import image from '@ohos.multimedia.image'
@Entry
@Component
struct ImageExample {
pixelmaps: Array
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
desiredPixelFormat: image.PixelMapFormat.RGBA_8888
})
await imageSource.release()
return createPixelMap
}
private async getPixelMaps() {
let Mypixelmaps:Array
return Mypixelmaps;
}
}
D.
@Entry
@Component
struct ImageExample {
build() {
Column({ space: 10 }) {
Image($r('app.media.earth')) //对应资源图片名后缀为gif
.width(100)
.height(100)
}
}
}
当前动态import支持导入的模块类型有哪些?
A.动态import支持加载OHPM模块
B.动态import支持加载本地HAR模块
C.动态import支持加载远程HAR模块
D.动态import支持加载HSP模块
DevEco Studio提供HarmonyOS应用/服务的UI预览界面与源代码文件间的双向预览功能,支持ets文件与预览器界面的双向预览。关于双向预览,下列选项说法错误的是?
A.双向预览不支持通过组件的属性面板实时修改属性或样式。
B.选中组件树中的组件,则对应的代码块和UI界面也会高亮显示。
C.选中布局文件中的代码块,则在UI界面会高亮显示,组件树上的组件节点也会呈现被选中的状态。
D.选中预览器UI界面中的组件,则组件树上对应的组件将被选中,同时代码编辑器中的布局文件中对应的代码块高亮显示。
DevEco studio提供的便捷功能来提高开发效率。他了解到,通过一个特定的操作流程,可以直接依据父类的模板生成子类中需要重写的方法代码,而无需手动编写完整方法体,在DevEco studio中,如何正确使用0verride Methods功能来快速生成子类需要重写的方法代码
A.
在项目结构视图中找到目标子类,双击打开后直接在代码编辑区输入重写方法的签名,DevEcOStudio将自动完成剩余代码。
)B.
通过菜单栏File>Settings,配置Override Methods快捷方式,之后在代码中仅需选中父类方法名即可自动在子类中生成重写代码,
C.将光标定位到子类的定义处,按下Ctrl+0(或右键单击选择Generate.>Override Methods),在弹出的对话框中选择要重写的方法,点击OK完成生成。
D.将光标放置于任何代码行,按下Ctrl+B,然后在弹出菜单中选择Override Methods,之后勾选需要重写的方法并确认