系统用户无法安装应用问题分析报告

openharmony_learner openharmony_learner 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

1 关键字

OpenHarmony,系统用户,应用,安装

2 问题描述

环境:OpenHarmony 3.2 Beta2 及以后

问题现象:系统启动后无法通过bm安装应用到系统用户下

3 问题原因

在应用配置app.json5中配置相关设置如下:

{
    ...
    "singleton": true,
    ...
}

使用系统用户安装应用,执行命令:

bm install -u 0 -p /data/LogMonitor-default-signed.hap

3.1 正常机制

安装应用返回成功信息:

install bundle successfully.

3.2 异常机制

安装应用返回失败信息:

error: failed to install bundle.
error: install failed due to zero user can only install singleton app

4 解决方案

删除foundation/bundlemanager/bundle_framework/services/bundlemgr/src/module_profile.cpp文件中的预装应用条件项,只判断当应用为系统应用时,允许系统用户安装应用。修改后源码如下:

bool ToApplicationInfo(const Profile::ModuleJson &moduleJson, ApplicationInfo &applicationInfo,
    bool isPreInstallApp, const BundleExtractor &bundleExtractor)
{
    ...
    if (applicationInfo.isSystemApp) {
        applicationInfo.keepAlive = app.keepAlive;
        applicationInfo.singleton = app.singleton;
        applicationInfo.userDataClearable = app.userDataClearable;
        if (app.removable.first) {
            applicationInfo.removable = app.removable.second;
        } else {
            applicationInfo.removable = false;
        }
        applicationInfo.accessible = app.accessible;
    }
    ...
}

通过以上修改后安装的系统,可以使用系统用户安装应用。

5 定位过程

  1. 安装应用时,捕获错误日志信息

img

  1. 通过报错信息定位源码位置位于foundation/bundlemanager/bundle_framework/services/bundlemgr/src/base_bundle_installer.cpp的InnerProcessBundleInstall方法执行时返回错误信息。
ErrCode BaseBundleInstaller::InnerProcessBundleInstall(std::unordered_map<std::string, InnerBundleInfo> &newInfos,
    InnerBundleInfo &oldInfo, const InstallParam &installParam, int32_t &uid)
{
    ···
    // singleton app can only be installed in U0 and U0 can only install singleton app.
    bool isSingleton = newInfos.begin()->second.IsSingleton();
    if ((isSingleton && (userId_ != Constants::DEFAULT_USERID)) ||
        (!isSingleton && (userId_ == Constants::DEFAULT_USERID))) {
        APP_LOGW("singleton(%{public}d) app(%{public}s) and user(%{public}d) are not matched.",
            isSingleton, bundleName_.c_str(), userId_);
        return ERR_APPEXECFWK_INSTALL_ZERO_USER_WITH_NO_SINGLETON;
    }
    ···
}
  1. 通过源码得知,系统用户安装应用需要设置singleton配置为true,才可继续安装。

  2. 根据逻辑向上寻找在foundation/bundlemanager/bundle_framework/services/bundlemgr/src/module_profile.cpp的ToApplicationInfo中设置singleton的参数值。

bool ToApplicationInfo(const Profile::ModuleJson &moduleJson, ApplicationInfo &applicationInfo,
    bool isPreInstallApp, const BundleExtractor &bundleExtractor)
{
    ...
    if (applicationInfo.isSystemApp && isPreInstallApp) {
        applicationInfo.keepAlive = app.keepAlive;
        applicationInfo.singleton = app.singleton;
        applicationInfo.userDataClearable = app.userDataClearable;
        if (app.removable.first) {
            applicationInfo.removable = app.removable.second;
        } else {
            applicationInfo.removable = false;
        }
        applicationInfo.accessible = app.accessible;
    }
    ...
}
  1. 查看ToApplicationInfo方法,发现只有当应用为系统应用且为预装应用时才会设置singleton参数。

6 知识分享

应用在签名时设置P7b生成json文件的app-feature项参数为ohos_system_app或hos_system_app后,签名安装的应用会被认定为系统应用。

...全文

相关推荐

多用户之分身用户如何同步安装主用户中已安装的应用?

多用户之分身用户是如何同步安装主用户中已经安装的应用的? 这个问题是最近工作中遇到的一个问题引出的,问题背景如下: 系统设置开启微信分身后,手机安装并设置第三方输入法(如:搜狗输入法)为当前输入法,打开微信,发现主微信中使用的是设置的第三方输入法(搜狗输入法),而微信分身中的使用的输入法是系统默认的百度输入法,两个的输入法不同步问题。 在这个问题背景的牵引下,分析发现,是第三方输入法(搜狗舒服发)在分身用户下没有被安装。 我们先去看下如何创建分身用户的? 创建分身用户的代码接口在哪里? 见: framewo

Coco0912

Windows10下安装Oracle19c提示“无法将 **\** 安装用户添加到 ** 组“解决办法

解决:本机在安装Oracle19c提示`无法将 ZHOUQUAN\zhouquan 安装用户添加到 %2% 组。`

徐州蔡徐坤

麒麟系统无法进入单用户模式,如何解决?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

bug菌¹

解决Android U上应用无法安装问题

最近在做Android U的升级项目,有一款跑分软件A1 SD Bench在U以前的平台可以安装,但是在U上无法安装,显示:This app isn\'t compatible with your TV.方案一、修改应用的targetSdkVersion>23。

今天也是星期五

通信行业基于MongoDB的安全合规与性能优化:5G时序数据处理、可查询加密及窗口函数应用

内容概要:本文围绕MongoDB在通信行业的深度应用,系统讲解了可查询加密、时间序列集合、窗口函数与性能诊断四大核心技术。通过详实的代码案例,展示了如何利用可查询加密实现敏感数据合规存储与查询,使用时序集合高效处理5G网络KPI等高频写入场景,借助窗口函数进行经营指标的趋势分析,并结合explain()与查询分析器完成性能调优。文章还涵盖分片一致性检查、索引优化等运维实践,全面覆盖通信系统对安全、性能与扩展性的严苛要求。; 适合人群:具备一定数据库基础,从事通信行业研发、架构或运维工作1-3年的技术人员,尤其是参与5G网络监控、客户数据管理或大数据平台建设的相关人员。; 使用场景及目标:① 实现用户手机号、身份证等敏感信息的加密存储与等值查询,满足安全合规要求;② 构建高吞吐、低延迟的5G基站KPI时序数据存储与分析系统;③ 在数据库层直接完成滑动平均、累计求和等经营分析,减少应用层计算负担;④ 诊断慢查询、验证索引有效性,保障系统高性能运行。; 阅读建议:此资源强调理论与实战结合,建议读者在本地或测试环境部署MongoDB 7.0+版本,动手复现文中代码,重点关注schemaMap配置、时序集合参数选择与窗口函数语法细节,并结合explain执行计划理解底层优化机制,从而真正掌握通信级数据架构的设计精髓。

数智顾问
评论
收藏 已收藏
分享
返回顶部