回复
#2023盲盒+码# 设备端直装hap的具体方案1:使用包管理API 原创
westinyang
发布于 2023-8-29 07:20
浏览
1收藏
【本文正在参加 2023「盲盒」+码有奖征文活动】 https://ost.51cto.com/posts/25284
@toc
关于作者:I’m westinyang
序言
之前在《OpenHarmony设备直装hap脱离电脑hdc的两种实现思路》一文中,我提到了两种实现直装hap的思路,那本篇文章我将详细讲解下第一种思路的具体实现方式,至于第二种另辟蹊径的实现思路,我会在后续的文章中继续分享实现原理。
第一种思路是用到了官方的包管理模块的API,由于包管理的installer模块接口的权限,需要 ohos.permission.INSTALL_BUNDLE
system_core
级别的系统权限,所以我们需要配置项目权限和访问控制权限
项目权限配置
entry/src/main/module.json5
{
"name": "ohos.permission.INSTALL_BUNDLE",
},
访问控制权限配置
openharmony-sdk\9\toolchains\lib\UnsgnedReleasedProfileTemplate.json
"apl":"system_core",
"app-feature":"hos_system_app"
安装应用
- hap包要放到设备真实路径:
/data/app/el2/用户ID/base/应用包名/haps/entry/files/
- hapFilePaths写沙箱路径:
/data/storage/el2/base/haps/entry/files/
import installer from '@ohos.bundle.installer';
import promptAction from '@ohos.promptAction';
function installApp() {
let hapFilePaths = ['/data/storage/el2/base/haps/entry/files/testapp.hap'];
let installParam = {
userId: 100,
isKeepData: false,
installFlag: 1,
};
try {
installer.getBundleInstaller().then(data => {
data.install(hapFilePaths, installParam, err => {
if (err) {
console.error('install failed:' + err.message);
promptAction.showToast({message: '安装失败:' + err.message, duration: ToastDuration});
} else {
console.info('install successfully.');
promptAction.showToast({message: '安装成功', duration: ToastDuration});
}
});
}).catch(error => {
console.error('getBundleInstaller failed. Cause: ' + error.message);
promptAction.showToast({message: '安装失败:' + error.message, duration: ToastDuration});
});
} catch (error) {
console.error('getBundleInstaller failed. Cause: ' + error.message);
promptAction.showToast({message: '安装失败:' + error.message, duration: ToastDuration});
}
}
打开应用
指定包名和abilityName,调用context.startAbility打开目标应用
import common from '@ohos.app.ability.common';
import promptAction from '@ohos.promptAction';
function openApp() {
let context = getContext(this) as common.UIAbilityContext;
context.startAbility({
bundleName: 'com.example.testapp',
abilityName: 'EntryAbility',
moduleName: ''
}).then(() => {
console.error('startApplication promise success');
promptAction.showToast({message: '打开成功', duration: ToastDuration});
}, (err) => {
console.error(`startApplication promise error: ${JSON.stringify(err)}`);
promptAction.showToast({message: '打开失败:应用不存在', duration: ToastDuration});
});
}
卸载应用
指定包名和参数卸载应用
import installer from '@ohos.bundle.installer';
import promptAction from '@ohos.promptAction';
function uninstallApp() {
let bundleName = 'com.example.testapp';
let installParam = {
userId: 100,
isKeepData: false,
installFlag: 1
};
try {
installer.getBundleInstaller().then(data => {
data.uninstall(bundleName, installParam, err => {
if (err) {
console.error('uninstall failed:' + err.message);
promptAction.showToast({message: '卸载失败:应用不存在', duration: ToastDuration});
} else {
console.info('uninstall successfully.');
promptAction.showToast({message: '卸载成功', duration: ToastDuration});
}
});
}).catch(error => {
console.error('getBundleInstaller failed. Cause: ' + error.message);
promptAction.showToast({message: '卸载失败:' + error.message, duration: ToastDuration});
});
} catch (error) {
console.error('getBundleInstaller failed. Cause: ' + error.message);
promptAction.showToast({message: '卸载失败:' + error.message, duration: ToastDuration});
}
}
持续关注
- 关于作者:I’m westinyang
- 哔哩哔哩:个人主页
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2024-1-18 16:49:38修改
赞
收藏 1
回复
相关推荐