
回复
【本文正在参加 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"
/data/app/el2/用户ID/base/应用包名/haps/entry/files/
/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});
}
}