鸿蒙南向开发实战:系统参数

201 篇文章 1 订阅
126 篇文章 0 订阅

OHOS系统参数为各系统服务提供简单易用的键值对访问接口,使得各个系统服务可以通过各自的系统参数来进行业务功能的配置。

基本概念

图1 系统参数操作原语

系统参数操作原语

表1 系统参数操作原语说明 | 功能 | 说明 | | -------- | -------- | | get | 获取系统参数的值 | | set | 设置系统参数的值 | | wait | 同步等待系统参数的值变更 | | watch | 异步观察系统参数的值变更 |

系统参数定义
  • 系统参数命名格式

    系统参数名称采用点分格式,由多段组成,每一段可以由字母、数字、下划线组成,总长度不超过96字节;系统参数名称分为两类:

    表2 系统参数名称

    类别名称示例说明
    参数名称Parameter Nameconst.product.name完整的系统参数名称,末尾不是"."。
    参数目录Parameter Directoryconst.product .以"."结尾,标识相同前缀的所有系统参数集合。
  • 系统参数类型

    系统参数一共分为三大类:

    表3 系统参数分类

    类别前缀说明
    常量const.常量参数,一旦赋值后续不会再变更;值最大长度为4096字节(包括结束符)。
    可写其它可写参数,重启后丢失,值最大长度96字节(包括结束符)。
    可持久化persist.可写并可持久化保存参数,重启后不会丢失,值最大长度96字节(包括结束符)。

    每个系统参数名称总体格式如下:

    [ const | persist ].$sub_system.$desc

    $sub_system为子系统或模块的名称。

    $desc为子系统或模块下参数的描述字符,可以为点分格式进行分级描述。

系统参数定义规则

每个子系统定义各自模块的系统参数,包括系统参数名称、默认值以及系统参数的权限访问信息。

  • 系统参数值定义文件

    • 系统参数值定义文件后缀名为".para" ,其格式示例如下:

      # This is comment
      const.product.name=OHOS-PRODUCT
      const.os.version.api=26
      const.telephony.enable=false|true
      
      const.test.withblank=My Value
      const.test.withcomment=MyValue # This should be ommitted
      const.test.multiline="This is a multiline parameter.
      Line2 value.
      Last line."
    • 系统参数必须通过完整的系统参数命令来赋值,赋值方式分为三大类:

      表4 系统参数赋值方式

      类别示例说明
      字符串const.product.name=OHOS-PRODUCT多行字符串需要通过引号扩起来。
      数字const.os.version.api=26数字不需要。
      布尔const.telephony.enable=false布尔型的可以为0,1,false,true。
  • 系统参数DAC访问控制定义文件

    当前系统参数的访问权限控制通过自主访问控制(Discretionary Access Control)方式管理,访问权限定义文件后缀名为".para.dac" ,示例如下:

    const.product.="root:root:660"

    如上所示,可以通过参数路径为相同前缀的所有系统参数定义一类访问权限信息;DAC信息通过":"分三段来描述,分别为参数的user,group以及UGO规则信息。

    UGO规则信息每一位的定义如下:

    图2 UGO规则信息

    UGO规则信息

  • 系统参数配置selinux策略

    • 添加selinux标签

      为系统参数添加selinux标签,首先需要在文件/base/security/selinux/sepolicy/base/public/parameter.te中定义标签,例如:

      type servicectrl_param, parameter_attr

      标签定义完成后,在文件/base/security/selinux/sepolicy/base/public/parameter_contexts中添加和标签关联的系统参数前缀,这里以前缀ohos.servicectrl.为例:

      ohos.servicectrl.           u:object_r:servicectrl_param:s0
    • 给init授权,允许map等操作,在文件/base/security/selinux/sepolicy/ohos_policy/startup/init/public/init.te中补充下面内容:

      allow servicectrl_param tmpfs:filesystem associate;
      allow init servicectrl_param:file { map open read relabelto relabelfrom };
    • 设置写权限,这里允许init samgr hdf_devmgr 进行系统参数写:

      allow { init samgr hdf_devmgr } servicectrl_param:parameter_service { set };
    • 设置读权限,如果只允许部分进程访问可单独对该进程授权:

      allow { xxx } servicectrl_param:file { map open read };
    • 如果全部允许,则设置为:

      allow { domain -limit_domain } servicectrl_param:file { map open read };
  • 建议:

    各个子系统只保留两个系统参数标签:

    一个私有,用来控制系统参数设置

    一个公有,允许所有服务进行访问

  • 默认参数加载

    系统参数的加载顺序如下:

    表5 系统参数加载顺序

    类别路径说明
    内核参数/proc/cmdline将内核参数中的部分值转化成系统参数,并保存。内核参数中.xxx=valXXX类型的参数都转换成ohos.boot.xxx=valXXX系统参数。
    OS系统参数/system/etc/param/ohos_const/*.paraOS固定系统参数值参数优先加载。
    vendor参数/vendor/etc/param/*.para厂商定义的系统参数次优先级加载。
    system参数/system/etc/param/*.para加载各子系统定义的参数参数。如果系统参数已经存在,则忽略掉。
    persist参数/data/parameters/如果持久化参数存在,则最后加载持久化系统参数。持久化系统参数会覆盖加载的默认系统参数。
系统参数标签文件大小配置

如果标签对应的系统参数个数多,超过5条时,需要配置系统参数标签文件的大小,默认大小(512),配置文件为/base/startup/init/services/etc/param/ohos.para.size

配置规则:

系统参数标签=大小

例如:

startup_init_param=40960

约束与限制

仅限小型系统、标准系统下使用。

开发指导

场景介绍

设定特定的系统参数

接口说明

  • Shell命令接口

    通过shell命令中可直接操作系统参数(只在标准系统提供)。系统参数shell命令如下表所示:

    表6 系统参数shell命令说明

    功能说明
    param get [key]获取指定key名称的系统参数值;如果不指定任何name,则返回所有系统参数值。
    param set key value设置指定key名称的参数值为value。
    param wait key value同步等待指定key名称的系统参数值与value匹配。value可支持模糊匹配,如""表示任何值,"val\"表示只匹配前三个val字符。
    param watch异步观察系统参数的值变更。
  • syspara系统接口

    在Coding中可以调用下列函数接口,获取对应的系统参数值(系统参数接口返回的为const字符串,不支持free操作)。

    表7 系统属性接口说明

    接口名描述
    int GetParameter(const char* key, const char* def, char* value, unsigned int len)获取系统参数。
    int SetParameter(const char* key, const char* value)设置/更新系统参数。
    const char* GetDeviceType(void)返回当前设备类型。
    const char* GetManufacture(void)返回当前设备生产厂家信息。
    const char* GetBrand(void)返回当前设备品牌信息。
    const char* GetMarketName(void)返回当前设备传播名。
    const char* GetProductSeries(void)返回当前设备产品系列名。
    const char* GetProductModel(void)返回当前设备认证型号。
    const char* GetSoftwareModel(void)返回当前设备内部软件子型号。
    const char* GetHardwareModel(void)返回当前设备硬件版本号。
    const char* GetHardwareProfile(void)返回当前设备硬件profile。
    const char* GetSerial(void)返回当前设备序列号(SN号)。
    const char* GetOSFullName(void)返回操作系统名。
    const char* GetDisplayVersion(void)返回当前设备用户可见的软件版本号。
    const char* GetBootloaderVersion(void)返回当前设备Bootloader版本号。
    const char* GetSecurityPatchTag(void)返回安全补丁标签。
    const char* GetAbiList(void)返回当前设备支持的指令集(Abi)列表。
    int GetSdkApiVersion(void)返回与当前系统软件匹配的SDK API 版本号。
    int GetFirstApiVersion(void)返回系统软件首版本SDK API 版本号。
    const char* GetIncrementalVersion(void)返回差异版本号。
    const char* GetVersionId(void)返回版本id。
    const char* GetBuildType(void)返回构建类型。
    const char* GetBuildUser(void)返回构建账户用户名。
    const char* GetBuildHost(void)返回构建主机名。
    const char* GetBuildTime(void)返回构建时间。
    const char* GetBuildRootHash(void)返回当前版本hash。
    const char* GetOsReleaseType(void)返回系统发布类型。
    int GetDevUdid(char *udid, int size)获取设备udid。
    const char *AclGetSerial(void);返回当前设备序列号(SN号)(带访问权限检查)。
    int AclGetDevUdid(char *udid, int size);获取设备udid(带访问权限检查)。

开发步骤

  1. 系统参数定义

    通过定义子系统或者产品的.para和.para.dac文件,实现默认系统参数的定义和权限控制。

    ​ 在标准系统上通过ohos_prebuilt_para模版安装配置文件到到/etc/param/目录下,GN脚本示例如下:

    import("//base/startup/init/services/etc/param/param_fixer.gni")
    
    ohos_prebuilt_para("ohos.para") {
        source = "//base/startup/init/services/etc/ohos.para"
        part_name = "init"
        module_install_dir = "etc/param"
    }
    
    ohos_prebuilt_para("ohos.para.dac") {
        source = "//base/startup/init/services/etc/ohos.para.dac"
        part_name = "init"
        module_install_dir = "etc/param"
    }

    在小系统上,通过copy命令,把对应的系统参数定义文件拷贝到system/etc/param目录下

    copy("ohos.para") {
      sources = [ "//base/startup/init/services/etc/param/ohos.para" ]
      outputs = [ "$root_out_dir/system/etc/param/ohos.para" ]
    }
    copy("ohos.para.dac") {
      sources = [ "//base/startup/init/services/etc/param/ohos.para.dac" ]
      outputs = [ "$root_out_dir/system/etc/param/ohos.para.dac" ]
    }

    在mini系统上,通过action把所有定义的默认系统参数转化成头文件,并编译到系统中

    action("lite_const_param_to") {
      script = "//base/startup/init/scripts/param_cfg_to_code.py"
      args = [
        "--source",
        rebase_path(
            "//base/startup/init/services/etc_lite/param/ohos_const/ohospara"),
        "--dest_dir",
        rebase_path("$root_out_dir/gen/init/"),
        "--priority",
        "0",
      ]
      outputs = [ "$target_gen_dir/${target_name}_param_cfg_to_code.log" ]
    }
  2. 系统参数使用实例

    // set && get
    char key1[] = "rw.sys.version";
    char value1[] = "10.1.0";
    int ret = SetParameter(key1, value1);
    char valueGet1[128] = {0};
    ret = GetParameter(key1, "version=10.1.0", valueGet1, 128);
    
    // get sysparm
    char* value1 = GetDeviceType();
    printf("Product type =%s\n", value1);
    
    char* value2 = GetManufacture();
    printf("Manufacture =%s\n", value2);
    
    char* value3 = GetBrand();
    printf("GetBrand =%s\n", value3);
    
    char* value4 = GetMarketName();
    printf("MarketName =%s\n", value4);
    
    char* value5 = GetProductSeries();
    printf("ProductSeries =%s\n", value5);
    
    char* value6 = GetProductModel();
    printf("ProductModel =%s\n", value6);
    
    char* value7 = GetSoftwareModel();
    printf("SoftwareModel =%s\n", value7);
    
    char* value8 = GetHardwareModel();
    printf("HardwareModel =%s\n", value8);
    
    char* value9 = GetHardwareProfile();
    printf("Software profile =%s\n", value9);
    
    char* value10 = GetSerial();
    printf("Serial =%s\n", value10);
    
    char* value11 = GetOSFullName();
    printf("OS name =%s\n", value11);
    
    char* value12 = GetDisplayVersion();
    printf("Display version =%s\n", value12);
    
    char* value13 = GetBootloaderVersion();
    printf("bootloader version =%s\n", value13);
    
    char* value14 = GetSecurityPatchTag();
    printf("secure patch level =%s\n", value14);
    
    char* value15 = GetAbiList();
    printf("abi list =%s\n", value15);
    
    int value16 = GetFirstApiVersion();
    printf("first api level =%d\n", value16);
    
    char* value17 = GetIncrementalVersion();
    printf("Incremental version = %s\n", value17);
    
    char* value18 = GetVersionId();
    printf("formal id =%s\n", value18);
    
    char* value19 = GetBuildType();
    printf("build type =%s\n", value19);
    
    char* value20 = GetBuildUser();
    printf("build user =%s\n", value20);
    
    char* value21 = GetBuildHost();
    printf("Build host = %s\n", value21);
    
    char* value22 = GetBuildTime();
    printf("build time =%s\n", value22);
    
    char* value23 = GetBuildRootHash();
    printf("build root later..., %s\n", value23);
    
    char* value24 = GetOsReleaseType();
    printf("OS release type =%s\n", value24);
    
    char* value25 = GetOsReleaseType();
    printf("OS release type =%s\n", value25);
    
    char value26[65] = {0};
    GetDevUdid(value26, 65);
    printf("device udid =%s\n", value26);

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料

 获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(HarmonyOS NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

 有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

  • 19
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值