原生Launcher功能有限,许多定制化的需求无法满足。现提供一种修改现有应用,替换原生Launcher的方式。

1.修改签名

Launcher作为系统应用需要将APL等级修改为system_core。此处提供一种最方便调试的方式去修改。修改对应SDK文件下的toolchains\lib\UnsgnedReleasedProfileTemplate.json。修改如下所示,该方法能最快修改等级,但会改变签名指纹。

2.修改应用配置

修改module.json5

    "extensionAbilities": [
      {
        "priority": 2,//应用启动优先级
        "skills": [
          {
            "entities": [
              "entity.system.home",
              "flag.home.intent.from.system"
            ],
            "actions": [
              "action.system.home",
              "com.ohos.action.main",
              "action.form.publish"
            ]
          }
        ],
        "visible": true,
        "name": "com.ohos.launcher.MainAbility",//对应应用的打开界面的Ability
        "icon": "$media:icon",
        "description": "$string:mainability_description",
        "label": "$string:entry_MainAbility",
        "srcEntrance": "./ets/MainAbility/MainAbility.ts",
        "type": "service"//必须为service类型,该类型配置也需要APL为system级别
      }
    ]

修改Ability加载方式

通过创建窗口,使用窗口去加载对应的页面,核心的windowManager可以在开源Launcher的common/src/main/ets/default/manager/WindowManager.ts中获取

export default class MainAbility extends ServiceExtension {
  async onCreate(want: Want): Promise<void> {
    Log.showInfo(TAG, 'onCreate start');
    this.initLauncher();
  }
  
  async initLauncher(): Promise<void> {
    // init Launcher context
    globalThis.desktopContext = this.context;
    globalThis.screenWidth = (await this.getWindowDisplayData()).width
    globalThis.screenHeight = (await this.getWindowDisplayData()).height
    Log.showInfo(TAG, 'screenWidth: ' + globalThis.screenWidth + ' screenHeight: ' + globalThis.screenHeight);
    windowManager.registerWindowEvent();
    // create Launcher entry view
    windowManager.createWindow(globalThis.desktopContext, windowManager.DESKTOP_WINDOW_NAME,
      windowManager.DESKTOP_RANK, 'pages/' + windowManager.DESKTOP_WINDOW_NAME, true);
  }
  
  onDestroy(): void {
    windowManager.unregisterWindowEvent();
    windowManager.destroyWindow(windowManager.DESKTOP_WINDOW_NAME);
    windowManager.destroyRecentWindow();
    Log.showInfo(TAG, 'onDestroy success');
  }

  onRequest(want: Want, startId: number): void {
    Log.showInfo(TAG, `onRequest, want:${want.abilityName}`);
    windowManager.minimizeAllApps();
  }
  private async getWindowDisplayData() {
    let displayData: display.Display = null;
    await display.getDefaultDisplay()
      .then((res) => {
        displayData = res;
      }).catch((err) => {

      });
    return displayData;
  }
}

3.修改完成之后删除原生Laucnher,替换为改造后的信息。文件在vendor仓中的preinstall-config目录下,将install_list_capability.json,install_list_permissions.json,install_list.json原生Launcher的信息替换为改造后的信息。该文件在本机的/system/etc/app中,也可以修改对应的文件后推送进去,替换hap直接本地验证

4.如果需要配置Launcher保活的话,需要在foundation/ability/ability_runtime/services/abilitymgr/include/ability_config.h文件中launcher对应的名称改掉

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐