-
在数字化浪潮下,开发者们始终在追寻更高效的开发方式。传统开发模式效率低,人力、运维、服务器等成本问题,逐渐成为开发者创新的“绊脚石”。 Cloud Foundation Kit(云开发服务)为开发者提供了鸿蒙应用/元服务高效开发的解决方案,您可按需使用云函数、云数据库、云存储、预加载等云端服务,专注于应用的创新和业务逻辑的实现,开发周期缩短50%! 一、低成本运维:从“负重前行”到“轻装上阵”云开发服务通过提供开箱即用的云函数、数据库、存储等后端核心能力,使开发者无需手动构建和管理云端资源,即可快速搭建完整的后端服务,显著提升应用功能的开发与上线效率。同时,云开发服务为各类能力配置了免费资源额度,降低新用户的试错成本和初期资源投入。 二、资源弹性伸缩, 减少闲置资源浪费云开发服务通过弹性伸缩与按量计费机制,有效解决了传统架构应对业务波峰波谷的痛点。在业务高峰时,系统可自动扩容保障稳定性;当业务量回落低谷时,资源自动收缩,避免因采购高性能服务器集群导致的资源闲置浪费,使开发者仅需为实际消耗的资源付费,显著提升资源利用率。同时,云开发服务为各类能力配置了免费资源额度, 对于测试验证阶段原型或功能简单的轻量级APP,其免费额度已能覆盖核心业务需求,大幅降低初期投入门槛。 三、端云一体化,端侧开发轻松变全栈DevEco Studio的端云一体化开发能力通过整合HarmonyOS应用/元服务的端侧与云侧开发流程,为开发者提供高效开发“快车道”——开发者仅需一套开发工具、一个开发团队,即可同时完成HarmonyOS应用/元服务的端侧与云侧开发,前端工程师轻松化身为全栈工程师,大幅缩短应用上线周期。(数据为典型场景下的参考值,实际效果会因应用复杂度等因素有所不同)AppGallery Connect致力于为应用的创意、开发、分发、运营、经营各环节提供一站式服务,构建全场景智慧化的应用生态体验。为给您带来更好服务,请扫描下方二维码或者点击此处免费咨询。 如您有任何疑问,请发送邮件至agconnect@huawei.com咨询,感谢您对HUAWEI AppGallery Connect的支持!
-
如何缩短内容与用户的触达路径,如何覆盖多样化的分发渠道并差异化运营?华为AppGallery Connect(简称AGC)向开发者推出App Linking技术服务。此服务是HarmonyOS系统层为开发者开放的统一链接能力,不仅有效提升了用户体验,而且也提升了链接转换率。案例展示:1、 哔哩哔哩,碰一碰覆盖线下内容分享,操作步骤立省60%哔哩哔哩接入App Linking与碰一碰分享服务,通过碰一碰分享B站视频。相较于传统的通信软件分享视频,操作步骤立省60%。2、美团一扫即达,服务快人一步,操作效率提升30%以上美团App接入App Linking,无需用户打开App,通过系统扫码直接解锁共享单车、租借充电宝。负一屏、控制中心、系统相机均可解锁,操作入口增加3倍。一步扫码直达,操作效率提升30%以上。 3、多乐掼蛋游戏,手机碰一碰快速闭环游戏邀请,操作步骤立省60%多乐掼蛋游戏,接入App Linking+碰一碰分享服务,实现手机碰一碰快速要求玩家加入游戏。全新的游戏邀请体验,操作便捷,趣味十足,适合宿舍、节假日家庭聚会等场景。相较于传统的通信软件分享视频,操作步骤立省60%。 鸿蒙App Linking现已助力多类型应用实现场景化链接跳转,目前该能力已开放给HarmonyOS开发者,诚邀您体验智能链接分发带来的效率革新!点击下方链接,即刻开启鸿蒙生态场景化运营新篇章——点击链接即可体验:App Linking AppGallery Connect致力于为应用的创意、开发、分发、运营、经营各环节提供一 站式服务,构建全场景智慧化的应用生态体验。为给您带来更好服务,请扫描下方二维码或者点击此处免费咨询。如您有任何疑问,请发送邮件至agconnect@huawei.com咨询,感谢您对HUAWEI AppGallery Connect的支持!
-
线下服务场景中,开发者常面临用户触达率低、推荐不精准、转化效果差等问题。传统推送方式依赖用户主动搜索或广告曝光,无法结合实时位置精准匹配需求,导致服务推荐滞后、用户体验不佳。对此,HarmonyOS为开发者准备了一种智能、低门槛、高转化的近场服务解决方案——POI场景及信标设备场景:基于用户实时位置或通过用户手机定位与信标设备联动,智能识别用户场景,并经由小艺建议等入口推荐服务,从而提升用户触达率和满意度。POI及信标类近场服务的典型特点包括:精准定位:1-200米范围内动态感知用户位置。场景化推荐:结合POI或信标设备,匹配用户当下需求。无缝体验:通过系统级入口(如小艺建议)直接触达用户,常规点选多层级步骤缩减约75%至一步直达操作。一、近场服务典型应用场景 二、实际应用案例场景一(POI):智慧文旅——效率、体验双升级,减少约80%操作步骤 游客靠近景区时,小艺建议获取购票服务卡片推荐,一键直达购票页面,相较常规点评软件的购票方式可减少约80%操作步骤; 进入景区游览时,基于景区内不同景点推荐景点介绍详情页,景点讲解、景点推荐、游览路线推荐等一目了然,再也不用边走边问。场景二(信标设备):商铺引流——坪效提升新引擎 商铺部署信标设备后,用户进入信标连接范围即可收到传输信号,通过小艺建议获取商铺热门产品、优惠活动、折扣套餐等推荐; 相较未部署信标设备的商铺依赖自然流量,信标部署商铺可主动“出击”,提前曝光吸引用户关注眼球,从而提升商铺的客流量,进而潜在提升会员转化及客单成交率。 欢迎广大鸿蒙开发者体验近场服务。如果您是一位鸿蒙开发者,赶快加入体验服务,让我们携手共进,共享鸿蒙发展的无限机遇,点击链接即可体验:POI场景、信标设备场景。AppGallery Connect致力于为应用的创意、开发、分发、运营、经营各环节提供一站式服务,构建全场景智慧化的应用生态体验。为给您带来更好服务,可扫描下方二维码或者点击此处免费咨询。 如您有任何疑问,请发送邮件至agconnect@huawei.com咨询,感谢您对HUAWEI AppGallery Connect的支持!
-
叮叮叮……“喂,您好哪位?”“小张,XXX”领导同事来电被误以为是骚扰电话直接挂断,或无法判断来电人小心翼翼试探,这些职场上的尴尬时刻你遇到过吗?华为AppGallery Connect(简称AGC)推出的企业联系人信息来去电页面显示能力让你彻底告别这些尴尬时刻,来电显示一览无遗,重要电话绝不错过,沟通效率up up!一、什么是企业联系人信息来去电页面显示? 华为企业联系人信息来去电页面显示是基于Call Service Kit(通话服务)提供的面向企业办公场景的能力,来去电时,页面可以显示已安装企业应用的联系人信息,方便用户识别来去电人信息,快速回应,增强企业内部沟通效率。(本功能仅供企业应用开发者接入) 企业来电显示能力从传统的8步可缩减至2步,沟通效率提升75%,让沟通简单又高效!(此数据为伙伴侧提供案例参考,具体以实际应用落地效果为准)二、如何接入企业联系人信息来去电页面显示能力?企业应用开发者将申请信息发送至公共邮箱:agconnect@huawei.com。邮件标题:【申请公司名】—企业来电显示能力—Developer ID。邮件内容需包括:开发者接入企业来电显示能力的应用使用主体、应用名称、应用ID、应用包名、场景说明(具体描述该应用对应通讯录量级等使用的必要信息)。申请成功后,需要重新申请调试Profile,并且在DevEco Studio中替换新申请的调试Profile。三、用户手机如何进行设置? 打开“电话”> 点击右上角“更多”图标 > 前往“设置”> 找到“陌生号码和信息识别” > 打开对应企业应用的号码识别功能开关 页面效果展示 AppGallery Connect致力于为应用的创意、开发、分发、运营、经营各环节提供一 站式服务,构建全场景智慧化的应用生态体验。为给您带来更好服务,请扫描下方二维码或者点击此处免费咨询。如您有任何疑问,请发送邮件至agconnect@huawei.com咨询,感谢您对HUAWEI AppGallery Connect的支持!
-
问题背景针对App产品存在多个客户端版本的情况下,同时开发 多 个 App 时,由于业务目标、用户群体可能存在差异,且需兼顾协同效率与质量稳定性,容易暴露出比单一 App 开发更复杂的问题多产品App核心问题,本质是 “个性需求与共性能力的平衡失控”:资源分散导致效率低,协同缺失导致体验乱,版本混乱导致风险高。无 模块化架构设计,项目陷入 “开发慢、改不动、问题多” 的恶性循环。 安卓开发现状人力资源分配矛盾:若 多 个 App 并行开发,核心开发人员(如架构师、资深工程师)需同时跟进多个项目,精力被稀释,导致技术决策延迟、关键问题响应变慢。基层开发人员若按 “1 个 App 对应 1 个团队” 划分,会出现 “同一项基础功能(如图片上传、异常监控)3 个团队各做一套” 的情况,重复劳动率高达 40%-60%,直接拉长整体开发周期。技术栈与规范难统一若 多个 App 由不同团队开发,可能因 “团队习惯” 采用差异技术方案,导致后续跨 App 协作(如人员轮岗、问题排查)成本陡增即使预先制定规范,也可能因 “赶进度” 出现执行偏差(如命名规则、接口格式不统一),后期需额外投入人力做标准化整改共性能力重复开发,维护难度翻倍:多个 App 必然存在共性能力(如登录、支付、网络请求、数据埋点),若未提前抽象复用,会导致:同一功能出现 多套代码,修复一个共性 Bug(如登录接口超时逻辑)需在 3多个 App 中分别修改,漏改概率增加共性能力升级(如支付渠道新增)需 多个团队同步适配,协调成本随 App 数量呈指数级增长版本规划与测试压力陡增多 个 App 的版本迭代节奏可能不同(如 A App 需每月一更,B App 每两周一更,C App 紧急上线),测试资源(如测试设备、自动化脚本)需在 3 个项目间频繁切换,导致测试覆盖率下降,漏测风险升高。若 多 个 App 依赖同一基础组件(如自研的网络库),该组件升级后,需 多个 App 同步完成兼容性测试才能发布,任何一个 App 的测试延迟都会拖慢整体进度。线上问题连锁反应若共性能力(如埋点 SDK)存在隐藏 Bug,可能导致 多个 App 同时出现数据异常,线上故障排查时需 “多线并行定位”,定位时间比单一 App 问题长 2-3 倍。某一个 App 的紧急发布(如修复崩溃 Bug)可能因 “打包环境共享”“配置文件混淆” 影响其他 App 的发布包稳定性(如误打包旧版本代码)。业务与扩展性:差异需求失控多 个 App 的业务差异(如 A App 需社交功能,B App 需电商功能,C App 需工具功能)可能要求对共性能力做 “定制化修改”(如登录模块为 A App 新增 “第三方社交账号登录”,为 B App 新增 “手机号一键登录”),若修改未抽象成可配置逻辑,会导致共性模块逐渐 “臃肿”,最终失去复用价值 鸿蒙解决方案 整体架构设计思路: 备注:一个业务功能,即为一个工程(整个工程下的一个文件夹),编译出后是一个HAR/HSP类型的包。多个HAR/HSP组合打包出的包为HAP包。(HAR、HSP、HAP包区别参考:https://developer.huawei.com/consumer/cn/doc/architecture-guides/tools-v1_2-ts_35-0000002343405565) 在鸿蒙生态中,通过 ArkTS 语言和 ArkUI 框架的原生支持,可以高效实现 "一套工程、多 App 发布" 的架构。具体实现策略:功能模块包模块化设计:可插拔组件化开发。由组件复用提供基础能力,例如:一键加油、爱车服务、无感支付、在线订单、高德、在线商城等业务功能,每个都由HAR/HSP工程创建,实现业务功能与业务无关的网络库、埋点SDK、图片加载等,每个都由HAR/HSP工程创建,实现基础功能。由业务功能HAR/HSP包调用,为业务功能提供基础能力上述业务功能HAR/HSP包,基础功能HAR/HSP包,可自由组合,被HAP工程引入,由HAP工程打包出用户版、商户版、供应商版三个版本工程架构设计,组件复用,实现一套代码库支撑多 App用户版HAP工程打包:创建hapTasks类型的工程(运行出的包为HAP包),将多个需要的多个业务功能包( HAR/HSP工程(文件夹))引入,编码实现用户版的功能。商户版、供应商版也是如此。用户版打包:需为车主提供便捷的车辆养护、维修、紧急救援等服务,引入一键加油、爱车服务、无感支付HAR/HSP,实现相关业务逻辑后,打包成HAP包商户版打包:需帮助维修店/4S店高效管理客户和服务流程,引入在线订单、高德HAR/HSP,实现相关业务逻辑后,打包成HAP包供应商版打包:为配件供应商提供B2B销售渠道和管理工具,引入在线商城、充值相关渠道配置HAR/HSP,实现相关业务逻辑后,打包成HAP包如何打HAP包(多个app的差异化打包):。上述用户版、商户版、供应商版工程,每个工程需要配置:包名、签名、证书、打包输出的文件夹路径、相关资源(如主题资源、图片资源等)每个 HAP 的 module.json 中,bundleName、bundleType、versionCode、debug、minAPIVersion 保持一致;module 的 name 字段互不相同;minCompatibleVersionCode、targetAPIVersion 保持一致配置后,通过执行Hvigor命令,打包成HAP包(Hvigor脚本参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/packing-tool#多工程打包指令) 解决痛点模块化设计,代码复用率提升:基础组件统一维护,避免重复开发(复用率可达 70%-90%)。功能模块通过配置按需加载,无需为每个 App 单独编写代码,并且可以将可插拔的模块组合打包多个App。组件复用,开发效率提升:修改公共组件自动同步到所有 App,减少重复测试和发布流程。新增功能只需在对应模块开发,通过配置快速集成到需要的 App。维护成本降低:单一工程结构减少代码仓库管理复杂度,团队协作更高效。版本控制更简单,所有 App 基于同一代码基线演进。灵活扩展能力:新增 App 只需创建新的配置文件和专属资源,无需复制代码。功能模块可独立升级,不影响其他 App。 组件设计思路: 组件复用,设计思路:基础层组件:网络库、埋点SDK、图片加载等与业务无关联的,放入基础层,可供任何App提供底层能力业务层:支付模块、订单、商品详情等,与业务强关联,需要考虑多个App版本的不同差异化能力、公共能力,进一步抽出例如可选复用的业务功能,作为多个App集成的公共业务差异化的使用动态Feature包由多个App灵活调用,并且可设计多个Feature包,可插拔给多个App组合使用产品层:根据不同App版本,将公共资源统一管理、特定产品特定资源文件、代码中动态加载资源,封装在不同的App中每个App就固定使用这些资源、动态加载业务层的业务包,灵活配置不用App版本之间所需要的业务功能基础层、业务层功能维护: 每个基础能力、业务模块完全独立开发,无需关心是哪个App来调用,仅需关注本身能力、业务的迭代开发 基础组件案例案例1,验证码组件: import { inputMethod } from '@kit.IMEKit';import { emitter } from '@kit.BasicServicesKit';import { hilog } from '@kit.PerformanceAnalysisKit';@Extend(Text)function verifyCodeUnitStyle() { .fontSize($r("sys.float.ohos_id_text_size_body1")) .fontWeight(60) .textAlign(TextAlign.Center) .width($r("app.integer.verify_code_code_unit_with")) .height('100%') .margin({ left: $r("app.integer.verify_code_code_unit_margin"), right: $r("app.integer.verify_code_code_unit_margin") }) .border({ width: { bottom: $r("app.integer.verify_code_code_border_width") }, color: { bottom: Color.Grey }, style: { bottom: BorderStyle.Solid } })}@Componentstruct VerifyCodeComponentWithoutCursor { @State codeText: string = ""; private readonly verifyID: string = "verifyCodeComponent"; private inputController: inputMethod.InputMethodController = inputMethod.getController(); // 监听键盘弹出收起状态 @State isKeyboardShow: boolean = false; private verifyCodeLength: number = 6; private isListen: boolean = false; private textConfig: inputMethod.TextConfig = { inputAttribute: { textInputType: inputMethod.TextInputType.NUMBER, enterKeyType: inputMethod.EnterKeyType.GO }, }; private codeIndexArray: Array<number> = Array.from([0, 1, 2, 3, 4, 5]); // 注册路由返回函数,案例插件不触发 popRouter: () => void = () => { }; aboutToAppear(): void { // 注册返回监听,包括点击手机返回键返回与侧滑返回 this.listenBackPress(); } async attachAndListen(): Promise<void> { focusControl.requestFocus(this.verifyID); await this.inputController.attach(true, this.textConfig); logger.info("attached"); this.listen(); this.isKeyboardShow = true; } listenBackPress() { let innerEvent: emitter.InnerEvent = { eventId: 5 }; // 收到eventId为5的事件后执行回调函数 emitter.on(innerEvent, () => { if (this.isKeyboardShow) { // 退出文本编辑状态 this.inputController.hideTextInput(); this.isKeyboardShow = false; } else { this.popRouter(); } }); } aboutToDisappear(): void { this.off(); // 关闭事件监听 emitter.off(5); } /** * TODO 知识点:绑定输入法 */ async attach() { await this.inputController.attach(true, this.textConfig); logger.info("attached"); } /** * TODO:知识点:解绑 */ off(): void { this.inputController.off("insertText"); this.inputController.off("deleteLeft"); this.isListen = false; logger.info("detached"); // 退出文本编辑状态 this.inputController.hideTextInput(); this.isKeyboardShow = false; } /** * TODO 知识点:订阅输入法代插入、向左删除事件,从而获得键盘输入内容 */ listen() { if (this.isListen) { return; } this.inputController.on("insertText", (text: string) => { if (this.codeText.length >= this.verifyCodeLength || isNaN(Number(text)) || text === ' ') { return; } this.codeText += text; if (this.codeText.length === this.verifyCodeLength) { logger.info("VerifyCode: %{public}s", this.codeText); } logger.info("VerifyCode [insert]: %{public}s", this.codeText); }) this.inputController.on("deleteLeft", (length: number) => { this.codeText = this.codeText.substring(0, this.codeText.length - 1); logger.info("VerifyCode [delete left]: %{public}s", this.codeText); }) this.isListen = true; logger.info("listener added"); } /** * TODO 知识点:部分验证码场景要完全禁止对输入验证码的选中、复制等功能,因此可以使用Text组件完成 */ @Builder buildVerifyCodeComponent() { Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) { ForEach(this.codeIndexArray, (item: number, index: number) => { Text(this.codeText[item]) .verifyCodeUnitStyle() }, (item: number, index: number) => item.toString()) } .id(this.verifyID) /** * TODO:知识点:当可视面积变化时进行绑定注册与解绑 */ .onBlur(() => { this.off(); }) .backgroundColor(Color.Transparent) .height($r("app.integer.verify_code_verify_code_height")) .margin({ left: $r("sys.float.ohos_id_card_margin_start"), right: $r("sys.float.ohos_id_card_margin_start") }) .defaultFocus(true) .onClick(() => { // TODO 知识点:点击本组件时弹出输入法,因为这里使用的是Text组件,因此需要重新attach,而不能直接使用showSoftKeyboard this.attachAndListen(); }) } build() { Row() { this.buildVerifyCodeComponent() } }}@Builderexport function VerifyCodeViewBuilder() { VerifyCodeView()}/** * 验证码组件:禁用选中、复制、光标 */@Componentexport struct VerifyCodeView { popRouter: () => void = () => { }; build() { NavDestination(){ Column() { VerifyCodeComponentWithoutCursor({ popRouter: this.popRouter }) } .height('100%') .width('100%') .justifyContent(FlexAlign.Center) } .title('验证码界面') }}/** * 日志打印类 */class Logger { private domain: number; private prefix: string; private format: string = '%{public}s, %{public}s'; constructor(prefix: string) { this.prefix = prefix; this.domain = 0xFF00; this.format.toUpperCase(); } debug(...args: string[]) { hilog.debug(this.domain, this.prefix, this.format, args); } info(...args: string[]) { hilog.info(this.domain, this.prefix, this.format, args); } warn(...args: string[]) { hilog.warn(this.domain, this.prefix, this.format, args); } error(...args: string[]) { hilog.error(this.domain, this.prefix, this.format, args); }}export let logger = new Logger('[CommonAppDevelopment]') 案例2,地址选择器组件: import { window } from '@kit.ArkUI';import { AddressInfo, AddressType, CommonAddressList, Location, Province } from '../model/AddressModel';import { JsonUtils } from '../utils/JsonUtils';/** * 常量 */export default class Constants { // 自定义TabBar切换tab动画分隔线宽度 public static readonly DIVIDER_WIDTH: number = 20; // 顶部省市区间隔 public static readonly AREA_SPACE: number = 12; // rawfile目录下的省市区json文件 public static readonly JSON_FILE: string = 'address';}/** * 自定义地址选择组件CustomAddressPicker */@Componentexport struct CustomAddressPicker { // 底部导航条区域高度 @State bottomHeight: number = 0; // 选择的省市区 @State provinceCityRegion: string = '省、市、区'; // 用于对外提供选择后的省市区信息或者传入地址信息 @Link address: AddressInfo; // 地址选择半模态弹窗显隐标志位 @State isShow: boolean = false; // 当前选择的省、市、区tab页签的index。0表示省,1表示市,2表示区 @State currentIndex: number = AddressType.Province; // 调用changeIndex切换TabContent动画时长 @State animationDuration: number = 300; // 省List @State provinceList: CommonAddressList[] = []; // 市List @State cityList: CommonAddressList[] = []; // 区List @State regionList: CommonAddressList[] = []; // 记录上一次市List @State lastCityList: CommonAddressList[] = []; // 记录上一次区List @State lastRegionList: CommonAddressList[] = []; // 存放选择的省数据 @State province: Province = new Province('', '', []); // 记录当前省市区选择信息 @State currentSelectInfo: AddressInfo = new AddressInfo(); // 记录上一次省市区选择信息 @State lastSelectInfo: AddressInfo = new AddressInfo(); // 选择的省市区名下方的下滑线水平偏移量 @State leftMargin: number = 0; // 存放上一次选择的省市区名下方的下滑线水平偏移量 private lastLeftMargin: number = 0; // 存放选择的省市区名下方的下滑线位置信息 private textInfos: [number, number][] = []; // 存放从json读取的省市区数据 private data: Province[] = []; private controller: TabsController = new TabsController(); async aboutToAppear() { // 获取导航条高度,半模态弹窗内容进行避让 window.getLastWindow(getContext(), (err, data) => { const avoidAreaBottom = data.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR) this.bottomHeight = avoidAreaBottom.bottomRect.height }) // 从json文件读取省市区数据 const addressData: Province[] = await JsonUtils.getAddressJson(Constants.JSON_FILE) if (!addressData || addressData.length === 0) { console.error('省市区数据加载失败'); return; } for (let index = 0; index < addressData.length; index++) { this.data.push(addressData[index]) this.provinceList.push(new CommonAddressList(addressData[index].code, addressData[index].name)); } // 首次加载AddressPickerComponent如果传入了有效的地址信息,拉起地址选择半模态页面时,会按传入的地址信息进行显示 this.initAddressSelect() } /** * 首次加载AddressPickerComponent如果传入了有效的地址信息时,在拉起地址选择半模态页面时,会按传入的地址信息进行显示 */ initAddressSelect() { if (this.address.province !== '' && this.address.city !== '' && this.address.region !== '') { this.provinceCityRegion = this.address.province + this.address.city + this.address.region this.currentSelectInfo.province = this.address.province this.currentSelectInfo.city = this.address.city this.currentSelectInfo.region = this.address.region //查找对应的市,区地址信息 this.data.forEach(province => { if (province.name === this.address.province) { this.currentSelectInfo.provinceId = province.code; this.address.provinceId = province.code; province.children.forEach(city => { // 只提取市级的code和name this.cityList.push(new CommonAddressList(city.code, city.name)) if (city.name === this.address.city) { this.currentSelectInfo.cityId = city.code this.address.cityId = city.code city.children.forEach(region => { // 只提取区级的code和name this.regionList.push(new CommonAddressList(region.code, region.name)) if (region.name === this.address.region) { this.currentSelectInfo.regionId = region.code this.address.regionId = region.code // 深拷贝保存到相应的变量中 this.lastSelectInfo = JSON.parse(JSON.stringify(this.currentSelectInfo)) this.lastCityList = JSON.parse(JSON.stringify(this.cityList)); this.lastRegionList = JSON.parse(JSON.stringify(this.regionList)); this.animationDuration = 0; } }) } }) } }) } } /** * 选择的省市区名下方的下滑线动画 * @param duration 动画时长 * @param leftMargin 下划线动画偏移量 */ startAnimateTo(duration: number, leftMargin: number) { animateTo({ duration: duration, // 动画时长 curve: Curve.Linear, // 动画曲线 iterations: 1, // 播放次数 playMode: PlayMode.Normal // 动画模式 }, () => { this.leftMargin = leftMargin; }) } /** * 用于显示选择的省、市、区名 * @param params 传入要显示的省、市、区名 */ @Builder locationItem(params: Location) { Text(params.name === '' ? "请选择" : params.name) .height("100%") .fontSize(16) .fontWeight(this.currentIndex === params.index ? 500 : 400) .fontColor(this.currentIndex === params.index ? "#cc000000" : "#ff8d8d8d") .constraintSize({ maxWidth: "33%" }) .textOverflow({ overflow: TextOverflow.Ellipsis }) .maxLines(1) .margin({ right: 12 }) .onClick(() => { this.controller.changeIndex(params.index) }) .id(params.index.toString()) .onAreaChange((oldValue: Area, newValue: Area) => { //使用组件区域变化回调onAreaChange获取选择的省市区Text组件宽度,存入textInfos数组,用于后续计算选择省市区名后下方下滑线动画水平偏移量leftMargin // 组件区域变化时获取当前Text的宽度newValue.width和x轴相对位置newValue.position.x this.textInfos[params.index] = [newValue.position.x as number, newValue.width as number]; if (this.currentIndex === params.index && params.index === AddressType.Province) { // 计算选择的省市区名下方的下滑线偏移量 this.leftMargin = (this.textInfos[this.currentIndex][1] - 20) / 2 } }) } @Builder customTabs() { Tabs({ controller: this.controller }) { // 省列表 TabContent() { List() { ForEach(this.provinceList, (item: CommonAddressList) => { ListItem() { this.areaNameItem(AddressType.Province, item) } .onClick(() => { // 如果当前点击选择的省与之前选择一样,跳过省、市数据获取,直接调用changeIndex(AddressType.City)切换到市列表,减少冗余查询以提升性能 if (this.currentSelectInfo.province == item.name) { this.controller.changeIndex(AddressType.City) return } else { // 重置市和区数据 this.currentSelectInfo.cityId = ''; this.currentSelectInfo.city = ''; this.currentSelectInfo.regionId = ''; this.currentSelectInfo.region = ''; } this.cityList = [] this.regionList = [] this.data.forEach(province => { if (province.name === item.name) { this.province = JSON.parse(JSON.stringify(province)); province.children.forEach(city => { this.cityList.push(new CommonAddressList(city.code, city.name)); }) } }) this.currentSelectInfo.provinceId = item.code; this.currentSelectInfo.province = item.name; this.controller.changeIndex(AddressType.City) }) }, (item: CommonAddressList) => JSON.stringify(item)) } .width("100%") .height("100%") .scrollBar(BarState.Off) .friction(0.6) // 设置摩擦系数 .edgeEffect(EdgeEffect.Spring) // 边缘效果设置为Spring .listDirection(Axis.Vertical) // 排列方向 } // 市列表 TabContent() { List() { ForEach(this.cityList, (item: CommonAddressList) => { ListItem() { this.areaNameItem(AddressType.Province, item) } .onClick(() => { // 如果点击的市和上一次点击的市一样,则不用刷新,减少冗余操作以提升性能 if (this.currentSelectInfo.city === item.name) { this.controller.changeIndex(AddressType.Region) return } else { //重置数据 this.currentSelectInfo.region = '' this.currentSelectInfo.regionId = '' } this.regionList = [] // 点击市,获取该市所有区,存入regionList this.province.children.forEach(city => { if (city.name === item.name) { city.children.forEach(region => { this.regionList.push(new CommonAddressList(region.code, region.name)) }) } }) this.currentSelectInfo.cityId = item.code this.currentSelectInfo.city = item.name this.controller.changeIndex(AddressType.Region) }) }, (item: CommonAddressList) => JSON.stringify(item)) } .width("100%") .height("100%") .scrollBar(BarState.Off) .friction(0.6) .edgeEffect(EdgeEffect.Spring) .listDirection(Axis.Vertical) } // 区列表 TabContent() { List() { ForEach(this.regionList, (item: CommonAddressList) => { ListItem() { this.areaNameItem(AddressType.Province, item) } .onClick(() => { // 记录选择的区信息 this.currentSelectInfo.regionId = item.code; this.currentSelectInfo.region = item.name; this.provinceCityRegion = this.currentSelectInfo.province + this.currentSelectInfo.city + this.currentSelectInfo.region //退出半模态 this.isShow = false // 将当前选中省市区信息保存到lastSelectInfo this.lastSelectInfo.provinceId = this.currentSelectInfo.provinceId; this.lastSelectInfo.province = this.currentSelectInfo.province; this.lastSelectInfo.cityId = this.currentSelectInfo.cityId; this.lastSelectInfo.city = this.currentSelectInfo.city; this.lastSelectInfo.regionId = this.currentSelectInfo.regionId; this.lastSelectInfo.region = this.currentSelectInfo.region; // 在选择完区名后,使用JSON.parse(JSON.stringify(xxx))深拷贝选择的省市区数据,用于后续操作中需要加载上一次选择的完整省市区数据 // 深拷贝保存到相应的变量中 this.lastCityList = JSON.parse(JSON.stringify(this.cityList)); this.lastRegionList = JSON.parse(JSON.stringify(this.regionList)); this.address = JSON.parse(JSON.stringify(this.lastSelectInfo)); }) }, (item: CommonAddressList) => JSON.stringify(item)) } .width("100%") .height("100%") .scrollBar(BarState.Off) .friction(0.6) .edgeEffect(EdgeEffect.Spring) .listDirection(Axis.Vertical) } } .onAppear(() => { if (this.lastSelectInfo.region !== '') { // 上一次选择如果选择到区,再次打开半模态弹窗页面时会显示到区的TabContent this.currentIndex = AddressType.Region; if (this.cityList.length === 0 && this.regionList.length === 0) { // 在已经选择过省市区后,再次打开地址选择半模态弹窗页面,但是没有选择到区就关闭了半模态页面,此时如果再次打开半模态页面,需要显示之前完整选择的省区市数据 this.currentSelectInfo.provinceId = this.lastSelectInfo.provinceId; this.currentSelectInfo.cityId = this.lastSelectInfo.cityId; this.currentSelectInfo.regionId = this.lastSelectInfo.regionId; this.currentSelectInfo.province = this.lastSelectInfo.province; this.currentSelectInfo.city = this.lastSelectInfo.city; this.currentSelectInfo.region = this.lastSelectInfo.region; this.cityList = JSON.parse(JSON.stringify(this.lastCityList)); this.regionList = JSON.parse(JSON.stringify(this.lastRegionList)); this.leftMargin = this.lastLeftMargin; } else { this.leftMargin = this.textInfos[0][1] + this.textInfos[1][1] + (this.textInfos[2][1] - 20) / 2 + 12 * 2 this.lastLeftMargin = this.leftMargin; } this.controller.changeIndex(AddressType.Region) } this.animationDuration = 300 }) .onAnimationStart((index: number, targetIndex: number, event: TabsAnimationEvent) => { if (index === targetIndex) { return; } this.currentIndex = targetIndex; let leftMargin: number = 0; let isAnimating: boolean = false; if (index === AddressType.Province && targetIndex === AddressType.City) { // 从省切到市时,重新计算选择的省市区名下方的下滑线偏移量 leftMargin = this.textInfos[0][1] + (this.textInfos[1][1] - Constants.DIVIDER_WIDTH) / 2 + Constants.AREA_SPACE; isAnimating = this.currentSelectInfo.city === '' ? false : true; } else if (index === AddressType.City && targetIndex === AddressType.Region) { // 从市切到区,重新计算选择的省市区名下方的下滑线偏移量 leftMargin = this.textInfos[0][1] + this.textInfos[1][1] + (this.textInfos[2][1] - Constants.DIVIDER_WIDTH) / 2 + Constants.AREA_SPACE * 2; isAnimating = this.currentSelectInfo.region === '' ? false : true; } else if (index === AddressType.City && targetIndex === AddressType.Province) { // 从市切到省,重新计算选择的省市区名下方的下滑线偏移量 leftMargin = (this.textInfos[0][1] - Constants.DIVIDER_WIDTH) / 2; isAnimating = this.currentSelectInfo.city === '' ? false : true; } else if (index === AddressType.Region && targetIndex === AddressType.City) { // 从区切到市,重新计算选择的省市区名下方的下滑线偏移量 leftMargin = this.textInfos[0][1] + (this.textInfos[1][1] - Constants.DIVIDER_WIDTH) / 2 + Constants.AREA_SPACE; isAnimating = this.currentSelectInfo.region === '' ? false : true; } else if (index === AddressType.Region && targetIndex === AddressType.Province) { // 点击自定义TabBar从区切到省,重新计算选择的省市区名下方的下滑线偏移量 leftMargin = (this.textInfos[0][1] - Constants.DIVIDER_WIDTH) / 2; isAnimating = this.currentSelectInfo.region === '' ? false : true; } else if (index === AddressType.Province && targetIndex === AddressType.Region) { // 点击自定义TabBar从省切到区,重新计算选择的省市区名下方的下滑线偏移量 leftMargin = this.textInfos[0][1] + this.textInfos[1][1] + (this.textInfos[2][1] - Constants.DIVIDER_WIDTH) / 2 + Constants.AREA_SPACE * 2; isAnimating = this.currentSelectInfo.region === '' ? false : true; } // 只有在已经选择过的TabContent之间切换时,才会做下划线水平偏移动画 if (isAnimating) { this.startAnimateTo(this.animationDuration, leftMargin); } else { this.leftMargin = leftMargin; } }) .width("100%") .barHeight(0) .layoutWeight(1) } /** * 自定义省/市/区名项 * @param addressType 省/市/区类型 * @param item 省、市、区地址项 */ @Builder areaNameItem(addressType: AddressType, item: CommonAddressList) { Column() { Text(item.name) .width("90%") .height(48) .fontSize(16) .fontColor(this.getFontColor(addressType, item)) Divider().width("90%") .strokeWidth(1) .color("#F1F3F5") } .width("100%") } /** * 获取省、市、区名需要显示的字体颜色 * @param addressType 省/市/区类型 * @param item 省、市、区地址项 * @returns 需要显示的字体颜色 */ getFontColor(addressType: AddressType, item: CommonAddressList): Color | string | Resource { // 省/市/区名字体颜色 let isSelect: boolean = false; if (addressType === AddressType.Province) { isSelect = this.currentSelectInfo.province !== '' && item.name === this.currentSelectInfo.province; } else if (addressType === AddressType.City) { isSelect = this.currentSelectInfo.city !== '' && item.name === this.currentSelectInfo.city; } else if (addressType === AddressType.Region) { isSelect = this.currentSelectInfo.region !== '' && item.name === this.currentSelectInfo.region; } const color = isSelect ? "#fffcb850" : Color.Black; return color; } /** * 地址选择半模态弹窗页面 */ @Builder addressSelectPage() { Column() { this.customTabBar() Divider().width("90%") .strokeWidth(1) .color("#F1F3F5") this.customTabs() } .width("100%") .height("100%") .backgroundColor(Color.White) .padding({ bottom: this.bottomHeight + 'px' }) } /** * 自定义TabBar */ @Builder customTabBar() { RelativeContainer() { Row() { //选择的省名 this.locationItem({ index: AddressType.Province, name: this.currentSelectInfo.province }) // 选择的市名 this.locationItem({ index: AddressType.City, name: this.currentSelectInfo.city }) // 选择的区名 this.locationItem({ index: AddressType.Region, name: this.currentSelectInfo.region }) } .width("85%") .height("80%") .alignRules({ center: { anchor: '__container__', align: VerticalAlign.Center } }) .margin({ bottom: 10 }) .padding({ left: 20, top: 15 }); // 选择的省市区名下方的下滑线 Row() { Divider() .width(20) .strokeWidth(2) .color("#fffcb850") .margin({ left: this.leftMargin }) } .alignItems(VerticalAlign.Top) .width("85%") .height("20%") .alignRules({ bottom: { anchor: '__container__', align: VerticalAlign.Bottom } }) .padding({ left: 20 }) Row() { Image($r("app.media.address_picker_close")) .objectFit(ImageFit.Contain) .width(14) .height(14) .margin({ left: 20 }); } .height("100%") .width("15%") .alignRules({ right: { anchor: '__container__', align: HorizontalAlign.End } }) .onClick(() => { //关闭半模态 this.isShow = false; }); } .width("100%") .height(48) } build() { Column() { Row() { Text("所在地区") .fontSize(16) .fontWeight(500) .margin({ right: 20 }) Text(this.provinceCityRegion) .fontSize(15) .fontColor(this.provinceCityRegion === '省、市、区' ? "#ffacacac" : Color.Black) .fontWeight(300) .constraintSize({ maxWidth: "68%" }) .textOverflow({ overflow: TextOverflow.Ellipsis }) .maxLines(1) } .width("100%") .height(100) .onClick(() => { this.isShow = true this.currentIndex = AddressType.Province }) .bindSheet($$this.isShow, this.addressSelectPage(), { height: "70%", showClose: false, // 设置不显示自带的关闭图标 dragBar: false, onDisappear: () => { this.animationDuration = 0; if (this.currentSelectInfo.region === '') { // 重置所有状态 this.currentSelectInfo.provinceId = ''; this.currentSelectInfo.cityId = ''; this.currentSelectInfo.regionId = ''; this.currentSelectInfo.province = ''; this.currentSelectInfo.city = ''; this.currentSelectInfo.region = ''; this.cityList = []; this.regionList = []; } } }) } .width("100%") .height(54) .padding(2) }}核心能力:组件复用 总结鸿蒙一多开发统一工程与模块化架构,解决人力资源分配矛盾与重复劳动问题。依托标准化组件复用,确保共性能力集中维护,解决功能重复开发、维护难的问题。组件化与配置化打包让测试聚焦差异点,缓解版本规划压力与测试资源冲突。统一资源管理与编译脚本精准控制打包,降低线上问题连锁反应概率,保障多 App 发布稳定性。
-
问题背景在鸿蒙App开发中,调用鸿蒙定位服务API获取的当前定位坐标后,传入华为地图后,在华为地图上显示的定位坐标,与实际预期的定位位置不一样例如:鸿蒙定位服务API获取的当前定位坐标,预期在华为地图上应该显示在湖附近,但是实际华为地图上显示的位置,在几百米外的陆地上。具体效果见下面截图即,应用内通过鸿蒙定位服务API获取的当前定位坐标,与华为地图中显示的坐标位置存在偏差 问题原因 鸿蒙定位服务API使用的是WGS84坐标系,但是在显示到华为地图上需要使用GCJ02 坐标系华为地图坐标系介绍:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/map-introduction 鸿蒙定位服务API坐标系介绍:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/location-guidelines 问题原因总结华为官方设计上存在不一致:华为地图需要使用标准的大陆的GCJ02 坐标系,与鸿蒙定位服务API的WGS84坐标系,设计上不一致 修复方案:核心答案封装一套坐标系转换的方法,将WGS84坐标系的坐标转换为GCJ02坐标系的坐标实现步骤鸿蒙原生通过鸿蒙定位服务API获取到坐标后,调用封装的经纬度坐标系转换方法,将转换后的坐标,传入到华为地图中显示经纬度坐标转换方法,见如下代码设计思路 经纬度坐标转换,代码设计思路 先定义一个接受经度、纬度两个参数的方法,并返回number数组,如下:gcj02ToWgs84(lng: number, lat: number)判断是否为国内坐标,若是则继续转化,否则退出封装一个转换经度的方法,如下:transformLng封装一个转换纬度的方法,如下:transformLat再经过固定算法,在gcj02ToWgs84返回number数组 完整代码getAddressPermission() { //位置权限 let atManager = abilityAccessCtrl.createAtManager(); console.log('requestPermissionsFromUser' + 1) try { atManager.requestPermissionsFromUser(getContext(), ['ohos.permission.INTERNET', 'ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION']) .then((data) => { console.log('requestPermissionsFromUser' + JSON.stringify(data)) try { geoLocationManager.getCurrentLocation(request) .then((result) => { // 调用getCurrentLocation获取当前设备位置,通过promise接收上报的位置 console.info('current location: ' + JSON.stringify(result)); // 通过wgs84ToGcj02转换为gcj02坐标 const lngLat = wgs84ToGcj02(result.longitude, result.latitude) setTimeout(() => { this.setMark(result.longitude, result.latitude, "位置(wgs84,位置偏移)", $r("app.media.position")) this.setMark(lngLat[0], lngLat[1], "位置(gcj02,位置准确)", $r("app.media.position")) }, 1000) }) .catch((error: BusinessError) => { // 接收上报的错误码 console.error('promise, getCurrentLocation: error=' + JSON.stringify(error)); }); } catch (err) { console.error("errCode:" + JSON.stringify(err)); } }) .catch((err: BusinessError) => { console.log('requestPermissionsFromUser' + 3) // Logger.error(TAG, `err: ${JSON.stringify(err)}`); }) } catch (err) { console.log('requestPermissionsFromUser' + 4) } } const PI = Math.PI;const a = 6378245.0;const ee = 0.00669342162296594323;function outOfChina(lng: number, lat: number): boolean { if (lng < 72.004 || lng > 137.8347) { return true; } if (lat < 0.8293 || lat > 55.8271) { return true; } return false;}function transformLat(lng: number, lat: number): number { let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; return ret;}function transformLng(lng: number, lat: number): number { let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; return ret;}function gcj02ToWgs84(lng: number, lat: number): number[] { if (outOfChina(lng, lat)) { return [lng, lat]; } let dlat = transformLat(lng - 105.0, lat - 35.0); let dlng = transformLng(lng - 105.0, lat - 35.0); let radlat = lat / 180.0 * PI; let magic = Math.sin(radlat); magic = 1 - ee * magic * magic; let sqrtmagic = Math.sqrt(magic); dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); let mglat = lat + dlat; let mglng = lng + dlng; return [lng * 2 - mglng, lat * 2 - mglat];}总结鸿蒙地图相关开发中,若存在应用内app获取定位后,需要在华为地图中显示定位坐标位置,则需要转换坐标。开发者需了解鸿蒙中此种经纬度坐标系,不同标准。若遇到类似问题,可快速解决,无需查阅很多资料花费较多时间来定位此种类型的问题若遇到类似定位相关的问题,查阅鸿蒙官网API时,需留意坐标系相关的说明,可快速定界出是否是坐标系的问题
-
本次直播专为备考华为云鸿蒙应用入门级开发者认证的学员设计,提供系统的考试辅导。深度解析认证核心知识点,涵盖HarmonyOS介绍、应用开发入门、ArkTS语言、声明式开发范式组件、Stage应用模型、玩转服务卡片、鸿蒙应用网络请求开发、鸿蒙应用云函数调用等内容。华为云鸿蒙应用入门级开发者认证分为理论考试和实验考试两部分,60分为通过。理论考试时间为60分钟,试题分为判断:单选:多选,比例为3:4:3(考试题量50);实验考试共120分钟,声明式开发范式实验、Stage模型实验、ArkTS卡片实验、HarmonyOS调用FunctionGraph实验为重点考点。直播链接:cid:link_0; Q:harmonyos三大技术特性?A: ①硬件互助与资源共享②一次开发多端部署③统一OS弹性部署 Q:HAP分为以下哪几项类型?A:Entry、Feature Q:在HarmonyOS中,当用户从桌面点击一个应用图标启动应用时,UIAbility组件会经历以下哪个生命周期状态的变化?A:从Create到Foreground。 Q:在HarmonyOS的ArkTS卡片开发中,什么情况会触发卡片生命周期回调函数的调用?A:①卡片被添加到桌面②卡片被从桌面移除③卡片中的数据更新 Q:DevEco Studio支持预览器工具开启双向预览功能后,工具可以支持哪几个之间相互联动?A: 代码编辑器、Component Tree、UI界面。 Q:使用浏览器输出网址进行查询搜索,实际上相当于发送了以下哪一种HTTP请求方式?A:GET请求。
-
开了开发者模式,在应用尝鲜里也找不到?
-
开发者们,大家好!2025数博会系列赛暨华为开发者大赛贵州赛区 的赛题专家讲解环节,已经精彩呈现!本次大赛聚焦前沿技术与产业应用,本次讲解深入浅出地剖析了赛题的核心挑战与创新方向,不仅为参赛开发者们指明了思路、拓宽了视野,更激发了大家探索数智技术、解决实际问题的潜能。这不仅仅是竞技的舞台,更是创新人才与前沿技术碰撞交流的盛会。通过专家的解读,我们得以窥见未来技术突破的可能,感受贵州赛区乃至全国开发者群体的智慧与热情。现在,就让我们一同深入精彩讲解,洞察赛题背后的技术精髓与产业价值,共同期待这场“数智时代”创新人才的精彩绽放!鸿蒙应用创新赛题依托华为云全场景服务与鸿蒙分布式能力,面向智慧生活、智慧城市、智慧工业等领域开放命题。参赛者可结合AI、大数据、物联网等技术,开发端云协同解决方案,如家庭健康管家、城市环境精细化治理、工业生产智能监测等。昇腾云AI创新赛题基于昇腾云服务和MindSpore大模型能力,推动人工智能在实体经济的深度渗透。参赛方向涵盖食饮行业质量检测、文旅行业智慧导览等场景,如酱酒异物检测、智能导览规划推荐等,助力贵州产业提质增效。赋能讲解视频链接:
-
显示文件catalina.sh 必须可执行
-
挑战杯是“挑战杯”全国大学生系列科技学术竞赛的简称,是由共青团中央、中国科协、教育部和全国学联共同主办的全国性的大学生课外学术实践竞赛。今年,本届大赛调整为中国青年科技创新“揭榜挂帅”擂台赛,旨在进一步围绕“硬科技”创新、“卡脖子”关键核心技术攻关。华为深度参与本届“揭榜挂帅”,助力科技创新,设置22个奖项。总奖金池30万元,其中擂主团队奖金10万元。获奖者更有机会进入华为人才储备池,并优先获得实习及就业的推荐机会。 详情请点击:cid:link_001 赛题介绍赛题名称:推理大模型的训练调优与性能加速助力全栈自主AI赛题背景在大语言模型(LLMs)迅速发展的浪潮中,推理能力和运行效率的显著进步正推动着AI技术走向更广泛的应用领域。2025年,以OpenAI的o1系列和DeepSeek R1为代表的模型,不仅在复杂任务如数学解题、编程上展现出卓越能力,还通过技术创新如量化、模型并行(MOE)、知识蒸馏等,大幅提升了模型在轻量化设备上的部署可行性。 华为命题旨在应用全栈自主AI开发工具链,基于昇腾AI云服务、Ascend-snt9b AI芯片、CANN异构计算架构和ModelArts开发平台,提升轻量级模型的推理能力和性能。参赛者将利用强化学习、微调、知识蒸馏、量化等方法优化指定模型,同时探索模型部署于端侧设备的潜力,促进模型在实际场景中的应用。 赛题说明本次比赛分为初赛和总决赛,具体要求如下:初赛:组委会提供Qwen轻量级模型和示例工程,参赛团队选择强化学习(如PPO)或知识蒸馏技术,在ModelArts环境中对模型进行微调,同时优化推理性能。初赛阶段分为A榜和B榜,其中B榜的性能部分要求选手必须有算子融合、优化方面的工作。初赛最终排名以B榜成绩和代码核查结果为准,筛选出一定数量的队伍入围。总决赛(终审擂台赛):参赛者需准备PPT进行答辩,介绍技术方案和应用demo,阐述推理能力和性能优化的方法及其实际应用场景。酌情加分项:使用华为开发者空间提供的相关资源和服务、端侧应用鸿蒙适配、及其他华为开放能力调用。 * 具体的指导文档点击文末「 阅读原文 」 获取赛题详情哦! 02 技术能力华为昇腾AI云服务技术能力解读全栈协同优化,构建AI云底座:昇腾AI云服务重构了云基础设施,利用多样化算力池、高性能缓存池和分级存储池等多层池化技术,减少由上到下的计算代价,大大提升了资源利用率,充分释放了昇腾算力规模。 全套工具链,让AI落地更简单:AI开发生产线ModelArts,提供了包括昇腾工具链、SDK、CLI、IDE插件等端到端生产工具链,支持数据管理、模型开发、训练、推理等全流程MLOps开发,提供了统一资源调度能力,提升AI开发效率,降低AI开发门槛和成本。 开箱即用,一站式大模型开发服务:ModelArts Studio大模型即服务平台(简称MaaS),提供了简单易用的模型开发工具链,支持大模型定制开发,让模型应用与业务系统无缝衔接,降低企业AI落地的成本与难度。 * ModelArts Studio大模型即服务平台:cid:link_1华为昇腾计算技术能力解读极致性能,极简应用:CANN是昇腾针对AI场景推出的异构计算架构,向上支持多种AI框架,包括MindSpore、PyTorch等,向下服务AI处理器与编程,发挥承上启下的关键作用,是提升昇腾AI处理器计算效率的关键平台。 * CANN 助力构筑昇腾AI算力平台:cid:link_3可视化,插件化:MindStudio是华为面向昇腾AI开发者提供的全流程工具链,致力于提供端到端的昇腾AI应用开发解决方案,使能开发者高效完成模型迁移与调优、模型转换与压缩、算子开发与编译等。 * MindStudio 全流程开发工具链:cid:link_2基于上述能力,参赛开发者可以提升开发效率:使用昇腾AI云服务,开发者可以在完善的工具链基础上,实现从数据处理、算法训练到模型部署的全流程开发,更快地进行模型迭代。 提升模型性能:借助高效的模型迁移调优工具链、硬件亲和的高性能算子,以及开放的自定义算子开发能力,开发者可快速提升模型推理性能。 提升应用效果:借助优质稳定的基础大模型,使用便捷的微调和测评工具,开发者可以快速构建自己的大模型应用,提高任务精度。 03 应用场景智能终端交互手机/平板AI助手:通过轻量化模型优化(如量化、知识蒸馏),可在端侧实现低延迟的语音交互、实时翻译、日程管理等,避免云端依赖。智能家居控制:优化后的模型可部署在家庭网关或边缘设备中,实现本地化自然语言指令解析(如“调节空调温度”),提升隐私性与响应速度。金融与客服智能客服系统:通过知识蒸馏压缩模型,在银行APP或呼叫中心本地部署,实现低延迟的合规性问答与交易指导。风险实时监控:轻量化模型分析交易流水,快速识别欺诈行为,提升边缘计算场景下的响应效率。医疗与生物技术电子病历分析:在医疗终端部署优化模型,辅助医生快速生成诊断建议(需结合联邦学习保障数据安全)。基因数据推理:通过模型并行技术加速基因组序列分析,缩短科研周期。 04 技术案例美图随着美图AIGC应用版图扩大,算力供应十分紧张,华为云为美图提供从昇腾AI云服务、大模型到上层应用的全方位支持,与美图共建全栈AI解决方案。通过华为云ModelArts一站式AI开发平台,为美图提供数据处理、算法开发、模型训练、模型管理、模型部署等全流程AI开发技术能力,满足复杂场景需求。千卡集群线性度95%、昇腾云脑1000+故障模式、故障发现<1min等领先的AI基础设施能力,保障美图的大规模训练快速迭代。
-
挑战杯是“挑战杯”全国大学生系列科技学术竞赛的简称,是由共青团中央、中国科协、教育部和全国学联共同主办的全国性的大学生课外学术实践竞赛。团中央于 2021 年首次在第十七届“挑战杯”全国大学生课外学术科技作品竞赛中设置了“揭榜挂帅”专项赛。三届大赛来,累计吸引来自全国上千所高校、数万名学子踊跃参与。为汇聚更多青年科创人才的智慧力量,本届大赛调整为中国青年科技创新“揭榜挂帅”擂台赛,旨在进一步围绕“硬科技”创新、“卡脖子”关键核心技术攻关。2025年度中国青年“揭榜挂帅”擂台赛·华为赛道火热来袭!本次比赛聚焦大模型的推理能力提升和性能优化,参赛团队需基于昇腾全栈AI技术,使用强化学习、知识蒸馏等技术,提升选定的轻量级模型在数学计算、逻辑推理、代码生成等任务上的能力,并通过算子融合与优化、模型结构优化、量化等技术,保证精度的同时提升模型推理性能。诚邀各大高校精英云端竞技,打擂揭榜。一、即刻解锁赛事全攻略关于本次大赛,我们已为你整理总结了赛程安排、详细的参赛指导等选手关注的信息,点击海报查看。二、组队闯关!届时开放精英社群��想Get技术文档?寻找最强队友?与华为专家实时互动?扫码添加小助手,回复暗号“挑战杯”秒入群!在这里,与全国顶尖开发者共研大模型推理优化方案,一起竞技打擂,开发创新应用,助力全栈自主AI技术的新篇章!详情请点击:cid:link_0直达报名通道,攀登技术巅峰!
-
为什么程序下载到板子后,每隔几秒就会自动重启呢?这两种线程建立方式有何不同?
-
在9月24日秋季全场景新品发布会上,华为隆重宣布,其备受期待的HarmonyOS NEXT操作系统将于10月8日开启公测。这一全新的操作系统,被业界誉为“纯血鸿蒙”,标志着国产操作系统在自主研发、技术创新上迈出了坚实的一步。HarmonyOS NEXT以其全新的架构设计,在性能、设计、安全、AI等多个方面实现了重大突破,为用户带来了真正的“原生鸿蒙”体验。北京拓课网络科技有限公司(以下简称“拓课云”),作为华为云的战略合作伙伴和核心服务伙伴,一直走在技术创新的前沿。拓课云积极响应对国产操作系统的支持,提前开展了深度适配HarmonyOS NEXT版本的工作,率先上线HarmonyOS NEXT版,成为在线教育和实时通讯领域拥抱鸿蒙生态的先行者。 拓课云Plus的鸿蒙纯血版本,完全基于鸿蒙原生系统开发,所有功能均采用鸿蒙原生代码完成。这种原生开发方式,使得这两款应用能够最大程度地发挥鸿蒙系统的软硬件性能,确保在HarmonyOS NEXT系统上提供流畅、稳定、清晰的音视频实时互动体验。无论是在线教育还是实时通讯,拓课云的产品都能满足用户对高品质服务的需求。 为了进一步满足开发者的需求,拓课云云还推出了原生鸿蒙版本的SDK和带界面的UISDK。这些套件的推出,将极大地简化开发者的集成和对接开发工作,使客户能够根据自己的需求快速进行开发整合和封装调用,从而推动业务的高效整合和推进。 随着“鸿蒙宇宙”的加速打造,拓课云将继续深化与HarmonyOS NEXT系统的融合,利用其强大的分布式能力、流畅的操作体验以及高度的安全性,为客户提供更加可靠、易用的产品。拓课云多款应用的鸿蒙版本现已在鸿蒙应用商店上线。用户在更新至纯血鸿蒙系统后,可以前往应用市场搜索并下载使用。这不仅是拓课云对国产操作系统的支持和响应,也是对用户提供全方位支持和服务的体现。拓课云将继续携手华为,共同推动鸿蒙生态的繁荣发展。随着鸿蒙系统的不断成熟和普及,拓课云的产品也将在新的生态环境中绽放新姿,为用户带来更加丰富和高效的应用体验。
-
鸿蒙电脑和传统的安卓平板加键盘有啥区别?华为乾坤的软件有集成进去吗
上滑加载中
推荐直播
-
华为云码道 × 仓颉编程:工程化AI编码探索2026/05/27 周三 19:00-21:00
刘俊杰-华为云仓颉语言专家/李炎-华为云码道技术专家/王智鹏-OpenCangjie开源社区发起人
本场直播围绕华为云仓颉语言与华为云码道的深度结合,展示华为云智能编程从零基础到高效落地的完整生态能力。以华为云码道为引擎,仓颉语言为载体,带给大家日常提效、趣味创新到极速量产的开发体验。
回顾中
热门标签