鸿蒙开发不是换皮安卓:我在写分布式应用时踩过的真实坑
先说实话,我一开始也以为鸿蒙就是套了个壳的安卓,毕竟ArkTS看着像TS,布局像XML,连IDE都是Android Studio换皮。直到我接了个需求——做一个跨手机和平板的笔记应用,才明白自己错得离谱。安卓开发是“围绕单个设备”打转,而鸿蒙从底层就逼着你思考“设备之间怎么配合”。这种思维转变,比学什么新语法都痛苦。
第一坑:权限和分布式不是一回事
官方文档把分布式说得天花乱坠,但你真正拿两台设备调试时,会发现光是拉起对端设备就有一堆破事。我用的API是DeviceManager发现设备,然后通过DataAbility传输数据,结果在真机上经常出现设备列表刷新慢、连接超时。后来查了社区才知道,必须先把两个设备登录同一个华为账号,并且开启蓝牙和Wi-Fi,还要在config.json里显式声明distributed权限。但最恶心的是,这个权限的申请时机和Android完全不同——它不是在运行时弹窗,而是要在"首次启动时引导用户授权",如果漏了这一步,后续所有分布式API都会静默失败,不报错,不提示,就是返回空值。
用“同一条数据”而不是“传一份数据”
鸿蒙最核心的思维转变是分布式数据库。传统安卓开发,你要么用ContentProvider,要么用网络请求同步,本质上是“复制”数据。但鸿蒙的@DistributedData注解让我可以在多个设备上操作同一条记录,系统自己处理冲突和同步。听起来很酷,对吧?但等你真去用,会发现字段类型限制很严——不支持BLOB,不支持复杂的嵌套Json,连自增主键都要自己维护。我为了迁一个笔记表结构,花了整整两天写清洗脚本。更离谱的是,分布式数据库的查询能力非常弱,不能联表,不能聚合,连LIKE都只支持前缀匹配。如果你要做稍微复杂的搜索,得先把数据拉到本地再过滤,那分布式省下的时间又全还回去了。
元服务不是小程序,也别当快应用
鸿蒙的元服务是另一个让我产生幻觉的东西。我原以为和微信小程序差不多——分包加载、动态化页面、用完即走。结果开发时发现,元服务要求你必须用ArkTS的Stage模型,还要声明EntryAbility的显式路由,而且它不能随意访问系统API,比如定位和相册必须通过临时权限申请,用完还要主动释放。有种在铁丝网上跳舞的感觉。最让我崩溃的是,元服务的体积限制是10M,但它的构建工具不会提示你哪里超了,只有上架审核时才告诉你——我本地调试完全正常,审核被拒了三次才找到原因:一张背景图占了3M。后来我学乖了,所有图片都改webp,字体全部裁剪子集,连阴影效果都换成代码绘制。如果你的项目也打算做元服务,我建议一开始就用资源压缩做预检,别等提交。
对比安卓,鸿蒙的“组件通信”反而更复古
开发到第二周,我还没摆脱安卓习惯:用startAbility传参数时,我下意识地像Intent那样塞一个大Bundle进去。然后崩溃了——鸿蒙的Want不支持序列化自定义对象,只允许放基础类型和字符串数组。官方推荐用RequestOptions或EventHub来传状态,但EventHub本质是全局事件总线,用多了之后代码变得特别隐式,调试时根本不知道那个事件是谁发出来的。反观安卓的ViewModel+LiveData,至少生命周期是明确的。鸿蒙这套东西,写小Demo很爽,写大项目就考验你的架构能力了。我最后不得不用AppStorage做全局状态管理,还在关键页面里存了一个LocalStorage来隔离作用域,才勉强让工程可维护。
总结:鸿蒙值得学,但别用安卓思维硬套
如果你已经厌倦了安卓那个越来越臃肿的生态,鸿蒙的开发体验确实有一种早期安卓的野性——自由度和坑一样多。它的分布式不只是API层面的花活,而是逼着你重新思考设备边界。但现实是,鸿蒙的设备协同在纯手机场景下并没有太多优势,分布式数据库性能也不如本地SQLite。我的建议是:先拿一个具体场景(比如多屏协同、远程控制)练手,别直接做大而全的应用。另外,多逛鸿蒙开发者社区的踩坑帖,官方文档的示例代码基本只能跑通“两台模拟器”,很多真机的权限和网络问题,都是社区用户拿血泪填出来的。未来如果鸿蒙能放宽分布式数据的类型限制,再把组件通信的API做得像ActivityResult那样规范一点,它确实有可能成为下一代移动开发的起点。目前来看,它更像是一个让你重新思考“应用边界”的催化剂,谁先适应这种思维,谁就可能在多设备时代占住坑位。