我不想知道你怎么没的,我想知道你怎么来的——“你好,世界” 原创 精华

Tuer白晓明
发布于 2021-6-11 09:36
浏览
1收藏

1.4  “你好,世界”怎么来的

不识庐山真面目,只缘身在此山中。

在1.3小节中,创建HelloWorld 鸿蒙应用程序并在远程模拟器屏幕上看到了“你好,世界”这么简单的一句话,到底是如何显示到屏幕上的呢?我想把“你好,世界”改为“你好,鸿蒙”,我该如何操作呢?我还想把标题栏的内容改为“我的第一个鸿蒙应用”到底如何实现呢?接下来,我们将详细的看看“HelloWorld”到底有什么,如何进行更改使其不再是HelloWorld示例。

 

1.4.1 鸿蒙应用目录结构

在开始一系列操作之前,首先要对项目的整个目录结构有清晰的认识。在IDE Project选项卡中展开HelloWorld项目,其根目录下存在不少于10个文件或者文件夹(图1.4.1),这么多文件都有什么用处呢(表1.4.1)?

我不想知道你怎么没的,我想知道你怎么来的——“你好,世界”-鸿蒙开发者社区

图1.4.1 项目目录结构

表1.4.1 目录结构说明

文件名称 描述 备注
.gradle Gradle配置文件。 自动生成,不建议修改
.idea IDE配置文件。 自动生成,不建议修改
build 项目输出路径,包括编译后的安装文件。 自动生成,不建议修改
entry 默认启动模块(主模块)。 项目代码、资源等内容放置在这个目录下。
gradle 自动完成Gradle环境支持。 自动生成,不建议修改
.gitignore Git源码版本忽略管理。 自动生成,不建议修改
build.gradle 项目全局的Gradle构建脚本。 自动生成,不建议修改
gradle.properties Gradle运行环境配置文件。 自动生成,不建议修改
gradlew 自动完成Gradle环境Linux和Mac脚本。 自动生成,不建议修改
gradlew.bat 自动完成Gradle环境的Windows脚本。 自动生成,不建议修改
local.properties HarmonyOS SDK环境路径配置。 自动生成,不建议修改
settings.gradle Gradle项目的子项目包含文件。 自动生成,不建议修改


对于项目的整个根目录文件,我们需要关注的是entry目录(图1.4.2),其他由系统自动生成的文件,一般情况下我们是不需要修改的。entry作为应用的主模块,用于存放开发者编写的源代码文件、资源文件等,开发者必须熟知entry目录下的文件和文件夹所代表的含义,这样才能使开发得心应手。

我不想知道你怎么没的,我想知道你怎么来的——“你好,世界”-鸿蒙开发者社区

图1.4.2 entry目录结构

表1.4.2 entry目录结构说明

文件名称 描述 备注
build 编译文件。 自动生成,不建议修改
lib entry模块依赖文件。 比如三方库文件。
src 代码文件、资源文件、配置信息 主要操作文件。
src -> main->java 存放Java源代码  
src -> main->resources 存放应用的资源文件。 如图、多媒体、布局等
src -> main->config.json Hap清单文件。 如版本、权限等。
.gitignore Git源码版本忽略管理。 自动生成,不建议修改
build.gradle 编译配置文件。 可引入三方库
proguard-rues.pro 混淆规则。  


通过以上分析,对项目目录结构有了简单的认知,接下来将需要了解一些基础的知识,只有掌握了这些基础的知识,开发的时候才能有条不紊,胸有成竹。

 

1.4.2 鸿蒙用户应用程序
用户应用程序泛指运行在设备的操作系统之上,为用户提供特定服务的程序,如开发者使用的DevEco Studio程序就是一款面向鸿蒙应用开发的用户应用程序,这个应用程序所面向的群体是鸿蒙应用开发者。

 

鸿蒙设备上运行的应用有两种形态,一种是我们常见的需要安装的应用;另一类类似小程序一样的提供特定功能,不需要安装可直接调起使用的应用,在鸿蒙中称为原子化服务。

 

鸿蒙用户应用程序以APP Pack(Application Package)形式发布,由一个或多个HAP(HarmonyOS Ability Package)以及描述每个HAP属性的pack.info组成。

举个不是很恰当但接地气的例子,好比你要煮鸡蛋。锅(比作APP Pack)中可以放一个或多个鸡蛋(比作HAP),当然你肯定不会一个也不放,那就不叫煮鸡蛋了,叫烧开水O(∩_∩)O哈哈~。

 

HAP是由代码、资源、第三方库及应用配置文件组成的模块包,可分为entry和feature两种模块类型(图1.4.3)。

我不想知道你怎么没的,我想知道你怎么来的——“你好,世界”-鸿蒙开发者社区图1.4.3 APP逻辑视图(来自官网)

一个鸡蛋(HAP)由蛋黄(代码)、蛋清(资源)、蛋皮(应用配置文件)以及一些额外的东西(可以脑补一下)(第三方库),当然你在煮鸡蛋之前会进行清洗(所以第三方库也不是必须的)。一个煮熟的鸡蛋蛋黄(entry模块)里面有可能含有小黑点(feature模块)或者肉块(feature模块)。而feature是不需要靠运气的,需要创建就可以。

 

entry模块作为应用的主模块,一个APP中,对于同一设备类型必须有且只有一个entry类型的HAP,可独立安装运行。而feature是应用的动态特性模块。一个APP可以包含一个或多个feature类型的HAP,也可以不包含。只有包含Ability(第2章进行详细介绍,这里只做了解)的HAP才能够独立运行。

 

图1.4.3中pack.info是什么呢?是用来描述应用软件包中每个HAP的属性,由IDE编译生成,应用市场根据该文件进行拆包和HAP的分类存储。具体属性包括如下:

  • Delivery-with-install:表示该HAP是否支持随应用安装。“true”表示支持;“false”表示不支持。
  • name:HAP文件名。
  • module-type:模块类型,entry或feature。
  • device-type:表示支持该HAP运行的设备类型。

我不想知道你怎么没的,我想知道你怎么来的——“你好,世界”-鸿蒙开发者社区图1.4.4 pack.info

1.4.3 应用配置文件config.json
鸿蒙应用程序的每个HAP根目录都存在一个“config.json”配置文件(图1.4.5),该配置文件主要用于应用程序的全局配置信息(app属性)、具体运行设备配置信息(deviceConfig属性)、以及HAP包的配置信息(module属性)。在DevEco Studio中可以通过两种形式配置,代码方式和可视化编辑方式,通过点击图1.4.5红色框中的图标进行切换。

我不想知道你怎么没的,我想知道你怎么来的——“你好,世界”-鸿蒙开发者社区图1.4.5 config.json配置预览

1)App配置

App见名思意就是整个App的配置信息,常用配置包含应用程序包名(bundleName)、生成厂商(vendor)、应用版本信息(version)。

{
  "app": {
    "bundleName": "com.itming.helloworld",
    "vendor": "itming",
    "version": {
      "code": 1000000,
      "name": "1.0.0"
    }
  }
}

2)Device Config

deviceConfig包含在具体设备上的应用配置信息,是可缺省属性。可以通过default属性设置所有设备的通配配置,也可以设置具体的某个设备的特殊配置,需要指定设备类型(phone、tablet、tv等),暂不做详细介绍,若想详细了解,参加官网应用配置文件章节。

3)Module配置

module对应用HAP包的配置信息,表1.4.3为常用属性说明,详细说明参加官网文档中开发基础知识->应用配置文件->配置文件的元素章节。

表1.4.3 module属性

属性名称 描述
package HAP包结构名称,应用内唯一。不管应用有多少个HAP,其package为统一的。
name HAP类名,前缀需与同级的package指定的包名一致,也可以采用“.”开头的命名方式。
mainAbility HAP包的入口Ability名称,该属性值应配置为“module->abilities”中存在的Page类型Ability的名称。
deviceType 允许Ability运行的设备类型。
distro HAP发布的具体描述。HAP是否支持随应用安装、HAP的名称、HAP的类型、当前FA是否支持免安装特性。
abilities 当前模块内的所有Ability。采用数组格式。
defPermissions 应用定义的权限,应用使用者必须申请这些权限,才能正常访问。
reqPermissions 应用运行时向系统申请的权限。
Theme 主题。

 

 "module": {
    "package": "com.itming.helloworld",
    "name": ".MyApplication",
    "mainAbility": "com.itming.helloworld.MainAbility",
    "deviceType": [
      "phone",
      "tablet",
      "tv",
      "wearable",
      "car"
    ],
    "distro": {
      "deliveryWithInstall": true,
      "moduleName": "entry",
      "moduleType": "entry",
      "installationFree": false
    },
    "abilities": [{}]
  }

1.4.4 资源目录resources
resources目录(图1.4.6)是存放应用的资源文件(字符串、图片、音频、布局文件等),其分为两大类目录,一类是base目录与限定词目录和,另一类是rawfile目录。base目录和rawfile目录都是默认存在的目录,即随应用创建系统自动生成。限定词目录需要开发者自行创建。
我不想知道你怎么没的,我想知道你怎么来的——“你好,世界”-鸿蒙开发者社区

图1.4.6 resources目录

base目录存放元素资源(element)、绘制资源(graphic)、布局资源(layout)、多媒体资源(media)等,会被编译成二进制文件,并赋予资源文件ID(唯一索引),可以通过指定资源类型和资源名称来引用。rawfile目录下的资源文件会被直接打包进应用,不会被编译也不会被赋予资源文件ID,可以通过指定文件路径和文件名来引用,但不建议在该目录下存储文件,从而导致整个应用臃肿。

 

base目录下的资源在编译成二进制文件时会生成唯一ID(索引),Java和XML都可以通过指定资源类型和资源名称来使用资源。系统在创建初会生成一个系统级资源列表和项目资源列表,我们后续添加的资源都会在项目资源列表中新增一个唯一的资源ID。所以调用系统资源和项目资源所需要的索引位置是不同的,系统资源在ohos.global.systemres.ResouceTable类中,项目资源在com.itming.helloworld.ResourceTable(这里是你自己创建项目时的包名)类中。在HelloWorld项目中,你可以先打开base->layout->ability_main.xml,可以查看Text标签的ohos:text属性值是以$string:app_name的方式,并不是直接固定的字符,这种方式便于我们统一管理资源,便于后续修改,即一处修改处处生效。这是XML中引入资源的方法,在Java中那就更简单了,直接使用ResourceTable.type_name的方式引入即可,如text.setText(ResourceTable.String_app_name);来设置文本显示内容。后续章节中我们会经常使用这两种方式来引用资源,在这里先有个简单的了解,至于rawfile目录中资源的使用,后续若有需要时我们再详细介绍。

 

1.4.5 “你好,世界”在哪儿
在鸿蒙应用中一切皆Ability(能力。第二章会详细介绍),通过1.4.3节对应用配置文件config.json文件的了解,其中HAP包的配置信息module对象中的mainAbility作为HAP包的入口Ability,我们可以打开这个主类,其中代码如下所示。

public class MainAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(MainAbilitySlice.class.getName());
    }
}

HAP包启动后通过config.json配置信息调用MainAbility类中的onStart(Intent)方法进行初始化,通过setMainRoute(String)设置此Ability的主要路由路径(直白点就是将要显示的UI界面)。AbilitySlice作为Ability(能力)使用页面模板的基本单元,其提供了一种具有服务逻辑和UI显示载体的Ability(能力)。在MainAbilitySlice类中通过onStart(Intent)方法初始化加载页面布局,setUIContent(String)可以调用资源文件中的布局资源来显示页面,你也可以通过Java代码构建一个布局,并通过setUIContent(ComponentContainer)方法将布局加载进Ability中。最终呈现给用户的就是我们1.3运行显示的效果。

到这里你也许已经知道在哪儿能够修改“你好,世界”,对的,在resources -> base -> layout -> ability_main.xml中修改ohos:text的内容,但是你发现ohos:text内容引用的是元素资源。依次打开resouces -> base -> element -> string.json找到mainability_HelloWorld键的值是Hello World,并不是我们看到的“你好,世界”。如果你细心的话,你会在resources目录下发现en.element和zh.element两个元素资源包,这里使用了中英文语言包,根据系统的语言来切换显示效果。我们修改zh.element中mainability_HelloWorld值为“你好,HarmonyOS”,然后运行查看效果(图1.4.7)。

我不想知道你怎么没的,我想知道你怎么来的——“你好,世界”-鸿蒙开发者社区

图1.4.7 修改显示

运行后页面显示已经不是原来的“你好,世界”了,已经显示成我们修改后的内容。接着,我们按照修改页面内容的方式,找到entry_MainAbility键,并将值改为“我的第一个鸿蒙应用”(图1.4.8)。

我不想知道你怎么没的,我想知道你怎么来的——“你好,世界”-鸿蒙开发者社区图1.4.8 修改标题

至此我们对鸿蒙有了简单的认识,并完成了环境配置、开发工具安装、第一个鸿蒙应用Demo创建及修改,接下来我们将进一步学习如何去自定义开发。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
标签
2
收藏 1
回复
举报
1条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

老师的下一章链接我在这里贴下:https://harmonyos.51cto.com/posts/5654

1
回复
2021-6-11 11:45:41
回复
    相关推荐