互联网技术净土?原生鸿蒙开启全新技术征程

鸿蒙生态与开发者的崭新机会

HarmonyOS NEXT承载着华为对未来操作系统的深刻理解,如今已发展为坚实的数字底座。它不仅在技术层面取得了全面突破,还在中国操作系统市场中站稳了脚跟。

当前,HarmonyOS NEXT的代码行数已超过1.1亿,开发者数量大幅增长,已有超过15000款鸿蒙原生应用和元服务上线,生态设备数量突破10亿,政企办公领域的应用也在加速推进。

如今,鸿蒙生态正以飞快的速度壮大,版本迭代迅速,鸿蒙原生应用几乎达到**"** 一天一个版本 **"**的更新频率,不断为用户带来新鲜体验。其中,原生智能、原生安全和原生互联是原生鸿蒙的核心亮点。

2024年被称为AI 应用元年 ,但当前市场上的大多数AI产品,往往仅在应用层面简单集成了大模型,AI的体验仍然局限于具体的应用场景。而原生鸿蒙打破了这种局限,它的**"** 原生智能 " 通过创新性地将AI与操作系统深度融合,赋予了系统级的AI能力。

与那些应用级AI不同,原生鸿蒙从操作系统层面让应用天生具备智能性,这使得其在智能体验上实现了前所未有的突破。

聚焦开发者的发展之旅:原生鸿蒙应用市场全生命周期服务

原生鸿蒙应用市场不仅仅是一个应用分发平台,更为开发者提供了从开发、测试、上架到运营的全生命周期支持。开发者往往在应用开发的不同阶段面临挑战,包括代码质量检测、测试优化、资源分发以及应用的后续运营管理,而原生鸿蒙应用市场通过提供一系列服务,帮助开发者提升效率、加速创新,实现业务的可持续发展。

在移动应用开发中,Swiper 组件 常用于实现翻页效果,广泛应用于桌面、图库、问答等场景。然而,在实际开发过程中,Swiper组件在页面切换时基于按需加载原则,通常只有在即将显示下一个页面时,才会对该页面进行加载和布局绘制。

尽管按需加载能有效减少初始加载时间和内存占用,但对于复杂页面场景,这一加载过程可能持续较长时间,导致页面切换时出现卡顿,从而对滑动体验产生负面影响,甚至成为影响整个应用性能的瓶颈。

1.1移动开发中的性能挑战

在当前的移动开发中,特别是面对大数据量的长列表界面展示时,性能问题尤其突出。具体表现为:

  • 内存消耗:一次性加载大量数据会导致内存占用过高,特别是在用户设备内存有限的情况下。
  • 加载时间过长:加载大量数据项可能延迟应用的启动时间或页面加载时间,影响用户体验。
  • 滑动卡顿:数据项过多时,渲染时间过长,导致界面滑动时出现明显的卡顿,用户体验明显下降。

这些问题是移动端开发者在处理大数据量场景时必须面对的挑战,尤其是在应用的复杂滑动容器(如Swiper组件)中,需要更加精细化的资源管理和性能优化策略。

1.2原生鸿蒙应用市场的优化服务

针对上述问题,原生鸿蒙应用市场 不仅提供了全生命周期的开发者服务,还通过一系列技术工具帮助开发者优化应用性能。比如,按需加载在复杂滑动场景中的应用,为开发者提供了更灵活的资源加载管理方式,极大减少了应用的内存占用和加载延迟。

在Swiper组件中,采用了LazyForEach懒加载机制来优化数据渲染性能,避免一次性加载所有数据项,从而降低内存消耗。

LazyForEach根据可视区域的需求按需迭代数据,只有当用户实际滑动到需要展示的页面时,才会加载对应的子组件,同时将不再需要的组件及时销毁以释放内存。这种按需创建和销毁的方式,确保了应用在长时间使用中内存占用的稳定性。

一般来说传统的开发对策为一次性加载方案(ForEach):一次性加载全量数据并循环渲染。

缺点有:

1.因为要一次性加载所有的列表数据,创建所有组件节点并完成组件树的构建,在数据量大时会非常耗时,从而导致页面加载渲染时间过长

2.屏幕可视区外的组件虽然不会显示在屏幕上,但是仍然会占用内存。在系统处于高负载的情况下,更容易出现性能问题,极限情况下甚至会导致应用异常退出。

3.实际业务中数据条数非常多,该方案存在很严重的性能问题。

为了解决这个性能问题,HarmonyOS NEXT提供了性能更好的解决方案:

1.3按需加载方案(LazyForEach)

LazyForEach:实现延迟加载数据并按需渲染。原理如下:

  1. 根据屏幕可视区能够容纳显示的组件数量按需加载数据。
  2. 根据加载的数据量创建组件,挂载在组件树上,屏幕可以展示多少列表项组件,就按需创建多少个ListItem组件节点挂载在List组件树根节点上。
  3. 当组件滑出可视区域外时,框架会进行组件销毁以降低内存占用;当组件滑入可视区域时,需要从头完成数据加载、组件创建、挂载组件树这一过程,直至渲染到屏幕上。

为了更加直观地展示Swiper在使用普通ForEach与LazyForEach时的性能差异,进行了本地模拟测试。测试结果表明,使用**LazyForEach**加载Swiper子组件在复杂场景下显著降低了内存消耗,并提高了滑动的流畅度,特别是在处理长列表或大量数据时效果尤为显著。

以下是一个典型的**Swiper子组件**代码示例,展示了如何通过LazyForEach实现按需加载。

java 复制代码
@Component
struct SwiperItem {
  //题干
  private questionStr: string = '';
  //题目相关的图片资源
  private image: string | PixelMap = '';
  //答案选项
  private answerStr: string[] = [];
  //当前题号
  private myIndex: number = 0;

  //构造数据
  aboutToAppear(): void {
    // 初始化题干、图片链接、答案选项
    // ... 
  }

  build() {
    Column() {
      // 题干
      Text(this.questionStr)
        .fontSize(26)
        .width('100%')
      // 题目相关图片
      Image(this.image)
        .width('100%')
        .objectFit(ImageFit.Contain)
        .margin({ top: 12, bottom: 12 })
      // 答案
      ForEach(this.answerStr, (item: string, index: number) => {
        Text(item)
          .width('100%')
          .fontSize(26)
      })
    }
    // ...
  }
}

Swiper主页面核心代码如下

  • 使用ForEach对页面进行加载
java 复制代码
aboutToAppear(): void {
  for (let i = 0; i < 1000; i++) {
    this.list.push(i);
    this.data.addData(i, i);
  }
}

build() {
  Column() {
    Swiper(this.swiperController) {
      ForEach(this.list, (item: number, index: number) => {
        SwiperItem({ myIndex: index })
          .width('100%')
          .height("100%")
      }, (item: string) => item)
    }
    // ...
  }
  .width('100%')
  .margin({ top: 5 })
}

使用LazyForEach对页面进行加载

java 复制代码
aboutToAppear(): void {
  for (let i = 0; i < 1000; i++) {
    this.data.addData(i, i);
  }
}

build() {
  Column() {
    Swiper(this.swiperController) {
      LazyForEach(this.data, (item: string, index: number) => {
        SwiperItem({ myIndex: index })
          .width('100%')
          .height("100%")
      }, (item: string) => item)
    }
    // ...
  }
  .width('100%')
  .margin({ top: 5 })
}

表1 总题量为1000时ForEach与LazyForEach的性能对比

|-------------|----------|------|---------|
| 加载方式 | 完全显示所用时间 | 丢帧率 | 独占内存 |
| ForEach | 951ms | 8.5% | 200MB |
| LazyForEach | 280.6ms | 0.0% | 25.18MB |

由实验数据可知,当Swiper的子组件数量比较大时,采用懒加载可以带来较好的帧率提升,并且有效减低内存占用。

其实LazyForEach是从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当在滚动容器中使用了LazyForEach,框架会根据滚动容器可视区域按需创建组件,当组件滑出可视区域外时,框架会进行组件销毁回收以降低内存占用。

如果开发者的应用场景属于加载较为耗时的场景时,尤其是下列场景,推荐使用。

  • Swiper的子组件具有复杂的动画;
  • Swiper的子组件加载时需要执行网络请求等耗时操作;
  • Swiper的子组件包含大量需要渲染的图像或资源。

LazyForEach实现了按需加载,针对列表数据量大、列表组件复杂的场景,减少了页面首次启动时一次性加载数据的时间消耗,减少了内存峰值。可以显著提升页面的能效比和用户体验。

深度解析:自动化检测如何帮助开发者提效

在应用开发过程中,开发者常常面临着一个关键问题------如何确保应用在上线前经过充分的测试。应用的功能、界面和性能必须满足用户的期望,而这个过程通常需要进行反复验证。传统的手动测试流程不仅耗时耗力,还可能因为人工错误导致疏漏,尤其是在兼容性、性能和安全性方面,稍有不慎就可能影响用户体验。

此外,随着应用功能的复杂性和设备的多样性增加,测试覆盖范围变得广泛且复杂。不同的设备环境、操作系统版本等因素都可能导致应用行为的差异,这进一步增加了开发者的压力。因此,在开发过程中找到有效的测试方法,以减少手动测试的工作量、提升测试准确性,成为开发者提升效率的一个关键挑战。

服务特点:Hypium自动化检测前移,提升效率

在现代应用开发中,确保代码的正确性和稳定性是开发者面临的主要挑战之一。为了帮助开发者高效测试应用功能并及时发现潜在问题,原生鸿蒙应用市场 提供了功能强大的自动化测试框架------Hypium ,其中包含HJUnitHJSUnit两个子框架,分别支持单元测试和UI测试。这些工具不仅让开发者可以在开发早期快速编写测试用例,还能提高测试覆盖率,减少后期调试和修复成本,极大提升开发效率和代码质量。

"Hypium"是"Hyper Automation + ium"的组合词,"Hyper Automation"表示超级自动化, "ium"意指稳定、可靠的测试框架能力底座。从取名含义可以看出,我们想要为开发者打造一个以超级自动化测试为理想目标、且稳定可靠的测试框架。

自动化测试框架Hypium以插件形式集成到DevEco Studio中。开发者创建工程后,DevEco Studio会自动生成测试目录、测试类和测试用例模板等,如图所示:

开发者无需从零开始,让测试更加简单、高效。

2.1自动化测试用例的设计:高效捕捉问题

开发者可以通过Hypium测试框架,直接测试项目中的指定类、方法或UI交互功能,确保在开发过程中及时发现问题,避免将问题带入后续开发阶段。通过这种测试用例的提前介入,开发者可以在应用上线前确保其稳定性和流畅度。

此外,UI测试框架也考虑了多语言和语法兼容,支持Java/JS/eTS三种语言。有的开发者小伙伴之前可能使用过UI测试框架提供的Java接口,最近新增的JS/eTS接口定义和语法与Java接口是一致的,开发者们可以无缝切换到JS/eTS语言来使用。

以下将通过具体的HJUnitHJSUnit测试用例,展示如何利用自动化测试工具,快速验证代码功能,并提高开发工作效率。

2.1.1. HJUnit测试用例:系统功能测试

在下面的示例中,checkScreenShape是一个用于验证设备屏幕形状的测试用例,使用了HarmonyOS NEXT中的元能力子系统 提供的AbilityDelegator测试工具。通过获取应用的Context,开发者能够访问设备的相关属性(如设备类型和屏幕形状),并对设备的屏幕形状进行断言判断。这种测试用例非常适用于需要验证设备硬件属性或系统功能的场景。

java 复制代码
public class ExampleOhosTest {  
    @Test  
    public void checkScreenShape() {  
        // 获取 IAbilityDelegator 实例  
        final IAbilityDelegator delegator = AbilityDelegatorRegistry.getAbilityDelegator();  
        // 从IabilityDelegator实例中获取应用content内容  
        final Context appContext = delegator.getAppContext();  
        DeviceCapability devCap = appContext.getResourceManager().getDeviceCapability();  
        assertNotNull("Null deviceCapability", devCap);  
        if (devCap.deviceType == DeviceCapability.DEVICE_TYPE_WEARABLE) {  
            // 断言  
            assertTrue("Unexpected display shape", devCap.isRound);  
        } else {  
            assertFalse("Unexpected display shape", devCap.isRound);  
        }  
    }  
}

在这个用例中,AbilityDelegator工具可以自动获取设备的能力(DeviceCapability),并通过断言设备是否为圆形屏幕来验证应用在不同设备上的行为是否符合预期。这个测试用例展示了如何使用系统级工具来进行硬件属性的验证,确保应用能够在各种设备上正常运行,特别是可穿戴设备等特殊设备。

2.2.2. HJSUnit测试用例:UI交互测试

相比于单元测试框架,HJSUnit专注于界面交互的自动化测试。以下示例展示了如何通过编写自动化测试用例,验证弹出对话框的行为。prompt.showDialog 是鸿蒙系统中用于弹出对话框的API,测试用例通过回调函数验证弹出对话框是否按预期执行。

java 复制代码
it('testPromptDialog', 0, function() {
    console.info('testPromptDialog START');
    prompt.showDialog({
        title: 'dialog showDialog test',
        message: 'message of dialog',
        buttons: [
            {
                text: 'OK'
            }
        ],
        success: function(ret) {
            expect(true).assertTrue();  // 确认对话框成功弹出
        },
        cancel: function() {
            expect(true).assertFalse();  // 如果被取消,测试失败
        },
        complete: function() {
            console.log('[prompt.showDialog] complete');
        }
    });
});

在这个用例中,测试了弹出对话框的成功与否。通过监听success和cancel回调函数,测试代码可以在对话框操作结束时断言弹出框是否符合预期行为。自动化界面测试的优势在于,能够在不依赖人工操作的情况下,确保复杂的用户交互场景正常工作。

2.2.3性能优化与自动化测试框架的结合

原生鸿蒙应用市场的自动化检测服务结合了强大的测试框架,如Hypium,帮助开发者在开发早期进行更广泛的测试,从而避免后期出现的性能问题。Hypium自动化检测可以针对应用的兼容性、性能和安全性进行提前检测,确保在应用上线之前,潜在问题已经被大部分解决。

提升效率的关键优势
  1. 提前发现问题,减少后续修复成本:Hypium自动生成测试模板,开发者可以立即在项目初期编写测试用例,并在每次代码变更后自动执行测试。这种方式不仅能及早发现问题,减少后期反复调试和修复的成本,还能让开发者在开发过程中更快迭代功能。
  2. 支持全路径验证:HJSUnit和HJUnit框架不仅能进行应用逻辑的单元测试,还能自动化地测试UI交互。这种全路径验证能够覆盖应用中的各个层面,包括内部逻辑和外部用户体验,确保代码改动不会引入新的问题。
  3. 减少重复劳动,专注核心创新:通过自动化测试,开发者不再需要每次进行版本迭代时都手动测试每个功能,极大减少了重复劳动。这样开发者可以将更多的精力投入到功能优化和创新上,而不是耗费在繁琐的测试流程上。

以一款跨设备应用开发为例,开发团队需要同时支持手机、平板和可穿戴设备。在使用Hypium框架进行自动化检测之前,团队每次需要手动测试不同设备的兼容性,尤其是在处理不同设备的UI布局时,错误率较高。通过引入Hypium自动化测试后,团队能够编写一次测试用例,并在不同设备上自动运行,大幅减少了开发和调试的时间。最终,应用的发布周期大幅缩短,同时显著提升了应用的质量和稳定性。

开发者的成长与未来:原生鸿蒙应用市场的支持与潜力

原生鸿蒙应用市场作为鸿蒙生态的重要组成部分,致力于为开发者提供全面的支持,贯穿应用开发、测试、发布、运营和持续优化的整个生命周期。从最初的概念验证到成功的市场运营,原生鸿蒙应用市场通过一系列先进的服务和工具助力开发者。

3.1. 全生命周期服务:贯穿应用的每一个阶段

原生鸿蒙应用市场为开发者提供了从开发到运营的全流程支持,确保开发者在各个阶段都能获得所需的技术和资源:

  • 开发阶段:通过集成开发环境(如DevEco Studio)和自动化测试框架(如Hypium),开发者能够快速编写代码、验证功能并提升开发效率。自动化检测服务能够帮助开发者提前发现潜在问题,减少后期修复的成本。
  • 测试阶段 :华为应用市场提供了灵活的测试服务,开发者可以在不同的用户群体中测试应用性能和稳定性,收集反馈并进行迭代优化。应用加密、按需加载等技术进一步提升了应用的安全性和性能表现。
  • 上线发布 :通过智能推荐和精准分发机制,开发者的应用能够在原生鸿蒙应用市场中获得更多的曝光和下载机会,尤其是高质量应用可以通过专题推荐的形式被推送给更多用户。
  • 运营和优化:在应用上线后,原生鸿蒙应用市场提供了数据分析工具和用户反馈渠道,帮助开发者实时监控应用的使用情况,持续优化用户体验。通过生态中的运营资源,开发者还可以获得定期的推广和合作机会。

3.2. 生态合作与社群支持:探索鸿蒙生态的无限创新机会

鸿蒙生态的快速发展不仅为开发者提供了技术平台,也为他们创造了广阔的创新合作空间。华为积极推动开发者与生态内的合作伙伴共同创新,打造面向万物互联的未来场景。

  • 生态合作:原生鸿蒙操作系统的跨设备特性使得开发者能够构建真正的全场景应用,覆盖智能手机、平板、可穿戴设备、IoT设备等多种终端。开发者可以通过与硬件、软件合作伙伴的深度合作,打造更加丰富的应用场景,实现应用功能的多端联动。比如,一款健康管理应用可以同时在智能手表上记录数据,并同步显示在手机上,提供一致的跨设备体验。
  • 开发者社群:华为还通过一系列社群活动和技术分享(如开发者大赛、技术论坛等)为开发者提供资源和支持。开发者不仅可以在社群中学习新的技术趋势,还能通过与其他开发者的互动碰撞出更多创新的想法,推动应用的不断升级和优化。华为开发者联盟(HUAWEI Developer Alliance)还提供了丰富的开发者资源,包括文档、培训、技术支持等,帮助开发者快速掌握鸿蒙生态的开发技能。

通过生态合作和社群支持,开发者不仅能不断提升自身的技术能力,还能在广阔的鸿蒙生态中找到更多的创新机会,推动应用和业务的长远发展。

相关推荐
lqj_本人10 分钟前
Flutter&鸿蒙next 实现一个计算器应用
华为·harmonyos
呆萌很3 小时前
HCIP-HarmonyOS Application Developer V1.0 笔记(五)
harmonyos
lqj_本人3 小时前
Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比
flutter·harmonyos
lqj_本人4 小时前
Flutter&鸿蒙next 中使用 MobX 进行状态管理
flutter·华为·harmonyos
鸿蒙开天组●4 小时前
鸿蒙进阶篇-网格布局 Grid/GridItem(二)
前端·华为·typescript·harmonyos·grid·mate70
lqj_本人4 小时前
Flutter&鸿蒙next 中的 setState 使用场景与最佳实践
flutter·华为·harmonyos
火柴就是我5 小时前
Harmony SoundPool 的初始化 加载资源 播放
harmonyos
HCIE考证研究所5 小时前
每日一练 | DHCP Relay(DHCP 中继)
华为·网络工程师·华为认证
lqj_本人8 小时前
Flutter&鸿蒙next 中的 Expanded 和 Flexible 使用技巧详解
flutter·harmonyos