鸿蒙征途:App开发实战

978-7-115-56386-6
作者: 李宁
译者:
编辑: 张涛

图书目录:

详情

《鸿蒙征途:App开发实战》是一本基于Java的鸿蒙操作系统(HarmonyOS)App开发指南。全书系统全面、由浅入深地介绍了HarmonyOS App开发的必备知识、相关经验和技巧。本书以理论与实战相结合的方式向读者呈现HarmonyOS App开发的整个过程。全书分为两个部分,第一部分详细讲解HarmonyOS App开发所需的知识,并提供大量的真实案例代码供读者练习;第二部分给出两个实战项目,分别为应用类App项目(在线电子词典)和游戏类App项目(俄罗斯方块),通过这两个项目,读者可以很好地回顾和总结前面10章讲解的知识点,并付诸实践。 本书内容通俗易懂,循序渐进,既是HarmonyOS初学者的入门图书,也是HarmonyOS开发人员的进阶读物。

图书摘要

版权信息

书名:鸿蒙征途:App开发实战

ISBN:978-7-115-56386-6

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

版  权

编  著 李 宁

责任编辑 张 涛

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

内 容 提 要

本书是一本基于Java的鸿蒙操作系统(HarmonyOS)App开发指南。全书系统全面、由浅入深地介绍了HarmonyOS App开发的必备知识、相关经验和技巧。本书以理论与实战相结合的方式向读者呈现HarmonyOS App开发的整个过程。全书分为两个部分共12章,第一部分(第1章~第10章)详细讲解HarmonyOS App开发所需的知识,并提供大量的真实案例代码供读者练习;第二部分(第11章和第12章)给出两个实战项目,分别为应用类App项目(在线电子词典)和游戏类App项目(俄罗斯方块),通过这两个项目,读者可以很好地回顾和总结前面10章讲解的知识点,并付诸实践。

本书内容通俗易懂,循序渐进,既是HarmonyOS初学者的入门图书,也是HarmonyOS开发人员的进阶读物。

前  言

作为华为认证的“首批HarmonyOS系统课程开发者”,我在2020年8月应邀到华为总部学习,有幸在鸿蒙操作系统(HarmonyOS)宣布升级至2.0版本(2020年9月10日)前一个多月接触到HarmonyOS,HarmonyOS的理念和技术让我感到非常震撼!

HarmonyOS与Android和iOS一样,是独立的操作系统,支持多种硬件设备,包括智能手机、平板电脑、个人计算机、电视机、智能手表等。但HarmonyOS又与Android和iOS不同,HarmonyOS的侧重点是物联网(Internet of Thing,IoT),因为21世纪将是物联网的世纪,也可以称为“物联网元世纪”。随着5G时代以及以后的6G时代、7G时代的来临,大量的物联网设备将得到网络支持,不再是独立的存在,而是像连入全球物联网大脑的一个神经元。数以万亿计的物联网设备产生的数据将在这颗全球物联网大脑中流动,产生难以置信的“力量”。华为公司正是看准了这个爆发点,才顺应时代的潮流推出了面向物联网的HarmonyOS。

作为首批HarmonyOS系统课程开发者,我承担着支持HarmonyOS生态发展的职责。而HarmonyOS生态发展的首要任务就是让广大的程序员了解HarmonyOS并为HarmonyOS开发App。所以我在哔哩哔哩网站我的主页(https://exl.ptpress.cn:8442/ex/l/db0f514e)上传了多套免费的HarmonyOS视频课程。但有很多学员提出,视频用来演示开发过程比较好,想查询HarmonyOS的某项技术并不方便。因此,为了满足大量学员的需求,我决定将数月的HarmonyOS App开发的实践经验,以及遇到的各种问题写成一本书,以方便广大学员配合我上传在哔哩哔哩网站上的免费视频课程学习HarmonyOS App开发。

在华为正式推出安装了HarmonyOS的手机(后文中简称为“HarmonyOS手机”)或大范围开放手机安装HarmonyOS之前,大多数人只能使用HarmonyOS模拟器来体验HarmonyOS App开发。不过由于和华为有合作的关系,我提前得到了几部用于测试的HarmonyOS手机,其实就是安装了HarmonyOS的P40。使用HarmonyOS模拟器可以测试大部分功能,但涉及硬件(如摄像头、传感器、蓝牙等)的功能就无法测试了,所以要完整测试HarmonyOS的各种功能,就必须使用HarmonyOS手机或其他安装了HarmonyOS的设备。本书的内容正是基于这些HarmonyOS手机完成的。不管正在阅读本书的读者是否拥有HarmonyOS手机,都可以通过本书体验使用HarmonyOS手机的感觉。

经过几个月来不断在网上输出关于HarmonyOS的内容(主要是文章和视频),我还收集了网友反馈的很多关于HarmonyOS的问题,其中被问得最多的一个问题就是HarmonyOS使用什么语言做开发,是否容易学习。关于这个问题,读者不用担心,HarmonyOS的核心开发语言是Java,而目前Java语言在程序员群体中非常流行,并且各种学习资料极其丰富。

HarmonyOS除了开发语言是Java,开发方式也与Android类似。这样设计主要是为了兼容Android,所以,如果读者对Android开发有一定的了解,学习HarmonyOS开发会更容易。

写作本书时,我使用的IDE和HarmonyOS的版本,都是最新的。华为在2020年12月发布了HarmonyOS 2.0手机开发者Beta版本,本书中的所有代码都是基于这个版本编写的。

本书的读者将有幸成为国内第一批从事HarmonyOS App开发的开发人员,同时,本书是一本基于Java的HarmonyOS App开发教程,而且是基于HarmonyOS 2.0编写的。我真诚地希望读者可以用心阅读这本书,多掌握一项技能,为自己未来的求职和工作增加更多的筹码,让自己获得更多的机会和自信。让我们开启HarmonyOS App开发之旅吧!

建议的阅读方式

本书内容通俗易懂,由浅入深,不仅适合初学者入门,还适合专业开发人员阅读。在学习本书内容之前,读者需要有Java基础,但并不需要有Android基础。如果读者以前没有接触过Java,可以到哔哩哔哩网站我的主页学习免费的Java视频课程。尽管Android并不是阅读本书的必备技能,但了解Android有助于学习HarmonyOS App开发。如果读者想对比Android一起学习,也可以到哔哩哔哩网站我的主页学习免费的Android视频课程。

阅读本书时,读者可以根据自身的情况来决定如何阅读。初学者可以从第1章开始由浅入深地学习本书的内容,这样做可以不费劲儿地理解所学的内容。已经有一定的Java开发经验,并且从事过或正在从事Android App开发的开发人员,可以采用跳跃式阅读的方式,挑自己感兴趣的内容阅读。无论如何阅读都请记住,本书中的每一章内容、每一行代码都非常精彩!

本书内容

本书的内容是非常系统化的,其中介绍了HarmonyOS目前支持的大多数核心技术,尤其是全面讲解了HarmonyOS的分布式特性,包括Feature Ability与Feature Ability、Feature Ability与Particle Ability之间的交互。全书一共12章,其中前10章是基础知识,主要包括HarmonyOS开发环境的配置和调试、Page Ability和AbilitySlice、布局、UI组件、对话框、数据管理、Data Ability、Service Ability、多媒体、传感器、定位、蓝牙等。

第11章给出一个应用类App项目——在线电子词典。这个项目演示了如何将多种技术综合在一起完成一个复杂的App,其中涉及数据库、资源文件、文件存储、网络爬虫、使用第三方库等知识,而且这个项目除了使用了Java,还使用了Python生成离线词库,如果读者不熟悉Python,可以到哔哩哔哩网站我的主页学习免费的Python视频课程。

第12章给出一个游戏类App项目——俄罗斯方块。这个项目的核心是通过Canvas在窗口中绘制各种游戏元素,如游戏背景、方块等,并通过复杂的算法完成各种动作,如方块的移动、快速移动、旋转等,同时支持游戏积分机制。这款游戏类App演示了如何利用HarmonyOS中的绘图功能实现可交互的图形界面。游戏本身就是一类复杂的、可交互的绘图程序,因此也是展示HarmonyOS App开发的一个理想的例子。

本书各章的内容相对独立,因此,读者除了可以循序渐进完成对本书的学习,还可以将本书作为参考手册,随时查阅。

资源下载

为了方便读者学习,本书提供了书中所有的源代码(包括项目的源代码)。但是,建议读者不要急着看源代码,读者最好先理解书中的内容,然后自己实现一遍,最后再参考源代码,这样学习效果会更好。要下载本书的源代码和其他资源,请扫描下面二维码关注微信公众号“极客起源”,并输入174496获取相关资源的下载地址。

公众号:极客起源

勘误

尽管我和孙喆思、张涛编辑以及其他为本书付出努力的人员已经尽力对本书的内容进行了反复核对,但书中难免会存在一些未被发现的错误。读者可以在人民邮电出版社异步社区上查看所有已发现的错误,也可以通过在我的公众号中输入174496获取最新的勘误表。如果读者在阅读本书时发现了还未被确认的错误,也欢迎直接在异步社区的本书页面上提交勘误,或者通过公众号“极客起源”以及哔哩哔哩网站我的主页联系我,我会及时对读者反馈的错误进行确认。

第1章 开启鸿蒙之旅

2020年9月10日,华为在东莞松山湖举办华为开发者大会,并在会上宣布鸿蒙操作系统升级至2.0版本(HarmonyOS 2.0)。HarmonyOS是鸿蒙的英文名字,为了方便,在本书后面的章节,基本上都会用HarmonyOS来指代鸿蒙,这也是华为推荐的名字。HarmonyOS 2.0是HarmonyOS的第2个版本,这一版本不仅支持海量的物联网(IoT)设备,还支持包括手机、平板电脑、个人计算机、电视机、智能手表等富设备。而对广大开发人员来说,他们又多了一个研究方向,也许这是一次难得的机会。所以本章将由浅入深地带领大家从HarmonyOS开发环境开始,学习HarmonyOS App的开发。

通过阅读本章,读者可以掌握: 

HarmonyOS的定位与核心技术;

如何搭建HarmonyOS开发环境;

如何创建HarmonyOS工程;

如何使用HarmonyOS虚拟机;

如何运行HarmonyOS App;

如何对HarmonyOS App签名;

如何在真机上调试HarmonyOS App;

HarmonyOS工程的结构;

config.json配置文件的基本结构;

如何开发跨设备的HarmonyOS App;

如何通过设置断点和输出日志来调试代码;

如何解决gradle下载慢的问题。

1.1 了解HarmonyOS

HarmonyOS其实在几年前就已经发布了,只不过当时是1.0版本,而且只能运行在是IoT设备[1]上。而这次开发者大会上发布的HarmonyOS 2.0,可以运行在任何设备上,这些设备包括只有几百KB的IoT设备,也包括拥有数百GB的高端设备。为了让广大读者了解HarmonyOS的前世今生,本节将从宏观上介绍HarmonyOS系统。

[1] IoT设备的硬件配置通常不高,这里指的硬件配置主要是内存和CPU。内存通常只有几兆字节到几十兆字节。所以无法运行像Android这样的系统。而HarmonyOS由于拥有LiteOS内核,所以可以很容易地运行在底端的IoT设备上。

1.1.1 HarmonyOS的由来

听到“鸿蒙”这个词,可能有很多读者会感到好奇,这套OS为什么叫“鸿蒙”呢?而且它的英文名为什么叫Harmony呢?本节将对“鸿蒙”和Harmony的由来做一个详细的解释。

“鸿蒙”这个名字原来是华为内部一个研究操作系统内核的技术项目的代号。几年前,华为手机的销售量飞速增长,但这引起了华为的担心。如果手机的销售量不再增长了,那么华为该怎么办呢?所以华为认为需要有自己的操作系统,而且这个操作系统一定是面向未来IoT的。那面向未来的IoT需要什么样的操作系统呢?这个系统和现有的操作系统肯定是不一样的。在万物互联的时代,孤立的设备是没有价值的,所以这个面向未来的IoT的操作系统一定要可以弹性部署到大大小小的设备上,让这些设备像人一样用同样的语言交流,让设备的连接变得非常容易。

另外,仅仅连接这些设备还不够,不同类型设备之间的能力差异是千差万别的,华为希望能够有机融合这些能力,这就需要让系统将这些设备看作同一个设备,也就是虚拟设备。

华为确定了操作系统的思路后,发现“鸿蒙”这个名字和华为希望做的操作系统的定位是很匹配的:“鸿蒙”取自《山海经》,有开天辟地的意思,表示华为希望开拓一个新的纪元;鸿蒙的英文名字HarmonyOS是后来取的,Harmony是和谐的意思,表示HarmonyOS能让多设备互联互通,同时又表示产业合作、和谐共处。

1.1.2 HarmonyOS的技术定位和目标

HarmonyOS的技术定位是一款面向未来、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统。在传统的单设备系统能力的基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,以支持多种终端设备。

对消费者而言,HarmonyOS能够对生活场景中的各类终端进行能力整合,可以实现不同的终端设备之间的快速连接、能力互助、资源共享,匹配合适的设备,提供流畅的全场景体验。

对应用开发者而言,HarmonyOS采用了多种分布式技术,使应用程序的开发实现与不同终端设备的形态差异无关。这能够让开发者聚焦上层业务逻辑,更加便捷、高效地开发应用。

对设备开发者而言,HarmonyOS采用了组件化的设计方案,可以根据设备的资源能力和业务特征进行灵活裁剪,满足不同形态的终端设备对操作系统的要求。

根据HarmonyOS的市场定位,HarmonyOS需要运行在各种各样的设备上,例如,我们最常用的智能手机、平板电脑、个人计算机等。还有很多物联网设备,如打印机、投影仪等。华为将这些设备称为“1 + 8 + N”,如图1-1所示。这里的1是指智能手机,8是指强计算设备,目前可分为如下8类设备[2]

个人计算机;

平板电脑;

电视机;

音响;

眼镜;

智能手表;

车载电脑;

耳机。

[2] 强计算设备未来可能不只有8类,可能会更多,这里的8可以理解为所有的强计算设备。

而这里的N是指泛IoT设备,如打印机、投影仪、门铃、电冰箱、智能手环,甚至是茶杯、闹钟、床等。也就是说,凡是带芯片[3]的设备,都应该属于泛IoT设备。也就是说,HarmonyOS的最终目标是将一切有计算能力和存储能力的设备连接起来,然后再加入人工智能技术,这就是AIoT。如果将全世界数以百亿计的IoT设备连接起来,并能有效地利用这些IoT设备的各种能力,让这些IoT设备高效互相协作,那么我们将会实现梦寐以求的智能城市,智能社会,甚至智能星球!

[3] 这里的“芯片”只是泛化概念,包括目前广泛流行的硅基芯片,以及未来的碳基芯片、量子芯片、生物芯片等,只要拥有计算能力和存储能力,都应该属于芯片范畴。

图1-1 HarmonyOS的“1 + 8 + N”战略

1.1.3 HarmonyOS的系统架构

HarmonyOS在系统架构上与Android类似,采用了分层设计方案,从下向上依次为内核层、系统服务层、框架层和应用层。系统功能按照“系统→子系统→功能/模块”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或功能/模块。HarmonyOS系统架构如图1-2所示。

图1-2 HarmonyOS系统架构

下面分别对这4层进行解释。

1.内核层

内核层分为内核子系统和驱动子系统。

内核子系统:HarmonyOS采用多内核设计,支持针对不同资源受限的设备选用适合的OS内核。内核抽象层(Kernel Abstract Layer,KAL)通过屏蔽多内核差异,为上层提供基础的内核能力,包括进程/线程管理、内存管理、文件系统、网络管理和外设管理等。

驱动子系统:HarmonyOS驱动框架(HDF)是HarmonyOS硬件生态开放的基础,它提供了统一外设访问能力以及驱动开发和管理框架。

2.系统服务层

系统服务层是HarmonyOS的核心能力集合,通过框架层为应用提供服务。该层包含以下几个部分。

系统基本能力子系统集:为分布式应用在HarmonyOS多设备上的运行、调度、迁移等操作提供了基本能力,由分布式软总线、分布式数据管理、分布式任务调度、方舟多语言运行时子系统、公共基础库子系统、多模输入子系统、图形子系统、安全子系统、AI子系统等组成。其中,方舟多语言运行时子系统提供了C/C++/JavaScript多语言运行时和基础的系统类库,也为使用方舟编译器静态化的Java程序(即应用程序或框架层中使用Java语言开发的部分)提供运行时服务。

基础软件服务子系统集:为HarmonyOS提供公共的、通用的软件服务,由事件通知子系统、电话子系统、多媒体子系统、DFX(Design For X)子系统 、MSDP&DV子系统等组成。

增强软件服务子系统集:为HarmonyOS提供针对不同设备的、差异化的能力增强型软件服务,由智慧屏专有业务子系统、穿戴专有业务子系统、IoT专有业务子系统等组成。

硬件服务子系统集:为HarmonyOS提供硬件服务,由位置服务子系统、生物特征识别子系统、穿戴专有硬件服务子系统、IoT专有硬件服务子系统等子系统组成。

根据不同设备的部署环境,基础软件服务子系统集、增强软件服务子系统集、硬件服务子系统集内部可以按子系统粒度裁剪,每个子系统内部又可以按功能粒度裁剪。

3.框架层

框架层为HarmonyOS的应用提供了Java/C/C++/JavaScript等多语言的用户程序框架和Ability框架,以及各种软硬件服务对外开放的多语言框架API;同时为采用HarmonyOS的设备提供了C/C++/JavaScript等多语言的框架API,不同设备支持的API与系统的组件化裁剪程度相关。

4.应用层

应用层包括系统应用和扩展应用/第三方应用。HarmonyOS的应用由一个或多个FA(Feature Ability)或PA(Particle Ability)组成。其中,FA有UI,提供与用户交互的能力;而PA无UI,提供后台运行任务的能力以及统一的数据访问抽象。基于FA/PA开发的应用,能够实现特定的业务功能,支持跨设备任务调度与分发,为用户提供一致、高效的应用体验。

1.2 搭建HarmonyOS开发环境

HarmonyOS拥有自己的集成开发环境(Integrated Development Environment,IDE)——DevEco Studio。这款IDE是基于IntelliJ IDEA社区版二次开发的,所以使用方式与IntelliJ IDEA非常类似。目前有很多IDE都是基于IntelliJ IDEA社区版二次开发的,例如,用于开发Android App的Android Studio就是一个非常典型的例子。DevEco Studio之所以选择基于IntelliJ IDEA社区版二次开发,主要是为了让尽可能多的开发人员尽快上手,因为目前使用IntelliJ IDEA及其衍生IDE的开发人员非常多。

DevEco Studio是跨平台的,目前DevEco Studio有Windows版和macOS版。读者可以到下面的页面下载DevEco Studio的最新版。

https://developer.harmonyos.com/cn/develop/deveco-studio

进入下载页面,找到图1-3所示的下载列表,单击右侧的下载链接即可下载。注意,下载DevEco Studio需要有一个华为账号,没有账号的读者需要注册一个。

图1-3 下载DevEco Studio

下载的DevEco Studio是一个zip压缩文件,将其解压,如果使用的是Windows版本,里面是一个exe安装文件,直接双击安装即可。如果使用的是macOS版本,里面是一个dmg文件,同样双击安装即可。安装完成后,Windows版会在桌面生成一个DevEco Studio图标,macOS版会安装在应用程序(Applications)中,双击DevEco Studio图标即可运行DevEco Studio。

运行DevEco Studio后,会看到图1-4所示的欢迎界面。如果是第一次使用DevEco Studio,右侧的Recent Project列表为空;如果以前创建过HarmonyOS工程,那么在Recent Project列表中会看到曾经创建过的HarmonyOS工程,单击某个HarmonyOS工程,就会打开该工程。

图1-4 DevEco Studio的欢迎界面

读者可以单击左侧的Create HarmonyOS Project链接创建新的HarmonyOS工程,或者单击Open Project链接打开一个HarmonyOS工程。下一节将会详细介绍如何使用DevEco Studio来开发我们的第一个HarmonyOS App。

1.3 创建第一个HarmonyOS App

本节会详细讲解使用DevEco Studio开发HarmonyOS App的完整过程。

1.3.1 创建HelloWorld项目工程

在DevEco Studio的欢迎界面单击Create HarmonyOS Project链接,或在开发主界面菜单栏选择图1-5所示的File→New→New Project选项打开Create HarmonyOS Project窗口。

图1-5 New Project菜单项

打开的Create HarmonyOS Project窗口如图1-6所示。

图1-6 Create HarmonyOS Project窗口

在创建HarmonyOS工程之前,先来看一下Create HarmonyOS Project窗口中的内容。这个窗口分为两个区域——Device和Template。其中,Device区域允许用户选择设备。因为不同设备的屏幕尺寸、分辨率、API都有所不同,所以创建HarmonyOS工程时需要针对不同的设备。目前HarmonyOS支持如下7种设备:

Phone(智能手机);

Tablet(平板电脑);

Car(车载电脑);

TV(电视机),即华为智慧屏以及任何安装了HarmonyOS的智能电视;

Wearable(高端智能手表);

Lite Wearable(低端智能手表);

Smart Vision(带摄像头的设备)。

在这7种设备中,因为Lite Wearable和Smart Vision的硬件配置较低,所以不支持用Java开发App,只支持用JavaScript开发App;另外5种设备同时支持用Java和JavaScript开发App。

Java开发的方式与Android类似,很多概念也与Android类似,这主要是为了让Android开发人员更容易上手开发HarmonyOS App。JavaScript开发的方式类似于微信小程序的开发技术。也就是说,JavaScript开发方式采用的是Web栈技术。这主要是针对微信小程序开发人员和Web开发人员的。这就意味着,你只要是Android开发人员、微信小程序开发人员或Web开发人员,就非常容易上手HarmonyOS App开发,即使你不是上述开发人员,这些技术比起C++来说也容易得多,所以对于任何领域的开发人员来说,上手HarmonyOS App开发都是相当容易的,关键是如何起步,而本书的目的就是让这些想进入HarmonyOS App开发领域的开发人员有一个好的开始。

为了让HarmonyOS开发人员有一个更好的开始,Create HarmonyOS Project窗口的Template区域提供了若干个HarmonyOS工程模板来生成一些必要的代码,相当于HarmonyOS App的Hello World。为不同设备提供的模板是不同的。这里以TV为例,为TV设备提供的主要模板及描述如下。

Empty Feature Ability(JS):一个空的JavaScript版HarmonyOS工程,包含了一个Hello World Demo,可以在屏幕上输出Hello World。

Empty Feature Ability(Java):一个空的Java版HarmonyOS工程,包含了一个Hello World Demo,可以在屏幕上输出Hello World。

List Container Ability(Java):带有列表功能的Java版HarmonyOS工程。目前很多App的主窗口是一个列表,如微博、微信等,所以HarmonyOS提供了这类模板。

List Feature Ability(JS):带有列表功能的JavaScript版HarmonyOS工程。

Split Panel Ability(Java):带分隔面板的Java版HarmonyOS工程。

Tab Feature Ability(JS):带标签页的JavaScript版HarmonyOS工程。

其中,Ability是指Feature Ability,即带UI的Ability。还有一种不带UI的Ability,即PA,后面的章节会详细介绍这些内容。在本章中,读者不需要了解FA有哪些具体特性,以及相关的API,只要知道FA类似于Android中的Activity即可。下一章会详细介绍FA,以及Ability Slice[4]的特性和相关API。

[4] Ability Slice类似Android中的Fragment。

本书主要讲解如何用Java开发HarmonyOS App,所以忽略JavaScript版的模板,关于JavaScript版的内容,请大家关注我后期出版的HarmonyOS App开发系列图书。

本章为了从头演示创建HarmonyOS工程的过程,使用了Empty Feature Ability(Java)模板。选择TV设备和Empty Feature Ability(Java)模板后,单击Next按钮,进入Configure your project窗口,如图1-7所示,在该窗口中我们可以配置HarmonyOS工程。

图1-7 配置HarmonyOS工程

配置HarmonyOS工程需要指定以下4个信息。

Project Name:HarmonyOS工程名。

Package Name:HarmonyOS工程的包名,与Android中包的含义相同,用于在HarmonyOS设备中唯一标识HarmonyOS App。

Save Location:指定HarmonyOS工程保存的目录,注意,这个目录应该是空的,DevEco Studio会直接将与工程相关的目录和文件都放到这个保存目录中。

Compatible SDK:HarmonyOS SDK的API版本,大多数设备都有3和4两个版本,读者可以选择其中一个。

完成配置后,单击Finish按钮创建新的HarmonyOS工程,HarmonyOS工程的结构如图1-8所示。

图1-8 HarmonyOS工程的结构

1.3.2 启动模拟器

在没有真机的情况下,只能在模拟器中运行HarmonyOS App。不过,因为目前HarmonyOS还没有x86版的模拟器,所以我们通过ARM服务器模拟HarmonyOS的各种硬件设备,只不过这些ARM服务器需要通过华为账号申请。申请成功后,会在IDE中显示一个预览界面,可与ARM服务器交互。申请的过程如下。

首先在DevEco Studio中选择Tools→HVD Manager菜单项,如果是第一次选择该菜单项,会自动弹出一个华为账号登录窗口,如图1-9所示。

图1-9 华为账号登录

如果没有华为账号,可以单击“注册”链接进行注册,如果有华为账号,直接登录即可。

成功登录后,会弹出图1-10所示的对话框,提示“HUAWEI DevEco Studio想要访问您的华为帐号”,单击“允许”按钮。

图1-10 授权DevEco Studio访问华为账号

成功授权后,回到DevEco Studio,会弹出Virtual Device Manager对话框,并显示两个设备(TV和Wearable),如图1-11所示。

图1-11 HarmonyOS预览器列表

其中,TV是华为智慧屏,Wearable是华为智能手表。因为我们创建的工程是TV类型,所以双击TV或单击Actions列的三角形按钮申请TV预览器[5]

[5] 这里还不能称为模拟器,因为不是在本地运行,而是在服务端通过ARM服务器模拟出了若干个HarmonyOS设备。在运行时,按一定的时间频率,将屏幕显示的数据流发送给前端(预览器),然后预览器会将鼠标和键盘的动作返给服务端,接下来服务端将响应后的屏幕结果返回给预览器。所以,预览器相当于一个外接显示器,并没有处理任务的能力。

成功申请TV模拟器后,会显示一个视图,里面是TV预览器,如图1-12所示。该预览器支持鼠标点击、滑动等操作。在TV预览器中右侧的按钮用于控制预览器,例如,最上面的叉号,用来释放预览器,最下面的三角形按钮是回退键。

图1-12 TV预览器

注意,每次申请,使用时间只有1小时(为了防止用户长时间占用TV预览器),如果过期了,再按前面的步骤重新申请即可。

1.3.3 运行HelloWorld工程

现在已经准备就绪,单击IDE上方工具栏中图1-13所示的三角形按钮运行HarmonyOS App。

图1-13 三角形按钮

单击三角形按钮后,会弹出图1-14所示的设备选择对话框。不管是真机,还是模拟器,只要成功连接,都会在设备选择列表中显示。但要注意,该列表列出的不只是HarmonyOS设备,如果本机连接了Android设备,也同样会列出。因为HarmonyOS App是不能运行在Android设备上的,所以应在列表中选择HarmonyOS设备来运行HarmonyOS App。

选择要运行HarmonyOS App的设备后,单击OK按钮,会在选中的设备中运行当前的HarmonyOS App,运行效果如图1-15所示。

图1-14 设备选择对话框

图1-15 运行效果

1.4 分析第一个HarmonyOS工程

本节将分析HarmonyOS工程的结构,主要包括HarmonyOS工程的目录结构和配置文件config.json的核心选项。

1.4.1 HarmonyOS工程的目录结构

HarmonyOS工程的目录结构如图1-16所示。

图1-16 HarmonyOS工程的目录结构

尽管HarmonyOS工程的目录结构比较复杂,但并不是所有的目录和文件都经常被使用。本节将介绍两个比较常用的目录——java目录和resources目录。这两个目录的位置如下。

java目录:<HarmonyOS工程根目录>/entry/src/main/ java。

resources目录:<HarmonyOS工程根目录>/entry/src/ main/resources。

java目录用来保存HarmonyOS App中的Java代码文件,resources目录用来保存HarmonyOS App中的各种资源,如图像、字符串、数据库等。

我们打开java目录,会看到该目录中会有若干个java包,如果是新创建的HarmonyOS工程,里面只有一个java包,如本例的com.unitymarvel.firsttvdemo。在包目录中有若干个Java文件,主要的编码工作会在该目录中完成。

如果HarmonyOS App中要使用资源,而且这些资源要被嵌入到hap文件中,则需要将资源文件放到resources目录下,后面的章节会详细描述具体规则。

1.4.2 HarmonyOS工程的主配置文件——config.json

绝大多数工程都会有一个主配置文件,HarmonyOS工程也不例外,这个主配置文件就是config.json。很明显,config.json是JSON格式的配置文件。

config.json文件由3个顶层属性组成,这3个属性如表1-1所示。

表1-1 config.json的顶层属性

属性名称

含义

数据类型

是否必须设置

app

包含App的全局配置信息。如版本号、bundleName、vendor等。同一个App的不同HAP包的app属性必须保持一致。

对象

deviceConfig

包含与具体设备相关的配置信息,如车载电脑(Car)、华为智慧屏(TV)、智能手表(Wearable)等。

对象

module

包含HAP包的配置信息,如Ability相关的信息。该标签下的配置只对当前HAP包生效。

对象

在这3个属性中,app和module的使用比较频繁,尤其是module属性,修改的次数会比较多。因为HarmonyOS App的重要组成部分——Ability,必须在module中进行配置后才能使用。

DevEco Studio提供了自动创建Ability的功能,在HarmonyOS工程中,单击鼠标右键弹出菜单,选择New→Ability菜单项,会弹出图1-17所示的创建各种类型的Ability的菜单项。在创建某一个类型的Ability后,config.json文件中将自动添加相关的信息,通常不需要开发人员手动添加Ability信息,当然,开发人员可以在自动添加的Ability信息的基础上进行修改。

图1-17 创建各种类型的Ability的菜单项

假设要创建一个名为MyAbility的FA,在config.json中将自动生成如下配置代码:

{
    "orientation": "landscape",
    "formEnabled": false,
    "name": "com.unitymarvel.firsttvdemo.MyAbility",
    "icon": "$media:icon",
    "description": "$string:myability_description",
    "label": "entry",
    "type": "page",
    "launchType": "standard"
}

这段配置代码涉及的属性比较多,例如,orientation用来指定默认的方向(横屏或竖屏),name用来指定当前Ability的类名(包含包名),label用来指定Ability的标题文本等。关于config.json文件中配置的详细描述,读者可以参阅官方的文档,链接如下:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/basic-config-file-elements-0000000000034463#ZH-CN_TOPIC_0000001050708780__table34298422421

1.5 开发跨设备的HarmonyOS App

现在的智能设备种类越来越多,而且这些智能设备的屏幕尺寸、分辨率都不同。例如,比较常见的智能设备有手机、平板电脑、车载电脑、电视机、智能手表等,尽管这些设备都有屏幕,但它们的屏幕千差万别,有的屏幕尺寸小,有的屏幕尺寸大;有的是纵向的屏幕,有的是横向的屏幕;有的带触摸功能,有的不带触摸功能;甚至有的设备的屏幕是圆形的(如智能手表),这给开发App带来了麻烦。现在几乎每一个智能设备厂商,如Apple、华为都面临这个问题。这就要求我们开发的App尽可能适合更多的智能设备。

当然,最简单直接的方式是为每一类智能设备单独开发App。例如,为手机开发一款App,为智能电视开发一款App,为智能手表开发一款App。这么做尽管从技术上这是可行的,但这些不同设备的App,尽管在UI展现上不同,但大多数逻辑代码是相同的。如果为不同的设备单独开发App,会造成大量的代码冗余。所以推荐的方案是让一个App同时适用于不同的智能设备。基本的原理是在App运行时自动检测当前设备,然后运行与特定设备相关的代码,使用与特定设备相关的布局和资源。

这个方案的关键点是检测当前的设备类型。在创建HarmonyOS工程时,要么创建TV(华为智慧屏)工程,要么创建Wearable(智能手表)工程,要么创建其他设备的工程。也就是说,使用IDE创建的HarmonyOS工程只能在一种特定的设备上运行。要想让App在多种设备上运行,需要设置 config.json文件的deviceType属性,该属性指定了当前工程可以运行的设备类型,如果创建的是TV工程,deviceType属性的值如下:

"deviceType": [
     "tv"
]

如果创建的是Wearable工程,deviceType属性的值如下:

"deviceType": [
     "wearable"
]

如果deviceType属性的值是tv,当前工程是不能在智能手表上运行的,反之亦然。要想让当前工程同时在TV和Wearable上运行,需要同时指定tv和wearable(要手动修改config.json文件),配置代码如下:

"deviceType": [
     "tv",
     "wearable"
]

当完成deviceType属性的设置后,当前工程就可以同时在TV和Wearable上运行了。不过因为TV和Wearable的屏幕尺寸相差太大,所以布局通常会采用完全不同的样式。在HarmonyOS中,可以使用Java语言动态创建组件的布局方式,也可以使用布局文件。关于布局文件的使用,后面的章节会详细介绍。本节主要讨论使用Java语言动态创建组件的布局方式。

在创建的HarmonyOS工程中会自动生成一段样例代码,这些代码主要集中在MainAbilitySlice. java文件的onStart方法中,代码如下:

public void onStart(Intent intent) {
 
       super.onStart(intent);
 
       LayoutConfig config = new LayoutConfig(LayoutConfig.MATCH_PARENT, 
                                              LayoutConfig.MATCH_PARENT);
       myLayout.setLayoutConfig(config);
       ShapeElement element = new ShapeElement();
       element.setRgbColor(new RgbColor(255, 255, 255));
       myLayout.setBackground(element);
       Text text = new Text(this);
       text.setLayoutConfig(config);
       text.setText("Hello World");
       text.setTextColor(new Color(0xFF000000));
       text.setTextSize(50);
       text.setTextAlignment(TextAlignment.CENTER);
       myLayout.addComponent(text);
       super.setUIContent(myLayout);
}

读者并不需要对这段代码的每一行都了解,只需要知道这段代码将背景颜色设为白色,并且创建了一个用于显示文本的Text组件,该组件会显示文本Hello World。如果在TV设备上运行,效果如图1-15所示。不过运行代码,可以发现,在所有设备中UI都一样,但我们的目的是让不同的设备显示不同的UI,所以就需要通过下面的代码判断当前设备的类型:

if(DeviceInfo.getDeviceType().equals("tv")) {  
   ...
} else if(DeviceInfo.getDeviceType().equals("wearable")) {
   ...
}

其中,getDeviceType方法返回的值就是App当前运行设备的类型。如果运行在TV上,值为tv;如果运行在智能手表上,值为wearable。所以,可以用下面的代码来替换onStart方法中的代码:

public void onStart(Intent intent) {
       super.onStart(intent);
       LayoutConfig config = new LayoutConfig(LayoutConfig.MATCH_PARENT, 
                                              LayoutConfig.MATCH_PARENT);
       myLayout.setLayoutConfig(config);
       ShapeElement element = new ShapeElement();
       element.setRgbColor(new RgbColor(255, 255, 255));
       myLayout.setBackground(element);
       Text text = new Text(this);
       text.setLayoutConfig(config);
       if(DeviceInfo.getDeviceType().equals("tv")) {  
           // 运行在TV上的代码
           text.setText("华为智慧屏");
           text.setTextColor(new Color(0xFFFF0000));
           text.setTextSize(200);
       } else if(DeviceInfo.getDeviceType().equals("wearable")) {
           // 运行在Wearable上的代码
           text.setText("华为智能手表");
           text.setTextColor(new Color(0xFF0000FF));
           text.setTextSize(50);
       }
       text.setTextAlignment(TextAlignment.CENTER);
       myLayout.addComponent(text);
       super.setUIContent(myLayout);
   }

在这段代码中,将TV和Wearable上显示的文本内容、文本尺寸和文本颜色做了改变,所以在TV和Wearable上显示的文本是不同的。在TV上显示的效果如图1-18所示,在Wearable上显示的效果如图1-19所示。

图1-18 在TV上显示的效果

图1-19 在Wearable上显示的效果

1.6 调试代码

调试是开发App的必备技能,毕竟任何一个比较复杂的App都不可能一次编码成功。如果App的效果与自己期望的不同,或由于某些原因导致App异常中断,就需要查找原因,这些都需要调试代码。

调试代码有多种方法,比较常用的两种方式是设置断点和输出日志,本节将详细介绍这两种调试App的方式。

1.6.1 设置断点

如果认为需要跟踪的代码或bug在某行代码的附近,可以单击该行代码前面的部分为该行设置断点,这时在这行代码前面会出现一个红点,如图1-20所示。

然后单击上方工具栏中图1-21所示的调试运行按钮。

图1-20 设置断点

图1-21 调试运行按钮

如果未遇到断点,单击该按钮会正常运行程序,一旦遇到断点,程序运行就会在断点处停止运行。直到按F7或F8键才继续一行一行运行程序,以便监控程序中相关变量的状态。F7键表示Step Into,Step Into表示会跟踪到方法内部,例如,当前正在运行一个方法,按F7键会继续跟踪到方法内部,然后继续一行一行代码运行。F8键表示Step Over,Step Over会将方法当作一行代码运行,不会跟踪到方法内部。所以,如果认为某一个方法肯定没有问题,就按F8键,如果认为该方法可能会有一些问题,就按F7键。

调试代码的过程如图1-22所示。我们可以看到,在下方的Variables视图中会显示相关变量的当前值。

图1-22 调试代码的过程

1.6.2 输出日志

另外一种调试代码的方式是输出日志,可以直接使用System.out.println()将信息输出到Logcat视图中的方式,例如,运行下面的代码,会在Logcat视图中看到图1-23所示的信息。

System.out.println("hello world");

图1-23 在Logcat视图中输出的调试信息

HarmonyOS还提供了另外一种输出日志的方式,这就是HiLog类,该类提供了多个静态方法,用于输出不同级别的日志信息。这些静态方法及功能描述如表1-2所示。

表1-2 HiLog类中用于输出日志信息的方法

方法名

功能

debug

用于输出调试日志信息

info

用于输出普通日志信息

warn

用于输出警告日志信息

error

用于输出普通错误日志信息

fatal

用于输出致命错误日志信息

这5个方法的参数完全相同,例如,error方法的原型如下:

public static int error(HiLogLabel label, String format, Object... args);

其中,label参数表示输出日志的相关信息,类型是HiLogLabel对象;format参数表示要输出的日志文本(可以包括格式化占位符);args参数表示格式化的参数值,是可选参数。

使用输出日志方法的案例如下:

HiLogLabel label = new HiLogLabel(HiLog.LOG_APP ,223, "MY_TAG"); 
HiLog.error(label, "这是一行错误信息,原因:%{private}s","Url不可访问");
HiLog.warn(label,"这是一个警告,原因是:%{public}s", "变量的值可能是负数");

其中,HiLogLabel构造方法的第1个参数表示日志类型,目前只能设置为HiLog.LOG_APP,后续会开放更多的日志类型;第2个参数是domain,就是一个整数类型;第3个参数是日志标签。domain和日志标签都会以某种形式显示在日志信息上。

在输出日志信息时,运行格式化日志信息,也就是为日志信息指定占位符。占位符需要在%和符号(如s、d)之间加{private}或{public},如果加{private},输出的信息就是<private>,也就是说会隐藏占位符对应的信息;如果加{public},则输出原始的占位符信息。domain在输出时被转换为十六进制数放到日志标签的前面,中间用斜杠(/)分隔。

运行这段代码,会在HiLog视图中输出图1-24所示的日志信息。

图1-24 在HiLog视图中输出日志信息

使用error方法会输出深红色的日志信息,日志的内容与其他方法输出的日志内容相同。不过要注意,使用HiLog的相关方法输出的日志分为5个级别,分别是DEBUG(调试)、INFO(信息)、WARN(警告)、ERROR(错误)、FATAL(致命错误)。这5个级别分别用5个整数表示,这些整数都在HiLog类中定义,代码如下:

public final class HiLog {
    public static final int DEBUG = 3;
    public static final int INFO = 4;
    public static final int WARN = 5;
    public static final int ERROR = 6;
    public static final int FATAL = 7;
    ...
}

如果要在HiLog视图中过滤这些级别的信息,只有小于或等于当前级别的信息才会显示。例如,要过滤WARN信息,只有DEBUG、INFO和WARN这3个级别的信息才会被显示,因为ERROR和FATAL的级别值都比WARN大,所以这两个级别的信息不会被显示。

1.7 在真机上运行HarmonyOS App

到现在为止,相信大家已经基本了解了开发一款HarmonyOS App的流程,但我们一直是在HarmonyOS模拟器上运行App。在实际开发过程中,需要在真机上测试后才能对外发布,而且有很多功能(如蓝牙、NFC、传感器等)在HarmonyOS模拟器上是无法测试的。所以本节会讲解如何在手机上安装并测试HarmonyOS App。

1.7.1 生成签名文件

在真机上运行App与在模拟器上运行App不同。在真机上不管是调试还是发布,都需要对hap文件进行签名。签名一个hap文件需要4类文件,即p12、csr、cer和p7b文件。其中p12和csr文件可以自助生成,cer和p7b文件需要到App Grallery Connect去申请,然后下载。

生成这4类文件,需要7个步骤,下面就具体介绍一下这7个步骤。

1.生成p12文件

执行下面的命令,会在当前目录下生成一个名为demo.p12的文件。

keytool -genkeypair -alias "myalias" -keyalg EC -sigalg SHA256withECDSA -dname "C=CN,O=Huawei CBG,OU=HOS Development IDE Team,CN=ide_demo_pk Debug" -keystore demo.p12 -storetype
pkcs12 -storepass 1234abc

在执行上面的命令之前,需要将如下3个信息修改成自己的内容(其他内容不需要改):

-alias命令行参数后面的别名,本例是myalias;

-keystore命令行参数后面的文件名,本例是demo.p12;

-storepass命令行参数后面的密码,本例是1234abcd。

2.生成csr文件

执行下面的命令,会在当前目录下生成一个名为demo.csr的文件。

keytool -certreq -alias "myalias" -keystore demo.p12 -file demo.csr

其中,-alias命令行参数指定的别名要与生成demo.p12文件时指定的别名相同,demo.csr文件可以改成其他文件名。

注意,在执行上面的命令之前,要先生成demo.p12文件。在生成demo.csr文件的过程中,会要求输入生成demo.p12文件时指定的密码,本例是1234abcd。一定要记住这个密码,因为在后面配置App签名时还要用到。

3.创建项目

通过下面的URL打开页面,并单击“我的项目”按钮:https://developer.huawei.com/consumer/ cn/service/josp/agc/index.html进入创建项目页面,如图1-25所示。可以在该页面创建一个或多个项目,每一个项目可以包含0到多个安装包。

图1-25 创建项目页面

单击左侧的“添加项目”链接,会弹出图1-26所示的页面,输入项目名,单击“确定”按钮就可以创建新项目。

图1-26 创建新项目

4.通过csr文件在线申请cer文件(调试证书文件)

通过下面的URL打开页面,并单击“用户与访问”按钮:

https://developer.huawei.com/consumer/cn/service/josp/agc/index.html

进入该页面后,在左侧导航栏选择“证书管理”选项,进入证书管理页面,单击“新增证书”按钮弹出新增证书窗口,并按要求输入相应的内容,如图1-27所示。

图1-27 创建证书

创建完证书后,会在证书列表中看到新创建的证书,如图1-28所示。单击右侧的“下载”链接,下载对应的cer文件,本例是“我的证书.cer”文件。

图1-28 下载cer文件

5.添加设备

通过下面的URL打开页面,并单击“用户与访问”按钮:

https://developer.huawei.com/consumer/cn/service/josp/agc/index.html

进入该页面后,在左侧导航栏选择“设备管理”,进入设备管理页面。然后单击右侧的“添加设备”按钮,会弹出图1-29所示的窗口。这里需要选择设备类型,输入设备名称和UDID,然后单击“提交”按钮添加设备。只有在这里添加的设备才能使用前面申请的证书安装HarmonyOS App。

图1-29 添加设备

要想获得设备的UDID,需要用USB数据线连接HarmonyOS设备,然后执行下面的命令:

adb shell dumpsys DdmpDeviceMonitorService

成功执行命令后,在输出结果中的Local device info部分找到dev_udid,后面的字符串就是该设备的UDID。

如果有多部设备连接到了计算机上,需要使用-s命令行参数指定设备标识。

6.创建鸿蒙应用

通过下面的URL打开页面,并单击“我的项目”按钮:

https://developer.huawei.com/consumer/cn/service/josp/agc/index.html

进入该页面后,其中会列出在该项目下创建的应用,如图1-30所示,读者可以单击“添加应用”链接创建新的应用。

图1-30 应用列表

添加应用页面如图1-31所示。读者需要在该页面按图1-31所示填写必要的信息(需要按自己App的情况填写相应的内容),其中“支持设备”保持默认值就可以在HarmonyOS手机上运行。

注意,如果App的包变了,需要重新按这一步添加应用,否则App将无法部署在HarmonyOS手机上。

7.获得p7b文件

进入上一步创建的应用的页面,单击右上角的“添加”按钮,添加一个HAP Provision Profile。这一步是一个总绑定,将App的包、证书和设备绑定在一起。也就是说,只有特定包的App,使用特定的证书,才能在特定的设备上部署。进入页面后,可以仿照图1-32所示填写这个页面的内容。

图1-31 添加应用页面

图1-32 添加HAP Provision Profile

成功添加HAP Provision Profile后,会在列表中显示刚才创建的HAP Provision Profile,如图1-33所示。单击右侧“下载”链接,就会下载一个名为“网盘p7bDebug.p7b”的文件。

图1-33 下载p7b文件

到目前为止,所有必要的文件都已经备齐,通过这7个步骤获得了图1-34所示的4个文件,其中demo.csr文件只是一个中间文件,在签名时并不需要它。

图1-34 用于签名的文件

注意,有的读者可能会感到生成证书比较麻烦,需要这么多步骤。其实只有第一次签名要这么多步骤,再创建新的应用时,只需要做第6步和第7步就可以了。也就是说,如果设备不变,在签名时只需要更换p7b文件就可以了。

1.7.2 签名HarmonyOS App

将HarmonyOS App在手机上部署,需要对hap文件签名。首先通过Create HarmonyOS Project窗口创建一个Phone工程,如图1-35所示。这里选择Empty Feature Ability(Java)模板。

在配置工程时,工程名可以任意输入,但Package Name必须输入创建应用时指定的包的名称,即com.harmonyos.netdisk,如图1-36所示。最后单击Finish按钮创建工程。

创建完工程后,选择File→Project Structure菜单项,打开Project Structure窗口,单击左侧的Modules,选择Signing Configs选项卡,进入配置页面,并按图1-37所示对签名文件进行配置。其中,Store Password和Key Password使用1.7.1节中生成demo.p12文件时使用的密码,本例是1234abcd。配置完后,单击OK按钮保存配置。

图1-35 创建Phone工程

图1-36 配置工程

图1-37 配置签名文件

到这里,签名的工作就已经完成了,现在运行程序,会弹出一个图1-38所示的选择设备对话框。列表中显示连接了两部HarmonyOS手机(通过USB数据线连接),可以选择其中一部用于运行程序。

运行效果如图1-39所示。

图1-38 选择设备对话框

图1-39 App在手机上的运行效果

1.7.3 网络部署App

通常在真机上运行HarmonyOS App时要用USB数据线将手机和计算机连接起来,这种方式比较复杂,而且如果使用的是USB接口并不富余的计算机,如苹果的Mac,还需要连接USB Hub等设备,所以本节介绍另外一种部署App的方式——网络部署。

其实网络部署与通过USB数据线部署在本质上是一样的,只是这种方式不需要通过USB数据线将手机与计算机进行连接,只需要手机与计算机在同一个网段即可。

在默认情况下,手机的网络调试功能是关闭的,所以需要使用adb或hdc命令打开手机的网络调试功能。adb是Android的命令,hdc是HarmonyOS的命令,这两个命令的功能类似。这两个命令的使用方法如下(执行其中一个即可):

adb tcpip 5555 
hdc tmode port 5555

注意,在执行上面的命令之前,手机必须先用USB数据线与计算机相连,等打开手机的网络调试服务后,就可以断开USB数据线的连接了。如果计算机连接了多部手机,使用adb命令需要添加-s命令行参数指定特定手机的标识,使用hdc命令需要添加-t命令行参数指定特定手机的标识,命令如下:

adb -s 017MXC19AS000544 tcpip 5555 
hdc -t -t 017MXC19AS000544 tmode port 5555

其中,5555是端口号,可以指定任何端口号。计算机需要通过这个端口号连接手机。如果成功打开手机的网络调试服务,可以使用下面的命令连接HarmonyOS手机。

adb方式:

adb connect 192.168.31.220:5555

hdc方式:

hdc tconn 192.168.31.220:5555

成功连接HarmonyOS手机后,就可以运行程序了。这时会在图1-38所示的列表中看到通过网络连接的HarmonyOS设备,选择设备并单击OK按钮运行即可,效果与通过USB数据线部署App是一样的。

1.8 解决gradle下载太慢的问题

DevEco Studio使用gradle作为构建工具,在默认配置的情况下,创建HarmonyOS工程后,在初始化的过程中可能会出现超时(timeout)异常,也就是访问gradle服务端超时异常。

网上解决这个问题的方法很多,比较常用的方法是自己先下载gradle的zip包(大概100 MB),例如,下载的文件是gradle-6.3-all.zip,然后将该文件放在特定的目录下。目录的位置与操作系统有关。

Windows下的位置:C:\Users\用户名\.gradle。

macOS下的位置:/Users/用户名/.gradle。

Linux下的位置:/home/用户名/.gradle。

读者根据自己使用的操作系统进入不同位置的.gradle目录,然后再进入该目录下的wrapper/dists子目录,会看到名称为“gradle-版本号-all”[6]的目录,例如,图1-40展示的是我的macOS上的gradle 集合。

[6] 有的开发工具生成的目录是以bin结尾的,如gradle-6.3-bin,这个无关紧要,因为下载gradle-6.3-all.zip和下载gradle-6.3-bin.zip是一样的,它们都包含必要的构建工具。

图1-40 macOS上的gradle集合

进入 gradle-6.3-all 目录(最新的 DevEco Studio 使用的是gradle 6.3),会看到一个名称由字母和数字组成的目录,如b4awcolw9l59x95tu1obfh9i8,这个目录的名称与gradle版本和路径有关。所以不同版本和路径的gradle,目录名不同。现在将下载的gradle-6.3-all.zip文件复制到该目录。用DevEco Studio重新打开HarmonyOS工程,就会非常快地同步gradle。这是因为DevEco Studio会优先在特定目录下搜索gradle的zip文件是否存在,如果存在,就直接使用,如果不存在,才会从网上下载。

不过有时特定的gradle目录还没有生成,我们不知道要将gradle-6.3-all.zip或类似的文件放到哪里,所以可以采用另外一种方法,换个下载速度更快的地址。

打开HarmonyOS工程,找到<工程根目录>/gradle/wrapper/gradle-wrapper.properties文件,会看到一个distributionUrl属性,该属性默认指向gradle的官方网站,可以将其换成国内的地址,或干脆用apache、nginx等服务器自己搭建一个本机下载服务,如我将其换成了如下的地址:

http://127.0.0.1/gradle-6.3-all.zip

现在再重新打开HarmonyOS工程,就会非常快速地下载和同步gradle及其相关配置了。不过这里还有一个问题,如果创建新的HarmonyOS工程,还要改一遍这个文件。所以为了一劳永逸,我们可以修改DevEco Studio的模板。

首先进入<DevEco Studio根目录>/plugins/harmony目录,这是DevEco Studio的插件目录。在该目录下找到lib/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.properties文件,该文件就是每次创建HarmonyOS工程时的gradle-wrapper.properties文件。打开该文件,将distributionUrl属性的值改成http://127.0.0.1/gradle-6.3-all.zip即可。然后重新启动DevEco Studio。与创建新的HarmonyOS工程时,DevEco Studio就会自动使用新的gradle下载地址了。由于此前已经下载了gradle,所以即使不启动本机的http服务器,仍然能快速使用gradle。

1.9 总结与回顾

本章介绍了HarmonyOS的基础内容,目的是带领读者开启HarmonyOS App的开发之旅。首先让读者了解HarmonyOS和HarmonyOS的技术定位;然后一步一步教读者如何搭建HarmonyOS开发环境、创建第一个HarmonyOS工程;为了让读者了解HarmonyOS工程的结构,在本章中,我们分析了这个工程结构,以便让读者知其然,知其所以然;最后,讲解了如何在装有HarmonyOS的真机上运行App,让读者初步具有开发App的能力。当然,要想成为一名优秀的HarmonyOS App开发者,读者需要付出非常大的努力,需要掌握更多的知识,需要通过大量的项目提升自己的实战经验。最重要的是,需要继续阅读本书后面的内容,因为开发HarmonyOS App需要的知识基本上本书都包含了。

相关图书

鸿蒙原生应用开发:ArkTS语言快速上手
鸿蒙原生应用开发:ArkTS语言快速上手
鸿蒙操作系统设计原理与架构
鸿蒙操作系统设计原理与架构
Qt程序设计基础  基于银河麒麟桌面操作系统
Qt程序设计基础 基于银河麒麟桌面操作系统
鸿蒙入门:HarmonyOS应用开发
鸿蒙入门:HarmonyOS应用开发
鸿蒙第三方组件库应用开发实战
鸿蒙第三方组件库应用开发实战
华为LiteOS:快速上手物联网应用开发
华为LiteOS:快速上手物联网应用开发

相关文章

相关课程