#2023盲盒+码# 设备端直装hap的具体方案1:使用包管理API 原创

westinyang
发布于 2023-8-29 07:20
浏览
0收藏

【本文正在参加 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});
  }
}

持续关注

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2024-1-18 16:49:38修改
收藏
回复
举报
回复
    相关推荐