前言
近来因为业务需要,需要做一款 UI 定制的鸿蒙 Launcher,于是就开始了「找到代码」、「研究代码」、「魔改代码」的套路流程,仅以此文章作为知识备份和技能探究所用,也希望能给其他小伙伴提供一些源码的解析思绪,方法大家各自魔改!
一、官方简介
Gitee codes:应用子系统/Launcher
Launcher 作为系统人机交互的主要入口,提供应用图标的表现、点击启动、卸载应用,并提供桌面布局设置以及近来使命管理等功能。
Launcher 接纳扩展的 TS 语言(ArkTS)开辟
1.1 主要结构
1.2 分层说明
Module层级说明product业务形态层区分差异产品、差异屏幕的各形态桌面,含有桌面窗口、个性化业务,组件的设置,以及个性化资源包。feature公共特性层抽象的公共特性组件集合,可以被各桌面形态引用。common公共本领层基础本领集,每个桌面形态都必须依靠的模块。 1.3 目录结构
- /applications/standard/launcher/
- ├── common # 公共能力层目录
- ├── docs # 开发指南
- ├── feature # 公共特性层目录
- │ └── appcenter # 应用中心
- │ └── bigfolder # 智能文件夹
- │ ├── form # 桌面卡片管理功能
- │ ├── gesturenavigation # 手势导航
- │ ├── pagedesktop # 工作区
- │ ├── recents # 最近任务
- │ ├── settings # 桌面设置
- │ ├── smartdock # dock工具栏
- ├── product # 业务形态层目录
- ├── signature # 签名证书
复制代码 1.4 开辟调试
IDE 下载:建议大家直接下载 OpenHarmony 4.1 Release DevEco-Studio 吧,API 支持 8 ~ 11。
1.5 SDK
Launcher 应用的编译需使用相对应版本的 ohos-sdk-full \ mac-sdk-full 来举行开辟调试。
IDE 上是 Public SDK,故 full sdk 需要重新下载,下载地址:
新版本界面:http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist
老版本界面:http://ci.openharmony.cn/dailys/dailybuilds
具体下载及如何替换这边就不啰嗦了,大家直接看 Gitee 介绍自行替换。
1.6 签名设置
关于签名设置,也不啰嗦了,下载的代码自带的文件都已经设置好,无需自己手动签名。
1.7 替换 Launcher
使用以下下令来更新编译出来的 Launcher 部件 hap 包:
- ren phone_launcher-default-signed.hap Launcher.hap
- ren launcher_settings-phone_launcher-default-signed.hap Launcher_Settings.hap
- hdc target mount
- hdc shell rm -rf /data/misc_de/0/mdds/0/default/bundle_manager_service
- hdc shell rm -rf /data/accounts
- hdc shell mount -o remount,rw /
- hdc file send .\Launcher.hap /system/app/com.ohos.launcher/Launcher.hap
- hdc file send .\Launcher_Settings.hap /system/app/com.ohos.launcher/Launcher_Settings.hap
- pause
- hdc shell mount -o remount,rw /
- hdc shell rm /data/ -rf
- hdc shell sync /system/bin/udevadm trigger
- hdc shell reboot
复制代码 二、编译运行
2.1 分支选择
拉完官方示例代码后,可以看到很多分支,我选了 OpenHarmony-4.1-Release 作为魔改的基础分支,当然你也可以根据需要选择别的分支(我是着实看不懂,搞这么多分支干什么,而且基本上彼此分支的 UI 结果大差不差,险些所有 Openharmony 自带的系统应用 Demo UI 及功能逻辑都很 low,所以凡事靠自己,自己魔改吧!)
2.2 打开工程 / 编译 hap
切到对应分支后,即可打开工程,等待同步完成,如下图即可。
接下来可以编译 hap 包:
接着找到需要的 hap 包,重命名,替换后重启:
默认 Launcher 结果:(我手里有一台平板,所以就以平板为示例,结果要比手机少一点)
三、Launcher 首页
3.1 MainAbility
- export default class MainAbility extends ServiceExtension {
- onCreate(want: Want): void {
- Log.showInfo(TAG,'onCreate start');
- this.context.area = 0;
- this.initLauncher();
- }
- async initLauncher(): Promise<void> {
- /**
- * 1. init Launcher context
- * 初始化上下文
- */
- globalThis.desktopContext = this.context;
- /**
- * 2. init global const
- * 初始化全局变量
- */
- this.initGlobalConst();
- /**
- * 3. init Gesture navigation
- * 初始化手势导航
- */
- this.startGestureNavigation();
- /**
- * 4. init rdb
- * 初始化 rdb
- */
- let dbStore = RdbStoreManager.getInstance();
- await dbStore.initRdbConfig();
- await dbStore.createTable();
- let registerWinEvent = (win: window.Window) => {
- win.on('windowEvent', (stageEventType) => {
- // 桌面获焦或失焦时,通知桌面的卡片变为可见状态
- if (stageEventType === window.WindowEventType.WINDOW_ACTIVE) {
- localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_FORM_ITEM_VISIBLE, null);
- Log.showInfo(TAG, `lifeCycleEvent change: ${stageEventType}`);
- }
- })
- };
-
- /**
- * 5. 注册窗口事件
- */
- windowManager.registerWindowEvent();
-
- /**
- * 6. 注册导航栏事件
- */
- navigationBarCommonEventManager.registerNavigationBarEvent();
- /**
- * 7. create Launcher entry view
- * 创建桌面窗口
- * WindowManager.ts --> DESKTOP_WINDOW_NAME = 'EntryView';
- * 加载 pages/EntryView
- */
- windowManager.createWindow(globalThis.desktopContext, windowManager.DESKTOP_WINDOW_NAME,
- windowManager.DESKTOP_RANK, 'pages/' + windowManager.DESKTOP_WINDOW_NAME, true, registerWinEvent);
- /**
- * 8. load recent,加载 Recent 窗口
- */
- windowManager.createRecentWindow();
- this.registerInputConsumer();
- }
- ...
- }
复制代码 MainAbility 创建了桌面窗口:pages/EntryView。
3.2 EntryView
[code] |