尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

鸿蒙开发从零到一:环境搭建、ArkUI声明式编程与核心概念解析

鸿蒙开发从零到一:环境搭建、ArkUI声明式编程与核心概念解析 1. 从“Hello World”到“Hello Harmony”一个开发者的真实起点如果你和我一样最近被“鸿蒙”这个词刷屏了从手机系统到PC版官网再到各种开发教程和模拟器问题感觉它无处不在但又不知道从何下手。作为一个在移动开发领域摸爬滚打了十来年的老码农我最初面对鸿蒙开发时也经历过那种“汗流浃背”的迷茫期。网上信息看似很多但要么是官方文档的复读机要么是零散的“踩坑”吐槽缺乏一条从零开始的、连贯的、能让人真正跑起来的路径。今天这篇我就想抛开那些宏大的叙事和复杂的术语从一个纯粹的开发者视角和你聊聊我是如何从零开始把一个最简单的想法变成鸿蒙设备上第一个能跑起来的应用的。这不是一篇官方教程的翻译而是我趟过水、踩过坑之后为你画下的一张更接地气的“藏宝图”。鸿蒙开发或者说“HarmonyOS应用开发”本质上是在为华为构建的“万物互联”生态编写应用。它和我们熟悉的Android、iOS开发有相似之处比如都涉及UI、逻辑、数据但内核和设计哲学又有根本不同。最大的区别在于鸿蒙从设计之初就强调“一次开发多端部署”你的代码可能需要在手机、平板、手表、甚至未来的车机、智慧屏上运行。这听起来很美好但也意味着开发环境和思维模式需要一次转换。很多人卡在第一步环境搭建。Deveco Studio加载模拟器一直转圈HAP安装包不知道去哪找生命周期搞不明白别急我们一步一步来。这篇文章的目标就是让你在阅读和实践之后能亲手在鸿蒙模拟器或者真机上看到一个属于你自己的、哪怕只是显示一行文字的应用界面并理解这背后每一步的“为什么”。2. 环境搭建避开Deveco Studio的“加载地狱”万事开头难而鸿蒙开发的开头十有八九会卡在开发环境上。官方的集成开发环境IDE是Deveco Studio基于IntelliJ IDEA对于用过Android Studio或JetBrains全家桶的开发者来说界面会很亲切。但“亲切”不代表顺利我见过太多同事和网友倒在“模拟器一直加载”或“SDK下载失败”这一步。2.1 安装与配置的核心三要素首先你需要从华为开发者联盟官网下载Deveco Studio。这里有个关键点请务必确认你下载的是适用于你操作系统的版本并且网络环境稳定。官方的下载服务器有时可能不太给力如果遇到下载慢或失败可以尝试切换网络或稍后再试。安装过程基本是下一步到底但安装完成后的首次启动配置才是重头戏。Deveco Studio会自动检测并提示你安装HarmonyOS SDK。这里你需要关注三个核心组件SDK Platforms平台版本这相当于Android开发中的API Level。你需要选择你要开发的目标系统版本。对于新手我强烈建议选择最新的稳定版例如写作时的HarmonyOS 4.0/5.0 API Version 9/10而不是Beta或Canary版本以避免不必要的兼容性问题。你可以同时安装多个版本以便后续测试兼容性。SDK Tools工具集这里包含编译、调试、打包所需的命令行工具最重要的是ohpmOpenHarmony包管理器类似npm或gradle和hvigor构建工具可以理解为鸿蒙的Gradle。通常IDE会默认勾选必要的工具保持默认即可。Previewer预览器与模拟器Previewer是一个轻量级的UI预览工具可以快速查看UI布局效果但它不能运行完整的应用逻辑。模拟器才是完整运行和调试应用的关键。模拟器的镜像文件很大通常几个GB建议在网络好、磁盘空间充足的时候下载。2.2 破解“模拟器一直加载”的魔咒“Deveco Studio鸿蒙模拟器一直再加载进不去”——这是热搜词也是高频坑。根据我的经验这个问题通常不是单一原因造成的需要按以下步骤排查第一步检查BIOS虚拟化支持。这是最根本的原因。无论是Intel的VT-x还是AMD的AMD-V必须在电脑BIOS/UEFI设置中开启。重启电脑进入BIOS通常是开机时按F2、Delete或F12找到“Virtualization Technology”或类似选项将其设置为“Enabled”。这是模拟器运行的硬件基础没开启的话后面所有步骤都白搭。第二步确认Hyper-V或Windows Hypervisor Platform状态。如果你使用的是Windows 10/11专业版或企业版系统可能默认开启了Hyper-V。Hyper-V与Deveco Studio模拟器通常基于QEMU/KVM可能存在冲突。你需要进入“控制面板 - 程序与功能 - 启用或关闭Windows功能”检查“Hyper-V”和“Windows Hypervisor Platform”的勾选状态。方案A推荐仅开启“Windows Hypervisor Platform”而关闭“Hyper-V”。然后重启电脑。这个方案在大多数情况下能完美兼容。方案B如果你必须使用Hyper-V例如为了运行Docker Desktop那么可以尝试在Deveco Studio中创建模拟器时选择“Remote Emulator”远程模拟器但这需要额外的配置和网络条件对新手不友好。第三步以管理员身份运行Deveco Studio。有时模拟器服务需要较高的系统权限才能正常启动。右键点击Deveco Studio图标选择“以管理员身份运行”再尝试启动模拟器。第四步清理并重建模拟器设备。如果之前的模拟器镜像损坏也会导致无限加载。在Deveco Studio的“Device Manager”中找到有问题的模拟器点击右侧的垃圾桶图标删除它。然后点击“New Emulator”创建一个新的。在创建时尽量选择“Phone”类别下标注为“Recommended”的镜像这些镜像最稳定。第五步查看日志定位问题。Deveco Studio的日志窗口Logcat或安装目录下的日志文件通常在用户目录\.devecostudio\版本号\log会提供更详细的错误信息。搜索“error”或“failed”关键词把错误信息复制到搜索引擎很大概率能找到具体的解决方案。按照这个顺序排查90%的模拟器加载问题都能解决。记住环境搭建是体力活耐心点一旦配好后面就顺畅了。3. 创建第一个项目理解“Ability”与“Page”环境搞定后我们终于可以创建第一个项目了。打开Deveco Studio选择“Create Project”。这里你会看到一堆模板对于初学者选择“Empty Ability”就足够了它是最纯净的起点。在项目配置页面有几个关键选项需要理解Project Name/项目名就是你工程文件夹的名字比如MyFirstHarmonyApp。Bundle Name/包名应用的唯一标识遵循反向域名规则如com.example.myfirstharmonyapp。这很重要未来上架应用市场会用到。Save Location/保存路径别放在中文或太深的目录下避免潜在路径问题。Compile SDK/编译SDK选择你之前下载的SDK版本。Model/模型这里选择“Stage模型”。这是鸿蒙目前主推且未来的方向它提供了更清晰的生命周期管理和更好的多端协同能力。另一个“FA模型”是旧模型除非维护老项目否则新项目一律用Stage模型。Enable Super Visual/启用低代码开发这是一个可视化拖拽UI的工具对于快速原型或简单界面有帮助。但作为初学者我建议先不勾选我们从代码开始才能更深刻地理解UI的构成。点击“Finish”IDE会花一些时间初始化项目并下载依赖通过ohpm。完成后你会看到一个标准的项目结构。对于Android开发者可以粗略类比entry主模块你的应用代码主要在这里。src/main/ets这是你的TypeScript/ArkTS代码所在目录相当于Android的java/kotlin目录。src/main/resources存放资源文件如图片、字符串、布局文件等。build-profile.json5模块级的构建配置。hvigorfile.ts项目级的构建脚本类似Android的settings.gradle和顶层build.gradle。现在打开entry/src/main/ets/entryability/EntryAbility.ts。这就是你应用的入口Ability。在鸿蒙中Ability是应用所具备能力的抽象也是应用组件运行的基本单元。它分为两种主要类型UIAbility包含UI界面用于与用户交互。我们的EntryAbility就是一个UIAbility。ExtensionAbility用于满足特定场景的扩展需求比如服务卡片、输入法、壁纸等没有UI界面。一个应用可以包含多个Ability。EntryAbility作为入口它的核心职责是管理这个Ability的生命周期。你会看到onCreate、onWindowStageCreate、onForeground、onBackground、onDestroy等方法。这些生命周期回调是应用稳定性的基石我们后续会详细讲。那么UI在哪呢看onWindowStageCreate方法内部onWindowStageCreate(windowStage: window.WindowStage): void { // 设置UI加载 windowStage.loadContent(pages/Index, (err, data) { if (err.code) { hilog.error(0x0000, testTag, Failed to load the content. Cause: %{public}s, JSON.stringify(err) ?? ); return; } hilog.info(0x0000, testTag, Succeeded in loading the content. Data: %{public}s, JSON.stringify(data) ?? ); }); }它加载了一个叫pages/Index的内容。这对应着src/main/ets/pages/Index.ets文件。这个.ets文件就是一个ArkUI页面Page。在Stage模型中一个UIAbility可以关联多个Page通过页面路由进行切换。现在打开Index.ets你会看到最基础的组件结构。4. ArkUI从“显示不了MP4”理解声明式UIIndex.ets里默认的代码使用了一个Text组件显示“Hello World”。但鸿蒙的UI框架ArkUI才是我们学习的重中之重。ArkUI提供了两种开发范式基于ArkTS的声明式开发范式和兼容JS的类Web开发范式。我们强烈推荐并专注于前者因为它是鸿蒙主推的、性能更优、体验更一致的开发方式。声明式UI的核心思想是描述你想要什么样的UI而不是一步步命令系统如何去创建和更新UI。状态驱动视图。我们来看一个比“Hello World”更进一点的例子顺便切入一个热搜问题“使用 h.264 mp4 鸿蒙开发还是显示不了mp4”。假设我们想在页面中间显示一段文字和一个视频播放器。Index.ets代码可能演变成这样Entry Component struct Index { State message: string 这是我的第一个鸿蒙视频页面; State videoSrc: Resource $rawfile(sample.mp4); // 假设项目resources/base/media下有个sample.mp4 build() { Column() { Text(this.message) .fontSize(30) .fontWeight(FontWeight.Bold) .margin({ top: 20, bottom: 20 }) // 视频组件 Video({ src: this.videoSrc, previewUri: $r(app.media.poster), // 预览图 controller: this.videoController }) .width(90%) .height(300) .margin({ bottom: 20 }) Button(播放/暂停) .onClick(() { if (this.isPlaying) { this.videoController.pause(); } else { this.videoController.start(); } this.isPlaying !this.isPlaying; }) } .width(100%) .height(100%) .justifyContent(FlexAlign.Center) } }这段代码做了几件事Entry装饰器表示这是个入口组件。Component表示这是个自定义组件。State装饰的变量是状态变量。当message或videoSrc的值改变时UI会自动更新。这是声明式UI的魔力。build()方法里我们用Column纵向布局、Text、Video、Button这些系统组件像搭积木一样描述UI。Video组件的src属性指定了视频源。这里用了$rawfile来引用resources/base/media目录下的本地文件。现在回到那个热搜问题“使用 h.264 mp4 鸿蒙开发还是显示不了mp4”。如果你严格按照上面的代码把sample.mp4文件放对了位置但视频还是黑屏或无法播放可能的原因有原因一视频文件路径或引用方式错误。检查文件位置确保你的sample.mp4文件放在entry/src/main/resources/base/media/目录下。base目录是默认资源目录鸿蒙会根据设备特性如语言、区域自动匹配更合适的资源目录但基础文件放在base里最保险。检查引用方式对于resources目录下的媒体文件使用$rawfile(filename.ext)来获取其资源路径。注意参数是相对于resources/base的路径且不需要media/前缀。如果文件在media子目录下直接写文件名即可。原因二视频编码或格式不支持。这是更常见的原因。虽然鸿蒙的Video组件支持MP4容器但对内部的视频编码格式有要求。H.264是广泛支持的编码但依然需要确认编码Profile尽量使用Main Profile或High Profile避免使用太古老或太超前的Profile。分辨率与码率过高的分辨率如8K或码率可能在模拟器或低端设备上无法硬解导致软件解码失败。尝试用一个标准的、较低分辨率的MP4文件如720p测试。关键帧间隔视频的关键帧间隔不宜过大。文件完整性视频文件本身是否损坏可以用其他播放器如VLC先确认文件能正常播放。原因三模拟器或真机能力限制。某些模拟器镜像可能对媒体解码支持不完整。尝试换一个不同的模拟器设备类型如从P40换到Mate 60的镜像再试。在真机上运行测试。这是最可靠的验证方式。通过USB连接华为鸿蒙手机需开启开发者模式和USB调试在Deveco Studio中选择真机设备运行看视频是否能播放。原因四权限问题仅限网络视频。如果你的视频源是网络URL需要在module.json5配置文件中声明网络权限requestPermissions: [ { name: ohos.permission.INTERNET } ]并且网络视频地址需要是有效的、可公开访问的且服务器支持跨域请求CORS。热搜词中提到的“服务器跨服访问”可能就是指CORS问题。对于本地文件则没有这个权限要求。通过这个“播放MP4”的例子我们不仅实践了ArkUI的基本组件使用还深入排查了一个具体问题。这种“遇到问题 - 理解原理 - 分层排查”的思路在鸿蒙开发中会反复用到。5. 工程结构与核心配置从“HAP安装包网站”说起当我们点击Deveco Studio的运行按钮IDE会编译、打包并安装应用到模拟器或真机。最终生成的安装包就是**.hap文件**HarmonyOS Ability Package。有开发者会搜索“鸿蒙hap安装包网站”可能是想直接下载别人的应用进行研究或者寻找分发渠道。这里需要明确官方正式的HAP包分发渠道是华为应用市场AppGallery。开发者将应用签名后上传到AppGallery用户从那里下载安装。普通情况下你无法像APK那样随意安装一个未签名的HAP包到非开发设备上。那么我们开发时生成的HAP包在哪它又依赖哪些配置呢这就要理解鸿蒙的工程结构。一个典型的鸿蒙应用工程是多模块的。entry模块是我们主要开发的应用模块编译后生成一个HAP。一个应用可以包含多个HAP例如主应用HAP和一个独立的功能插件HAP。这些HAP最终会被打包成一个**.app文件**HarmonyOS Application Package用于上架应用市场。每个模块的核心配置文件是module.json5。这个文件定义了该模块的几乎所有元信息重要性堪比Android的AndroidManifest.xml。我们挑几个新手必须理解的配置项看看{ module: { name: entry, // 模块名 type: entry, // 模块类型entry(主模块)、feature(功能模块)、har(静态共享包)、hsp(动态共享包) description: $string:module_desc, mainElement: EntryAbility, // 入口Ability名称 deviceTypes: [ // 支持设备类型 phone, tablet ], deliveryWithInstall: true, // 是否随应用安装 installationFree: false, // 是否支持免安装特性原子化服务 pages: $profile:main_pages, // 页面路由信息指向resources/base/profile/main_pages.json abilities: [ // Ability声明列表 { name: EntryAbility, srcEntry: ./ets/entryability/EntryAbility.ts, description: $string:EntryAbility_desc, icon: $media:icon, label: $string:EntryAbility_label, startWindowIcon: $media:icon, startWindowBackground: $color:start_window_background, exported: true, // 是否允许其他应用调用 skills: [ // 能够响应的意图Intent类型 { actions: [ action.system.home ], entities: [ entity.system.home ] } ] } ], requestPermissions: [ // 声明需要的权限 { name: ohos.permission.INTERNET } ] } }deviceTypes决定了你的应用可以安装在哪些类型的设备上。如果你开发的是手表应用这里就需要加上wearable。installationFree这是鸿蒙原子化服务的关键。设置为true时该模块可以独立分发和运行无需完整安装应用实现了“服务直达”的理念。abilities每个UIAbility都必须在这里声明。skills字段定义了该Ability能响应的“意图”比如action.system.home表示这是一个入口Ability会被启动器识别。requestPermissions这里声明的权限需要在应用首次使用时向用户动态申请。另一个重要文件是项目根目录下的app.json5它定义了应用级别的信息如应用名、版本号、厂商等。理解这些配置是构建一个合规、可分发应用的基础。当你未来需要添加新Ability、申请权限、适配新设备时都要回来修改这些配置文件。6. 生命周期与状态管理告别“汗流浃背”的混乱“鸿蒙生命周期”是另一个热搜词也是开发中容易让人混乱的地方。在Stage模型中生命周期管理比FA模型更清晰但依然涉及多个层级UIAbility生命周期、WindowStage生命周期和UI组件/Page生命周期。理解它们的关系和触发时机是避免应用崩溃、内存泄漏和状态错乱的关键。UIAbility生命周期这是最高层级的生命周期管理着Ability进程的创建、前后台切换和销毁。主要回调有onCreate: Ability被创建时调用通常进行一些初始化操作但此时UI窗口还未创建。onWindowStageCreate: UI窗口舞台创建后调用。这里是加载UI内容的唯一推荐位置我们之前看到的windowStage.loadContent()就是在这里调用的。onForeground: Ability从后台回到前台即将对用户可见时调用。onBackground: Ability从前台退到后台不再对用户可见时调用。应在此释放非必要的独占资源如摄像头。onWindowStageDestroy: UI窗口舞台销毁时调用。onDestroy: Ability被销毁时调用进行最终的资源清理。WindowStage生命周期它管理着UI窗口的状态但通常我们直接使用windowStage.loadContent来加载页面其更细粒度的回调使用场景相对较少。UI组件/Page生命周期这是我们在每个页面或自定义组件中最常打交道的。在Component装饰的struct中可以通过装饰器来监听aboutToAppear: 组件即将出现时调用适合进行数据初始化。aboutToDisappear: 组件即将消失时调用适合取消订阅或清理临时状态。状态管理是声明式UI的引擎。ArkUI提供了多种装饰器来定义状态它们决定了状态变化的范围和驱动UI更新的方式State:组件内状态。当State修饰的变量改变时只会触发当前组件及其子组件的UI更新。这是最常用、最基础的状态。Prop:从父组件单向同步的状态。子组件用Prop接收父组件传递的值子组件内部可以修改它但不会同步回父组件。用于父子组件间的单向数据流。Link:与父组件双向同步的状态。子组件对Link变量的修改会同步回父组件对应的State或Link变量。用于需要双向绑定的场景。Provide和Consume:跨组件层级提供/消费状态。祖先组件用Provide提供一个状态任意层级的后代组件都可以用Consume来消费和响应它。适用于跨多层的状态共享避免了层层传递的麻烦。Observed和ObjectLink: 用于嵌套对象或类对象的状态管理。Observed装饰类ObjectLink装饰该类的成员变量使得对象内部属性的变化也能被观察到并触发UI更新。一个常见的“坑”是错误地使用State来管理大型复杂对象或数组。直接修改对象内部的属性如this.myObject.name new不会触发UI更新。正确的做法是使用Observed装饰这个类。在组件中用ObjectLink或State配合展开运算符...或JSON.parse(JSON.stringify(...))创建新对象来持有该对象的实例。例如Observed class User { name: string ; age: number 0; } Component struct UserProfile { ObjectLink user: User; // 现在修改user.name或user.age会触发UI更新 build() { Column() { Text(this.user.name).onClick(() { this.user.name New Name; // UI会更新 }) } } }理解并正确运用生命周期和状态管理你的应用就有了坚实的骨架和灵敏的神经不会再因为状态不同步或资源未释放而“汗流浃背”。7. 资源与数据管理让应用“活”起来一个只有静态UI的应用是枯燥的。我们需要图片、字符串、颜色更需要从网络或本地获取数据。这就是资源和数据管理要解决的问题。资源访问鸿蒙的资源统一放在resources目录下并按类型和限定词如语言、屏幕密度进行细分。在代码中访问资源有几种固定方式$r(app.type.name): 访问应用资源这是最常用的方式。例如$r(app.string.hello)获取字符串。$r(app.media.icon)获取媒体资源图片等。$r(app.color.primary)获取颜色。$rawfile(filename): 访问resources/base目录下的原始文件路径常用于Video、Image等组件加载本地媒体文件。$string、$color等在*.json配置文件中引用资源时使用的语法糖。本地数据持久化轻量级数据可以使用Preferences类似Android的SharedPreferences而更复杂的关系型数据则可以使用鸿蒙的关系型数据库。热搜词中出现了“鸿蒙 arcts 数据库”这很可能指的是在ArkTS中使用关系型数据库。鸿蒙的关系型数据库基于SQLite但通过一套类型安全的ORM-like API提供访问这就是ohos.data.relationalStore。使用步骤通常如下获取RDB关系数据库上下文。配置数据库版本和信息创建或打开数据库。执行SQL语句创建表、增删改查数据。使用结果集处理查询返回的数据。这里有一个简单的示例演示如何创建一个存储用户信息的表并插入数据import relationalStore from ohos.data.relationalStore; import { BusinessError } from ohos.base; Entry Component struct DatabaseDemo { // 定义数据库配置 private storeConfig: relationalStore.StoreConfig { name: MyApplication.db, // 数据库文件名 securityLevel: relationalStore.SecurityLevel.S1 // 安全级别 }; private rdbStore: relationalStore.RdbStore | undefined undefined; aboutToAppear() { this.initRdb(); } async initRdb() { try { // 1. 获取RDB上下文 const context getContext(this) as common.UIAbilityContext; // 2. 获取RDB关系数据库 relationalStore.getRdbStore(context, this.storeConfig, (err: BusinessError, store: relationalStore.RdbStore) { if (err) { console.error(Failed to get RdbStore. Code:${err.code}, message:${err.message}); return; } this.rdbStore store; console.info(Succeeded in getting RdbStore.); // 3. 创建表 const sql CREATE TABLE IF NOT EXISTS user ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER); this.rdbStore.executeSql(sql, [], (err: BusinessError) { // 错误处理... console.info(Table created or already exists.); // 4. 插入数据示例 this.insertData(张三, 25); }); }); } catch (error) { const err: BusinessError error as BusinessError; console.error(Failed to init RDB. Code:${err.code}, message:${err.message}); } } async insertData(name: string, age: number) { if (!this.rdbStore) return; const valueBucket: relationalStore.ValuesBucket { name: name, age: age }; this.rdbStore.insert(user, valueBucket, (err: BusinessError, rowId: number) { if (err) { console.error(Failed to insert data. Code:${err.code}, message:${err.message}); return; } console.info(Succeeded in inserting data. rowId:${rowId}); }); } build() { // ... UI代码例如一个按钮触发插入操作 } }注意所有数据库操作都是异步的需要使用回调或Promise部分API支持来处理结果。对于复杂的查询可以使用query方法并构建relationalStore.RdbPredicates对象来设置查询条件。这套API虽然需要一些学习成本但它提供了比直接写SQL字符串更好的类型安全和编译时检查。网络请求使用ohos.net.http模块。记得先在module.json5中声明ohos.permission.INTERNET权限。一个简单的GET请求示例import http from ohos.net.http; async function fetchData() { let httpRequest http.createHttp(); try { let response await httpRequest.request( https://api.example.com/data, { method: http.RequestMethod.GET, connectTimeout: 60000, readTimeout: 60000, } ); if (response.responseCode 200) { let data response.result.toString(); console.info(Result: data); // 处理数据更新State变量以驱动UI } else { console.error(Request failed, code: ${response.responseCode}); } } catch (err) { console.error(Request error: ${JSON.stringify(err)}); } finally { httpRequest.destroy(); } }将资源、本地数据库和网络请求结合起来你的应用就能展示动态内容、记住用户偏好真正“活”起来。8. 调试、打包与上架从开发到发布的最后一公里代码写完了本地运行也正常接下来就要考虑打包和发布了。但在打包之前充分的调试是保证质量的关键。调试技巧日志除了使用console.log/info/error鸿蒙提供了更强大的hilogHiLog系统可以按级别、按标签过滤日志在Deveco Studio的Logcat窗口查看。断点调试和传统IDE一样在代码行号旁点击设置断点然后在模拟器或真机上以调试模式运行应用程序执行到断点处就会暂停可以查看变量、调用栈单步执行。布局边界与重绘检查在模拟器的“设置 - 开发者选项”中可以开启“显示布局边界”等功能帮助检查UI布局是否合理。性能分析器Deveco Studio内置性能分析工具可以监控CPU、内存、帧率等定位性能瓶颈。打包与签名在Deveco Studio中选择“Build - Build Haps(s) - Build Release Hap(s)”可以生成Release版本的HAP包。但直接生成的HAP包不能安装到非开发设备上必须进行签名。应用签名是鸿蒙应用安全分发的基础。你需要在华为开发者联盟创建项目和应用。生成签名证书文件.p12和证书profile文件.p7b。这个过程可以在Deveco Studio的“File - Project Structure - Project - Signing Configs”中可视化完成需要填写一系列信息如密钥别名、密码、公司信息等。配置好签名后再执行Build生成的HAP包就是已签名的。发布上架将签名后的HAP包实际上传的是.app包由多个HAP打包而成上传到华为AppGallery Connect填写应用详情、截图、隐私政策等提交审核。审核通过后你的应用就可以在华为应用市场被用户搜索和下载了。关于热搜词中提到的“electron 打鸿蒙安装包”和“flutter 环信 鸿蒙”这涉及到跨平台框架与鸿蒙的集成。目前鸿蒙对Web和Flutter生态有一定的兼容性支持例如通过Web组件或特定的适配层但并非原生支持Electron或Flutter直接编译成HAP。华为提供了鸿蒙版本的Flutter引擎ArkUI on Flutter以及让现有移动应用快速兼容鸿蒙的方舟编译器迁移工具但这属于更进阶的、从现有生态迁移的范畴。对于从零开始的鸿蒙原生应用开发坚持使用ArkTS和声明式UI范式是官方推荐且体验最佳的道路。走到这一步你已经完成了一个鸿蒙应用从环境搭建、编码、调试到打包的完整闭环。回顾这个过程最深的体会是鸿蒙开发入门的学习曲线确实存在尤其是思维需要从传统的命令式UI转向声明式UI。但一旦跨过最初的理解门槛其清晰的架构、强大的状态管理和统一的多端能力会带来很高的开发效率。我建议新手不要一开始就追求复杂的多端协同或原子化服务而是扎扎实实把一个单设备应用做透理解好Ability、ArkUI组件、状态管理和资源访问这些核心概念。当你对这些基础游刃有余时再去探索分布式软总线、跨端迁移等更炫酷的特性就会事半功倍。
返回列表