OpenHarmony应用开发技巧 - 应用常驻和自启动配置 原创 精华
概述
文档环境
开发环境:Windows 11
DevEco Studio 版本:DevEco Studio 3.1 Release(3.1.0.500)
SDK 版本:3.2.14.1(Full SDK)
应用模型:Stage
开发板型号:DAYU 200
系统版本:OpenHarmony 3.2.2 Release
功能简介
- OpenHarmony支持包含ServiceExtensionAbility类型模块的应用配置常驻和自启动。
- 常驻和自启动配置是设备厂商根据设备的产品形态为特殊应用定义的特权项。
RK3568的应用特权配置文件源码位于:
vendor/hihope/rk3568/preinstall-config/install_list_capability.json
在系统中位于:
/etc/app/install_list_capability.json
- 本文档将介绍如何修改系统配置项使自己开发的应用可以获得常驻和自启动的能力。临时配置用于测试配置项是否生效,当生效后可将配置信息拷贝到系统源码中,使配置永久生效。
- 本文档创建的ServiceExtensionAbility仅用作演示应用常驻和自启动配置,不可用于正式项目,ServiceExtensionAbility的开发请参考ServiceExtensionAbility介绍。
应用常驻和自启动配置
创建包含ServiceExtensionAbility类型的应用
- 创建新工程ServiceDemo(com.openharmony.servicedemo)
- 修改工程类型为OpenHarmony工程。
修改entry/build-profile.json5文件,targets.runtimeOS为OpenHarmony,并Sync工程。
- 配置自动签名。单击File > Project Structure > Project > SigningConfigs 界面勾选Automatically generate signature ,等待自动签名完成即可,单击OK。
- 在工程Module(entry)对应的ets目录下,右键选择New > Directory,新建一个目录并命名为ServiceExtAbility。
- 在ServiceExtAbility目录,右键选择 New > TypeScript File ,新建一个TypeScript文件并命名为ServiceExtAbility.ts。
- 在ServiceExtAbility.ts文件中,导入ServiceExtensionAbility的依赖包,自定义类继承ServiceExtensionAbility并实现生命周期回调。
import ServiceExtensionAbility from '@ohos.app.ability.ServiceExtensionAbility';
const TAG: string = "[ServiceDemo]";
export default class ServiceExtAbility extends ServiceExtensionAbility {
onCreate(want) {
console.info(TAG, `onCreate, want: ${want.abilityName}`);
}
onRequest(want, startId) {
console.info(TAG, `onRequest, want: ${want.abilityName}`);
}
onConnect(want) {
console.info(TAG, `onConnect, want: ${want.abilityName}`);
return null;
}
onDisconnect(want) {
console.info(TAG, `onDisconnect, want: ${want.abilityName}`);
}
onDestroy() {
console.info(TAG, `onDestroy`);
}
}
- 在工程Module(entry)对应的module.json5配置文件中注册ServiceExtensionAbility,type标签需要设置为“service”,srcEntry标签表示当前ExtensionAbility组件所对应的代码路径。修改module.mainElement为ServiceExtAbility,mainElemen标识当前Module的入口UIAbility名称或者ExtensionAbility名称,常驻和自启动需配置此项为ServiceExtensionAbility对应的名称。
{
"module": {
"mainElement": "ServiceExtAbility",
"extensionAbilities": [
{
"name": "ServiceExtAbility",
"icon": "$media:icon",
"description": "service",
"type": "service",
"exported": true,
"srcEntry": "./ets/ServiceExtAbility/ServiceExtAbility.ts"
}
]
}
}
证书指纹获取
指纹获取有多种方式,此处选用一种较为方便的方式,其他方式可参考OpenHarmony应用开发技巧 - 如何获取证书指纹。
- 在工程中创建新Module,File > New > Module > Empty Ability。一直点击Next 直到创建成功。
- 执行Run > Run 'application'(application为新创建Module的名称),新创建的Module 的HAP包被安装到系统中。
- 执行以下命令打印出HAP的finger 信息,然后删除新创建的Module ,恢复工程。
hdc shell "bm dump -n com.openharmony.servicedemo | grep finger"
480EB53D7568D38BFA686D0550744B499FA798C196705367F01D50F64812F8B8
应用特权配置
- 提取当前系统中的特权配置文件install_list_capability.json ,文件位于/etc/app/ 中。
hdc file recv /etc/app/install_list_capability.json D:\
- 在文档最下面添加应用的信息,以本文档示例工程为例。其中:
bundleName:应用包名。
app_signature:上一章节获取的证书指纹。
allowAppUsePrivilegeExtension:是否允许应用使用ServiceExtension、DataExtension。
singleton:是否允许应用安装到单用户下(U0),常驻和自启动需配置。
keepAlive:是否允许应用常驻,常驻和自启动需配置。
- 将特权配置文件install_list_capability.json 推送回系统中,覆盖系统配置。
hdc shell "mount -o remount,rw /"
hdc file send D:\install_list_capability.json /etc/app/install_list_capability.json
- 重启系统特权配置文件生效。
hdc shell reboot
安装常驻和自启动应用
由于常驻和自启动应用只有单用户应用才可以配置,所以需要特殊的安装方式进行安装。
- 检查设备中是否有已安装过的应用,并检查安装userId。
hdc shell "bm dump -n com.openharmony.servicedemo | grep userId"
- 如果userId显示为0则是单用户,显示为大于100的数字,则为其他用户安装,需要卸载。
hdc shell "bm uninstall -n com.openharmony.servicedemo"
- 把Build完成的hap包推入系统中。
hdc file send D:\Code\DevEcoStudioProjects\ServiceDemo\entry\build\default\outputs\default\entry-default-signed.hap /data/ServiceDemo.hap
- 使用bm命令安装应用。
hdc shell "bm install -p /data/ServiceDemo.hap -u 0"
- 重启系统,验证功能。
hdc shell reboot
- 设备重启后,通过ps -ef 指令过滤包名,查看应用是否已经启动。
hdc shell "ps -ef | grep com.openharmony.servicedemo"
参考文档
OpenHarmony Docs - ServiceExtensionAbility
OpenHarmony Docs - 应用特权配置指南
个人平时除了办公软件基本都不会给自启的权限,想知道一般还有哪些应用需要自启
OpenHarmony的自启场景目前应用于系统预制应用,例如SystemUI和Launcher等等。同时还可应用于例如银行柜员机需开机默认启动一个银行应用,电视盒子的开机广告等场景。
没想到开机广告也用的是这个
安卓即使运行后台运行也常常被杀,不知道鸿蒙是不是这样
userId显示为0则是单用户,显示大于100为其他用户,这里的单用户和其他用户有什么区别?
单用户是指具备有root权限的管理员账号吗?
其他用户是指普通用户账号吗?
目前3.2 release上预置了几种账号?谢谢
OpenHarmony目前仅在内存不足的情况下会主动杀死常驻应用,但是即便杀死也会被重新拉起。
单用户与root权限无关,单用户所安装的应用可以在其他所有用户的环境中运行,但单用户无法登录,而其他用户安装的应用仅可在对应的用户下运行和可见。目前3.2Release版本默认有2种账号,1个单用户id为0,一个其他用户id为100。
这点太实用了
如果设置应用自启后,如何实现达到某个条件后设置为不自启
好像现在没有办法阻止设置达到条件后应用不自启
请问这个自启动是前台自启动吗?