【鸿蒙心迹】从深夜的"灵光一现"到万人使用的开发者工具箱

深夜调试时的突发奇想,成就了一个为鸿蒙开发者量身定制的工具箱,这里有我的开发故事和心路历程

前言

大家好,我是一名普通的鸿蒙开发者。今天想和大家分享一下我在鸿蒙开发路上的"独家记忆"——一个从深夜灵感开始的开发者工具箱项目。

其实写这篇文章之前,我纠结了很久。作为一个独立开发者,总觉得自己的经历可能没什么特别的,说出来会不会显得很普通?但后来想想,也许正是这些真实的、不那么完美的经历,才能真正引起大家的共鸣。

所以今天就来聊聊我的故事吧,虽然不是什么惊天动地的大事,但对我来说,每一步都挺有意义的。

那个改变一切的深夜

深夜的灵感迸发

2024年12月的一个深夜,大概凌晨2点多吧,我还在为一个鸿蒙项目调试网络问题。当时我需要在手机上测试网络连通性,但发现手机上没有合适的工具。于是我打开了电脑,使用电脑上的网络工具,然后又回到手机继续开发。

这种在两个设备之间来回切换的感觉真的很糟糕,我当时就想,为什么要在两个设备之间这么折腾呢?

那一刻,我突然意识到:为什么不能有一个专门为鸿蒙开发者设计的工具箱呢?

现在回想起来,这个想法冒出来的时候,我自己都有点懵。但越想越觉得有道理,越想越兴奋。这个想法让我兴奋得睡不着觉,连夜画出了第一版功能架构图。那一夜,我仿佛看到了一个全新的可能性,虽然当时还不知道这个想法能不能实现。

从个人痛点到团队使命

最初这只是我个人的一个想法,但随着在鸿蒙开发者社区中的交流,我发现很多开发者都有类似的困扰。

记得有一次在群里,大家讨论开发工具时,有人说:"每次需要处理JSON数据都要打开电脑,太麻烦了",还有人说:"网络调试工具分散在各个平台,使用起来很繁琐"。当时我就想,看来不只是我一个人有这种困扰啊。

这些反馈让我意识到,这不仅仅是我一个人的需求,而是整个鸿蒙开发者群体的痛点。那一刻,我突然觉得自己的这个想法可能真的有意义,也许真的能帮到大家。

那一刻,我下定决心:要打造一个专属于鸿蒙开发者的综合工具箱。

虽然当时还不知道能不能成功,但至少值得一试,万一真的能帮到大家呢?

我的"鸿蒙工具箱"诞生记

项目愿景

打造一个专属于鸿蒙开发者的综合工具箱,让开发者能够在一个应用中完成大部分开发辅助工作,真正实现"一个应用,解决所有开发需求"的愿景。

这个愿景听起来可能有点大,但我真的觉得这就是我们要努力的方向。

功能架构设计

这个工具箱包含了20多个实用工具,覆盖了开发、测试、调试的各个环节。刚开始规划的时候,我自己都被这个数量吓了一跳,没想到能规划出这么多功能。主要分为5大模块:

  • 系统工具:设备信息查看、系统状态监控、电池健康检测
  • 网络工具:Ping测试、端口扫描、网络测速、DNS查询、子网计算
  • 数据处理:AES加解密、MD5工具、密码生成器、各种格式转换
  • 开发辅助:JSON格式化、HTTP测试、二维码工具、图标查看
  • 云服务:CloudDB、云函数、云存储

特别值得一提的是,应用还集成了华为账号登录、服务卡片、多端适配等鸿蒙特色功能,支持主题切换、收藏夹、使用历史等个性化体验。

独行侠的坚持

一个人的团队

目前团队只有我一个人,但这反而成了项目的优势。作为独立开发者,我能够快速决策,不需要复杂的团队沟通,可以快速响应用户需求。

从前端到后端,从UI设计到功能开发,我全程参与。刚开始的时候,每天投入12小时以上的专注开发时间,确实有点累,但看到项目一点点成型,那种成就感真的很棒。现在回想起来,那段时间虽然辛苦,但很充实,每天都有新的收获。

我的技术背景

我从鸿蒙3.0开始就深度参与生态建设,有5年移动端开发经验和3年云服务开发经验。平时在Gitee上维护一些开源项目,积极参与开源社区。也在CSDN、掘金等平台分享鸿蒙开发经验,累计阅读量有10万+。

这个阅读量听起来还不错,但我觉得更重要的是能够真正帮助到其他开发者。每次看到有朋友在评论区说"学到了"或者"解决了我的问题",那种满足感是无法用数字来衡量的。

开发路上的"独家记忆"

故事一:服务卡片的"意外发现"

在开发服务卡片功能时,我原本只是想做一个简单的设备信息展示卡片。但在测试过程中,我发现卡片可以实时更新数据,这让我想到了一个更有趣的应用场景:网络状态监控卡片。

当时我就想,如果能实时显示网络延迟、下载速度,那不是很酷吗?于是我连夜开发了一个可以实时显示网络延迟、下载速度的卡片。那天晚上我兴奋得都忘了时间,直到早上6点才睡,第二天上班的时候差点迟到。

第二天分享给社区后,获得了大量好评,甚至有开发者主动联系我,希望为这个功能贡献代码。当时我真的没想到会有这么好的反响,心里还挺开心的。

这个意外的发现让我意识到,有时候最好的功能往往来自于开发过程中的灵光一现。

故事二:多端适配的"痛苦"与"快乐"

适配手机、平板、鸿蒙电脑三端是我遇到的最大挑战。每个设备的交互方式都不同:

  • 手机:触摸操作,需要大按钮
  • 平板:触控笔支持,需要精确操作
  • 电脑:鼠标键盘,需要快捷键支持

刚开始适配的时候,我真的有点崩溃。每次在不同设备上测试,都要重新调整布局,那段时间我连续一周每天工作到凌晨2点,眼睛都快瞎了,咖啡都喝了好几盒。

但功夫不负有心人,最终设计出了一套响应式布局系统。当看到应用在不同设备上都能完美运行时,那种成就感是无法描述的。我记得那天晚上,我兴奋得在房间里转了好几圈,还特意拍了个小视频记录下这个时刻。

故事三:用户反馈的"惊喜"

在项目开发过程中,我经常在开发者社区分享进度。有一次,一位来自深圳的开发者私信我说他在使用我的工具时发现了一个bug,并主动提供了修复方案。

当时我还有点紧张,以为是要来投诉的。但没想到,他不仅提供了详细的bug描述,还给出了修复方案。更让我感动的是,他还说:"你的工具真的帮了我很多,希望你能继续开发下去。"

当时看到这条消息,我真的有点想哭。那种被认可的感觉,真的无法用言语表达。那一刻,我真正感受到了开源社区的温度,也明白了为什么那么多开发者愿意为开源项目贡献代码。

开发历程回顾

第一阶段:灵感与规划(2024年12月)

这个阶段其实挺有意思的,主要是深夜调试时的灵感迸发,然后在开发者社区调研需求,最后确定技术方案:ArkTS + ArkUI + 云服务。

当时调研需求的时候,我发现大家的痛点比我想象的还要多,这让我更加坚定了做这个项目的决心。

第二阶段:核心功能开发(2025年1月-2月)

这个阶段是最累的,主要开发基础工具模块(数据处理、网络工具等),集成华为账号登录系统,还有实现云数据库和云函数功能。

那两个月,我基本上每天都是凌晨才睡,但看到功能一个个实现,那种成就感真的很棒。

第三阶段:鸿蒙特性集成(2025年3月)

这个阶段开始有趣了,主要是开发服务卡片功能,集成扫一扫能力,还有优化多端适配体验。

特别是服务卡片功能,让我发现了鸿蒙生态的很多有趣特性,这个后面会详细说。

第四阶段:完善与优化(2025年4月-5月)

最后这个阶段主要是性能优化和用户体验提升,完善文档和测试用例,还有准备应用上架。

优化阶段比开发阶段还要累,因为要反复测试各种边界情况,但为了给用户最好的体验,这些都是值得的。

鸿蒙特性的深度应用

1. 流畅动效与预加载

  • 采用ArkUI声明式开发,实现60fps流畅动画
  • 实现智能预加载机制,提升工具启动速度
  • 使用懒加载技术优化大数据量处理
  • 弱网环境下智能降级,保证基础功能可用

2. 服务卡片创新应用

开发了多款实用服务卡片:

  • 设备信息卡片:实时显示设备状态、系统信息
  • 网络工具卡片:快速进行Ping测试、端口扫描
  • 数据处理卡片:常用转换工具快捷入口
  • 系统状态卡片:实时监控CPU、内存使用情况

卡片支持动态更新和交互操作,支持统一拖拽操作,提升用户体验。

3. 跨设备互联体验

  • 支持手机、平板、鸿蒙电脑三端无缝切换
  • 数据云端同步,多设备数据一致性
  • 利用分布式能力实现设备间工具共享
  • 计划支持碰一碰快速分享工具配置

4. AI能力集成

  • 集成华为AI服务,提供智能文本处理
  • 二维码智能识别和生成
  • 智能密码生成算法

二维码功能实现示例

在开发过程中,二维码功能是我比较满意的一个模块。这里分享一下核心实现代码:

导入必要模块:

import router from '@ohos.router'
import promptAction from '@ohos.promptAction'
import { scanCore, scanBarcode } from '@kit.ScanKit'
import { hilog } from '@kit.PerformanceAnalysisKit'
import pasteboard from '@ohos.pasteboard'
import common from '@ohos.app.ability.common'
import image from '@ohos.multimedia.image'
import fileio from '@ohos.fileio'
import { photoAccessHelper } from '@kit.MediaLibraryKit'
import { StorageUtil } from '../../utils/storage'
import { componentSnapshot } from '@kit.ArkUI'
import { fileIo } from '@kit.CoreFileKit'
import { BusinessError } from '@kit.BasicServicesKit'

扫描功能实现:

private startScan() {
  try {
    let options: scanBarcode.ScanOptions = {
      scanTypes: [scanCore.ScanType.ALL],
      enableMultiMode: true,
      enableAlbum: true
    }

    scanBarcode.startScanForResult(getContext(this), options, (error, result: scanBarcode.ScanResult) => {
      if (error) {
        hilog.error(0x0001, 'QRCodeTool', `Failed to get ScanResult. Code: ${error.code}, message: ${error.message}`)
        promptAction.showToast({ message: '扫描失败' })
        return
      }

      if (result) {
        try {
          console.info('Scan result:', JSON.stringify(result))
          
          let scanText = ''
          if (typeof result === 'object') {
            scanText = result['originalValue'] || result['result'] || result['value'] || ''
          }

          if (scanText) {
            this.scanContent = scanText
            hilog.info(0x0001, 'QRCodeTool', `Scan success: ${scanText}`)
            promptAction.showToast({ message: '扫描成功' })
          } else {
            hilog.error(0x0001, 'QRCodeTool', 'Empty scan result')
            promptAction.showToast({ message: '未获取到扫描内容' })
          }
        } catch (err) {
          hilog.error(0x0001, 'QRCodeTool', `Parse result error: ${err}`)
          promptAction.showToast({ message: '解析扫描结果失败' })
        }
      }
    })
  } catch (error) {
    hilog.error(0x0001, 'QRCodeTool', `Failed to startScanForResult. Code: ${error.code}, message: ${error.message}`)
    promptAction.showToast({ message: '启动扫码失败' })
  }
}

保存功能实现:

// 打包 PixelMap 为 jpg 格式
async packingPixelMap2Jpg(pixelMap: PixelMap): Promise<ArrayBuffer> {
  const imagePackerApi = image.createImagePacker();
  const packOpts: image.PackingOption = { format: "image/jpeg", quality: 98 };
  let imageBuffer: ArrayBuffer = new ArrayBuffer(1);
  try {
    imageBuffer = await imagePackerApi.packing(pixelMap, packOpts);
  } catch (err) {
    console.error(`Invoke packingPixelMap2Jpg failed, err: ${JSON.stringify(err)}`);
  }
  return imageBuffer;
}

// 保存图片到相册
async savePhotoToGallery(context: common.UIAbilityContext) {
  let helper = photoAccessHelper.getPhotoAccessHelper(context);
  try {
    const imageBuffer = await this.packingPixelMap2Jpg(this.pixmap as image.PixelMap)
    
    let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');
    let file = await fileIo.open(uri, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
    await fileIo.write(file.fd, imageBuffer);
    await fileIo.close(file.fd);
    promptAction.showToast({ message: '已保存至相册!' });
  }
  catch (error) {
    const err: BusinessError = error as BusinessError;
    console.error(`Failed to save photo. Code is ${err.code}, message is ${err.message}`);
  }
}

复制功能实现:

private async copyToClipboard(content: string) {
  try {
    const pasteData = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, content)
    const systemPasteboard = pasteboard.getSystemPasteboard()
    await systemPasteboard.setData(pasteData)
    await promptAction.showToast({ message: '已复制到剪贴板' })
  } catch (error) {
    console.error('复制失败:', error)
    await promptAction.showToast({ message: '复制失败' })
  }
}

这个二维码模块虽然看起来简单,但实际开发中还是遇到了不少问题。比如扫描结果的解析、图片保存的权限处理等,都是需要仔细调试的地方。好在鸿蒙的API设计比较友好,最终实现的效果还是很不错的。

5. 安全与隐私保护

  • 实现隐私弹窗功能,符合鸿蒙隐私规范
  • 数据加密存储和传输
  • 用户权限精细化管理
  • 华为账号登录,确保用户数据安全

独特价值与创新点

1. 场景创新

  • 开发者一站式工具箱:首次将开发、测试、调试工具集成在一个应用中
  • 多端协同开发:支持开发者在不同设备间无缝切换工作
  • 云原生开发体验:集成云数据库、云函数,降低开发门槛

2. 设计创新

  • 模块化设计:工具模块可独立使用,也可组合使用
  • 响应式布局:完美适配手机、平板、电脑三种设备形态
  • 主题自适应:支持系统主题、浅色、深色三种主题模式

3. 技术贡献

我的"小目标"

作为一个独立开发者,我也有自己的小目标:

  1. 希望成为鸿蒙生态中最有影响力的开发者之一(虽然听起来有点大,但梦想总是要有的嘛)
  2. 通过免费工具的方式帮助更多开发者(这个我觉得是最重要的)
  3. 通过这个项目提升自己的技术能力和项目管理能力(毕竟一个人要管整个项目,挑战还是挺大的)

说实话,这些目标听起来可能有点理想主义,但我相信只要坚持初心,总有一天能够实现的。

项目亮点总结

这个项目有几个让我比较自豪的亮点:

  1. 它是首个专为鸿蒙开发者设计的综合工具箱
  2. 覆盖了开发全流程的各类工具
  3. 深度应用了鸿蒙特有功能
  4. 真正解决了开发者的实际痛点
  5. 还支持多端适配和功能扩展

开发路上的"小确幸"

开发过程中有很多让我感动的小瞬间:

  • 经常在凌晨3点还在调试代码,但每当解决一个技术难题时,那种兴奋感让我忘记了疲惫(虽然第二天起床的时候还是很累)
  • 在鸿蒙开发者群里,经常有开发者讨论我的工具,这让我感到非常自豪(每次看到有人推荐我的工具,我都会偷偷截图保存)
  • 每次成功集成新的鸿蒙特性时,都会有一种"我又进步了"的成就感(这种感觉真的很棒)

这些小瞬间虽然看起来微不足道,但正是它们支撑着我一路走下去。

写在最后

作为一个独立开发者,开发这个项目的过程充满了挑战和收获。从最初的个人想法,到现在的完整应用,每一步都让我成长。

为什么要做这样一款免费的应用?

这个问题很多人问过我。其实很简单,因为我相信,好的工具应该让更多人受益。我希望通过免费工具的方式,为鸿蒙生态贡献一份力量,让更多的开发者能够享受到高效、便捷的开发体验,而不需要为工具付费。

虽然这样做可能赚不到钱,但我觉得能够帮助到其他开发者,那种成就感比赚钱更有意义。

未来的路

未来的路还很长,但我相信,只要坚持初心,就一定能够实现梦想。虽然我只是一个普通的独立开发者,但我相信每一个小的努力,都能为鸿蒙生态带来一点点的改变。

如果你也是鸿蒙开发者,或者对鸿蒙生态感兴趣,欢迎来体验这个工具箱。也许它也能成为你开发路上的得力助手。如果有什么问题或者建议,也欢迎随时联系我,我们一起交流学习。


结语

这就是我和鸿蒙开发的"独家记忆"。从一个深夜的灵感开始,到现在的完整应用,每一步都充满了挑战和收获。

技术路上,我们都不是一个人在战斗。

每一个开发者都有自己的故事,每一个项目都承载着开发者的梦想。希望我的故事能够给正在鸿蒙开发路上的你一些启发和鼓励。

记住:最好的代码,往往来自于最真实的需求和最纯粹的初心。


相关链接

这个工具箱里还有很多其他实用功能,都是我用鸿蒙组件开发的,大家可以参考一下。如果有什么问题或者想交流经验,欢迎在评论区留言,我会尽量回复的!

让我们一起为鸿蒙生态贡献自己的力量!


"每一个深夜的灵感,都可能改变世界。"

—— 一名普通的鸿蒙开发者

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐