OpenHarmony开发者论坛

标题: OpenHarmony 应用开机自启 [打印本页]

作者: lxw775    时间: 2024-6-4 18:57
标题: OpenHarmony 应用开机自启
[md]专研了几天的应用开机自启终于实现了,OpenHarmony开发版本是使用的api9,然后设备使用的是开发板,找了很久api9貌似是没有开机自启的api的,然后发现全网都没有一篇完整详细介绍自启的文章,那我就来分享一下吧。

#### 实现原理

整个实现原理就是专门弄个应用当启动器,让这个应用进行开机自启(此处的开机自启并不是直接打开应用,而是自启一个服务挂在后台运行),然后让这个应用去打开需要自启的那个应用,在此也是参考了这篇文章
`https://blog.csdn.net/q228931518/article/details/131520737`

#### 创建应用及替换full-sdk

![image.png](https://forums-obs.openharmony.c ... 9nm5bomhgccpxox.png "image.png")

创建完毕之后需要替换一下sdk,使用full-sdk才有权限使用**ServiceExtensionAbility**模块

具体替换步骤可以去参考官方文档,我大概说下步骤
https://docs.openharmony.cn/page ... sdk-switch-guide.md

1.首先去这个地址下载full-sdk包
[下载地址](https://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist)

![image.png](https://forums-obs.openharmony.c ... l5g4ppo2mmbdord.png "image.png")
选择全量包进行下载,我是windows就以windows为例,解压选择windows,只需要这个包ets-windows-x64-3.2.14.1-Release,版本按照你自己的来。

下一步打开sdk目录,在编辑器->工具->sdk管理找到sdk安装路径

![image.png](https://forums-obs.openharmony.c ... hfo7ole83e7ljwj.png "image.png")

![image.png](https://forums-obs.openharmony.c ... grfuss8zng87txa.png "image.png")
只需要替换ets文件夹里面的文件即可,首先先记录ets目录下随便哪个文件夹里的oh-uni-package.json文件里的版本号,比如我这里是3.2.13.5

![image.png](https://forums-obs.openharmony.c ... 9amc7p9cz7p794c.png "image.png")

然后将ets里的文件删除,也可以备份到外面去,然后将这个压缩包**ets-windows-x64-3.2.14.1-Release**解压,解压的文件全部放进ets目录中,然后将每个文件夹里面的**oh-uni-package.json**的版本号改为之前所记录的版本号,我是3.2.13.5我就全改成3.2.13.5了。
替换完成之后把依赖安装一下,也就是 \build-tools\ets-loader目录中打开cmd 执行npm install 依赖装完就替换完成

#### 应用修改为系统应用

因为后台打开系统应用的api是只有系统应用才有权限的所以更改一下
还是进入sdk目录下打开这个文件

![image.png](https://forums-obs.openharmony.c ... glyujsfl0suf09y.png "image.png")

修改这两个的值就行了

`"apl":"system_core",`
`"app-feature":"ohos_system_app"`

![image.png](https://forums-obs.openharmony.c ... n18klrtrv058ml1.png "image.png")

然后保存就ok了

#### 应用配置工程签名

单击 **文件 > 项目结构 > Project > SigningConfigs** 界面勾选**Automatically generate signature**,等待自动签名完成即可,单击**OK**。

![image.png](https://forums-obs.openharmony.c ... 0nwfdhvzd2hdi0r.png "image.png")

#### 配置ServiceExtensionAbility

这里参考这篇大佬的文章就行  按照他的步骤来,详细可以参考这篇文章和相应文档,我大概说下步骤吧

https://blog.csdn.net/q228931518/article/details/131520737

1. 在工程Module(entry)对应的ets目录下,右键选择**New > Directory**,新建一个目录并命名为**ServiceExtAbility**。
2. 在ServiceExtAbility目录,右键选择 **New > TypeScript File** ,新建一个TypeScript文件并命名为**ServiceExtAbility.ets**。
3. 在**ServiceExtAbility.ts**文件中,导入**ServiceExtensionAbility**的依赖包,自定义类继承**ServiceExtensionAbility**并实现生命周期回调。
4. 代码如下,包含跳转应用的代码,我加了个二十秒的延迟,不然的话开机是检测不到应用包的是跳转不了的,这里应该也可以去检测之类的吧,大佬可以优化下。

```
import ServiceExtensionAbility from '@ohos.app.ability.ServiceExtensionAbility';
import Want from '@ohos.app.ability.Want';

const TAG: string = "[ServiceExtAbility]";

export default class ServiceExtAbility extends ServiceExtensionAbility {

  onCreate(want: Want) {
    setTimeout(() => {
      let params: Want = {
        'bundleName': 'com.example.app_question_40', // 这里是你的应用包名
        'moduleName': 'entry',
        'abilityName': 'EntryAbility'
      };
      try {
        this.context.startAbility(params, (error) => {
          if (error.code) {
            // 处理业务逻辑错误
            console.error(`startAbility failed, error.code: ${error.code}, error.message: ${error.message}`);
            return;
          }

        });
      } catch (paramError) {
        // 处理入参错误异常
        console.error(`error.code错误:  ${paramError.code}, error.message: ${paramError.message}`);
      }
    }, 20000)
    console.info(TAG, `onCreate_____end, want: ${want.abilityName}`);
  }

  onRequest(want: Want, startId: number) {
    console.info(TAG, `onRequest, want: ${want.abilityName}`);
  }

  onConnect(want: Want) {
    console.info(TAG, `onConnect, want: ${want.abilityName}`);
    return null
  }

  onDisconnect(want: Want) {
    console.info(TAG, `onDisconnect, want: ${want.abilityName}`);
  }

  onDestroy() {
    console.info(TAG, `onDestroy`);
  }
}
```

5. 然后再去 src/main/module.json5去添加注册ServiceExtensionAbility,并修改**module.mainElement**为**ServiceExtAbility**

```
"mainElement": "ServiceExtAbility"
"extensionAbilities": [
      {
        "name": "ServiceExtAbility",
        "icon": "$media:icon",
        "description": "service",
        "type": "form",
        "exported": true,
        "srcEntry": "./ets/ServiceExtAbility/ServiceExtAbility.ets"
      }
    ],
```

6. 然后这个文件下还要再配置一个权限

```
"requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      },
      {
        "name": "ohos.permission.START_ABILITIES_FROM_BACKGROUND"
      }
    ],
```

#### 获取指纹证书

现在把应用安装到机器上是安装不上的因为要改配置文件才支持ServiceExtensionAbility服务,我们先把module.json5里面的extensionAbilities里type类型改下,先把应用装到机器上去。

![image.png](https://forums-obs.openharmony.c ... eefge01gkzsze00.png "image.png")

然后执行hdc命令

> hdc shell "bm dump -n 包名 | grep finger"

然后就可以得到指纹代码了

![image.png](https://forums-obs.openharmony.c ... r7tk8i3pe7zj0fc.png "image.png")

然后将机器上的特权配置文件**install\_list\_capability.json **放到本地

> hdc file recv /etc/app/install\_list\_capability.json D:\\

添加应用信息

bundleName:应用包名。

app\_signature:就是刚刚获取到的指纹

allowAppUsePrivilegeExtension:是否允许应用使用ServiceExtension、DataExtension。

**singleton:是否允许应用安装到单用户下(U0),常驻和自启动需配置。**

**keepAlive:是否允许应用常驻,常驻和自启动需配置。**

![image.png](https://forums-obs.openharmony.c ... asjn6g42z2g2niv.png "image.png")

然后将其推回到机器上

> hdc shell "mount -o remount,rw /"
> hdc file send D:\\install\_list\_capability.json    /etc/app/install\_list\_capability.json

然后重启机器

> hdc shell reboot

记得把配置文件的type改回去改为 **service**

#### 应用安装

因为设置了 singletion 所以需要单用户安装

1. 把Build完成的hap包推入系统中。

   > hdc file send  D:\data\start_run.hap /data
   >
2. 使用bm命令安装应用

> hdc shell "bm install -p /data/start_run.hap -u 0"

3. 重启系统,然后就可以了

> hdc shell reboot

在这里再加一个卸载的命令,卸载这个应用也是需要id的

> hdc shell "bm uninstall -n com.example.start_run -u 0"

#### 总结

因为公司突然要开发OpenHarmony应用,我本来是前端的,顶多开发uniapp,还没接触过原生开发,所以真的花了不少精力来学习,其实总的来说开机自启并不难,主要还是对OpenHarmony了解的不够,花了很多时间去处理应用的权限问题,文档翻了一遍又一遍,好在终于搞定了,新手分享一下经验,文章中肯定有些不太对的地方还望大佬们多多指教。
[/md]
作者: augsooot_ohos    时间: 2024-7-4 11:53
楼主,您好!我按照文章的方式操作了一遍,为什么开机没有启动要开启的应用?
作者: augsooot_ohos    时间: 2024-7-4 12:43
按照上面的操作,怎么不行呢?
作者: lxw775    时间: 2024-7-12 18:07
回复 augsooot_ohos: 首先排查下开机自启的这个应用是否已经后台启动了,然后再核对一下需要自启的应用的 bundleName 包名是否正确
作者: swchen    时间: 2024-8-5 19:45
应用和服务的操作方式是否相同
作者: xiao_zhou    时间: 2024-8-30 19:23
回复 augsooot_ohos: 哥,搞好了吗




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5