我不想知道你怎么没的,我想知道你怎么来的——“你好,世界” 原创 精华
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创建及修改,接下来我们将进一步学习如何去自定义开发。
老师的下一章链接我在这里贴下:https://harmonyos.51cto.com/posts/5654