记 UWP 应用迁移 WinUI3 架构踩的坑
记 UWP 应用迁移 WinUI3 架构踩的坑
最近因为 bug 不得不暂时进行一次 UWP 中型项目的迁移至 WinUI3 架构,耗时两天,大约 20-30 小时。结果原来 UWP 版的 bug 在 UI3 刚发布两小时不到就有解决方案了,迁移后的项目只能作为备选了。
优点
- 方便的单独打包和侧载,可以非常方便按 exe 发布刚打完的包,和传统 Win 应用一样。
- 丰富强大的社区库,虽然现在其他平台的库也很丰富,不过 .net 库的强大不用说了。
- 后续 MS 的支持,WinAPPSDK还在更新, 后续还有更多的 API 和 AI 的功能支持。
遇到开发中的坑
以下问题仅代表本文章发布时在 WinUI3 遇到的问题
- 发布文件生成失败:store关联StoreAssociation.xml文件生成失败,导致打包失败,失败提示网上根本搜不到,老项目的关联文件贴过来就能用了。
- 发布包不启动:打完的包启动就闪退,这个问题之前也遇到过,原因是引用了CommunityToolkit的Uno WinU3包,这个问题不会出现在 debug 和 release,只会打完包,然后根本不启动exe,WinUI3 经常遇到类似引的包,导致整个项目启都启不起来,但是 debug 又没事,定位问题困难。
- 发布包部分功能不执行:WinAppSDK1.6默认新加了功能 aot,不说原理,效果就是会裁剪包,让安装包大小小很多,并且启动速度和.net native也就是uwp媲美,但是这个code裁剪目前对于我这个稀烂的程序员,里面代码要求比较严格,会裁剪掉本来就要用的代码块。所以又是和2类似的问题,你debug根本看不出问题,打完包又发现列表绑定失效等等。经过几小时的搜索,通过 AllowUnsafeBlocks + TrimMode改成partial + PublishAot改成false,发布包终于正常了。
- 生成包语言只有默认:x-generate不生效,只有进 Package.appxmanifest 里面把所有要生成 Resource 的包的语言一个个加上才生成。
- 部分 API 变更:情理之中,但有时候一样的功能,代码改动太大了,原来的代码复用性不高,就改的比较麻,印象深刻是一个ResourceLoader,还有一个是弹窗要定 XamlRoot。
- CsWinRT和Win32代码混用: 当然也可能是老 UWP 项目迁移的问题,就有时候用 Win32 本地的 dll,比较像一块电路板原来像UWP一样必须要规规矩矩设计,突然有些功能非常狂野,一根线就飞过去,飞来飞去。但是功能也的确实现了。
UWP与Win32较量中的利与弊
这里抛开平台之间的较量,这时候肯定有读者说,不会吧不会吧,5202年还有 .net 开发者吧。
Win32利与UWP弊
- 底层 API 代码支持:UWP发布之日,当时沙盒那套安全性的确挺火,不少大厂趋之若鹜。但是牺牲的底层功能的支持,例如一个简单的让电脑开关机, UWP不靠XamlIsland这辈子都不可能实现。所以UWP就怕的是突然有一天你需要底层代码去实现一些业务功能。
- 无视Lifecycle :基于跨平台和性能的要求,UWP在进入后台(缩小),关闭等之后,必须严格遵守Lifecycle,不然就会被部分平台的系统干掉后台,WP算好了,XBOX只要你一超过128M,就直接杀掉后台。这也是为什么Spotify等音乐软件,每次进后台,再切回来,所有前端页面要重新渲染,因为Spotify前端的一些大图,绝对可以撑爆128M。
- 美好的未来:持续支持新的 .net c# 特性,不过还是要看具体业务。就像那些老应用还在 WinForm 和 WPF 一样,这的确也是微软强大之处,新系统无敌的向前兼容,不去讨论苹果那套不支持 x64 就滚下架,不适配就下架的逻辑,强如谷歌,其实安卓该强硬的让一些应用更新,也还是可以在新版本不支持老应用。虽然这几年新的微软开发架构不支持老系统,但所有老系统的应用还是支持新系统。扯远了,WinAPPSDK月底就会发新的 AI Feature,靠这些功能的确能整出些花活。其实老框架也能支持新的热点功能,例如 VLC 就支持 Whisper 搞实时翻译,不过 WinUI3 这种新框架的确对于个人友好很多。
UWP利与WinUI3弊
- 无敌的内存管理:其实较为复杂的应用还是可以维持在 100M 左右的前台内存占用,并且页面间跳转与内存回收极其精准快速,跑在低端机上毫无问题。无论是视频解码、音频播放,在线浏览之类,这也是为什么 UWP 始终有一定量钉子户和粉丝的原因,网易和腾讯把 Win32 应用在商店强制替换 UWP ,今天还有人骂。
- 安全性:其实这是个悖论,就如上面谈 Win32 的好的时候,UWP 不会扫描你的硬盘,UWP 没法后台跑一些骚操作,没法在你不同意的情况下获得一些权限。极致的安全性给开发者带来的不便和用户的体验提升,中间的博弈似乎本来就是悖论。
- 界面:其实这不能算WinUI3的弊,毕竟他叫UI3,但是界面好看程度在Win上目前的确是 UWP 的 WinUI2.8>WinUI3>其他。当然也有一些强无敌的开发者Directx+老框架也能做出好看的界面。但是你让一个新上手的开发者,想做出一个好看的界面,的确就是装个WinUI库,好了,你拥有桌面端个人认为最漂亮的材质。(审美喜好都有不同,不必争论,有异议就是你对)
- 跨平台:UWP 的名字里带有 Universal 就意味着这个框架生来是跨平台,从WP(aka Win10m)、Hololens、Xbox、桌面、平板,UWP具备完善的手柄、触摸、鼠标、键盘导航,对accessibility也是相较以往质的提升。这个框架跨平台的理念早就在2017年甩苹果当时的跨平台开发理念,结果UWP->WinUI3几乎放弃了跨平台,今天苹果开始越来越对VisionPro、iPad、Mac、iPhone、手表的跨平台框架支持越来越好。当然这也和微软逐步退出MR、手机等领域有关,不过这玩意儿就是,不持续投入,后续可能再也没有进入这个市场的机会了,就和 Windows Phone 一样。
- VS Deisnger View:终于到了我们开发者喜闻乐见的环节,所有框架,抛开诡异的Xamarin和Maui,UWP非常完美支持 Visual Studio 的 Deisnger View,甚至能在代码写的比较完善的情况下,渲染出后端代码中绑定的真实数据,只能说说强如微软。结果 WinUI3 猜猜怎么样,砍掉了,半年前答应加回来,现在还没上。现在距离 WinUI3 发布应该已经3年多了。
- 极致的性能:和第一点类似,基于 .net native 加持,现在可以宣布,Win平台不可能有比 UWP 启动速度更快的应用。
后记
能憋着看到现在一定是微软old ass,现在有些人上来就说我觉得ms这套框架就是不行,就是DOA。那我还是要说,你先看看自己能做到什么,你要是敲了两行hello world,或者做了两个功能就开始骂街,那我只能说强者不会抱怨环境。你去 iOS、安卓或者linux开发,照样也是没几个人用你的软件服务,下载量能到几十W甚至几W么,用户日活多少,或者你说你是技术爱好者,不是产品专家。那没问题,你在 Github 的开源库有几个 star,在哪个平台社区贡献几何。难如汇编,大佬都给你搞出一个过山车大亨。