鸿蒙Harmony南向开发子系统适配

打印 上一主题 下一主题

主题 1013|帖子 1013|积分 3039

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  OpenHarmony子系统适配一样平常包含两部分:



  • 在config.json中增加对应子系统和部件,这样编译系统会将该部件纳入编译目标中。
  • 针对该部件的HAL层接口进行硬件适配,大概可选的软件功能适配。
分布式软总线子系统适配

wifi_lite部件适配

起首,在config.json文件中,增加communication子系统的wifi_lite部件,如下:
  1.   {
  2.       "subsystem": "communication",
  3.       "components": [
  4.         {
  5.           "component": "wifi_lite",
  6.           "optional": "true"
  7.         }
  8.       ]
  9.     },
复制代码
wifi_lite部件在//build/lite/components/communication.json文件中,形貌如下:
  1.     {
  2.       "component": "wifi_lite",
  3. ……
  4.       "targets": [
  5.         "//foundation/communication/wifi_lite:wifi"                 --- wifi_lite的编译目标
  6.       ],
  7. ……
  8.     },
复制代码
在//foundation/communication/wifi_lite/BUILD.gn文件中,形貌须要适配的接口头文件路径,如下:
  1. config("include") {
  2.   include_dirs = [ "interfaces/wifiservice" ]         --- 因为wifi_lite只提供头文件,不提供wifi的具体实现,所以wifi模块暴露出适配的目录路径提供给硬件厂商来适配,厂商提供wifi协议栈源码实现。
  3. }
  4. group("wifi") {
  5.   public_configs = [ ":include" ]
  6. }
复制代码
由于在本案例中,wifi属于SoC提供的功能,以是适配源码放在SoC的//device/soc/bestechnic/hals/communication/wifi_lite/wifiservice目次下,包含wifi_device.c和wifi_hotspot.c分别适配wifi_device.h和wifi_hotspot.h。如下:
  1. ……
  2. WifiErrorCode Scan(void)         --- wifi_device.c中扫描wifi热点的函数,对wifi_device.h中Scan函数的适配实现
  3. {
  4.     WifiErrorCode ret = ERROR_WIFI_BUSY;
  5.     if (IsWifiActive() != WIFI_STA_ACTIVE)
  6.         return ERROR_WIFI_IFACE_INVALID;
  7.     if (g_HalHmosWifiInfo.scan_state == SCAN_REQUEST ||
  8.         g_HalHmosWifiInfo.scan_state == SCAN_TRIGGER)
  9.         return ERROR_WIFI_BUSY;
  10.     HalHmosWifiLock();
  11.     ret = ((HalHmosSendEvent(HMOS_ON_WIFI_SCAN_STATE_CHANGED, NULL) == 0) ? WIFI_SUCCESS : ERROR_WIFI_BUSY);
  12.     HalHmosWifiUnLock();
  13.     return ret;
  14. }
  15. ……
  16. int GetSignalLevel(int rssi, int band)         --- wifi_hotspot.c中获取wifi信号热点函数,对wifi_hotspot.h中GetSignalLevel函数的适配实现。
  17. {
  18.     if (band == HOTSPOT_BAND_TYPE_2G) {
  19.         if (rssi >= RSSI_LEVEL_4_2_G)
  20.             return RSSI_LEVEL_4;
  21.         if (rssi >= RSSI_LEVEL_3_2_G)
  22.             return RSSI_LEVEL_3;
  23.         if (rssi >= RSSI_LEVEL_2_2_G)
  24.             return RSSI_LEVEL_2;
  25.         if (rssi >= RSSI_LEVEL_1_2_G)
  26.             return RSSI_LEVEL_1;
  27.     }
  28.     if (band == HOTSPOT_BAND_TYPE_5G) {
  29.         if (rssi >= RSSI_LEVEL_4_5_G)
  30.             return RSSI_LEVEL_4;
  31.         if (rssi >= RSSI_LEVEL_3_5_G)
  32.             return RSSI_LEVEL_3;
  33.         if (rssi >= RSSI_LEVEL_2_5_G)
  34.             return RSSI_LEVEL_2;
  35.         if (rssi >= RSSI_LEVEL_1_5_G)
  36.             return RSSI_LEVEL_1;
  37.     }
  38.     return ERROR_WIFI_INVALID_ARGS;
  39. }
复制代码
LWIP部件适配

LiteOS-M kernel目次下默认配置了lwip,因而具有编译功能,可以在kernel组件中指定lwip编译的目次。如下:
  1.    {
  2.       "subsystem": "kernel",
  3.       "components": [
  4.         {
  5.           "component": "liteos_m",
  6.           "features": [
  7.             "ohos_kernel_liteos_m_lwip_path = "//device/soc/bestechnic/bes2600/liteos_m/components/net/lwip-2.1""                 --- 指定在芯片厂商目录中进行适配
  8.           ]
  9.         }
  10.       ]
  11.     },
复制代码
在//device/soc/bestechnic/bes2600/liteos_m/components/net/lwip-2.1/BUILD.gn文件中,形貌了lwip的编译,如下:
  1. import("//kernel/liteos_m/liteos.gni")
  2. import("$LITEOSTHIRDPARTY/lwip/lwip.gni")
  3. import("$LITEOSTOPDIR/components/net/lwip-2.1/lwip_porting.gni")
  4. module_switch = defined(LOSCFG_NET_LWIP_SACK)
  5. module_name = "lwip"
  6. kernel_module(module_name) {
  7.   sources = LWIP_PORTING_FILES + LWIPNOAPPSFILES -
  8.             [ "$LWIPDIR/api/sockets.c" ] + [ "porting/src/ethernetif.c" ]                 --- 增加ethernetif.c文件,用以适配ethernet网卡的初始化适配
  9.   defines = [ "LITEOS_LWIP=1" ]
  10.   defines += [ "CHECKSUM_BY_HARDWARE=1" ]
  11. }
  12. config("public") {
  13.   defines = [ "_BSD_SOURCE=1" ]
  14.   include_dirs =
  15.       [ "porting/include" ] + LWIP_PORTING_INCLUDE_DIRS + LWIP_INCLUDE_DIRS
  16. }
复制代码
在//device/soc/bestechnic/bes2600/liteos_m/components/net/lwip-2.1/porting/include/lwip/lwipopts.h文件中,说明原有lwip配置选项保持不变,软总线会依赖这些配置选项,并且新增硬件适配的配置项,如下:
  1. #ifndef _PORTING_LWIPOPTS_H_
  2. #define _PORTING_LWIPOPTS_H_
  3. #include_next "lwip/lwipopts.h"                                 --- 保持原来的配置项不变
  4. #define LWIP_NETIF_STATUS_CALLBACK      1
  5. #define LWIP_CHECKSUM_ON_COPY           0
  6. #define CHECKSUM_GEN_UDP                0         --- 新增硬件适配选项
  7. #endif /* _PORTING_LWIPOPTS_H_ */
复制代码
在//device/soc/bestechnic/bes2600/liteos_m/components/net/lwip-2.1/porting/src/ethernetif.c文件中,说明对ethernet网卡初始化的适配,如下:
  1. err_t
  2. ethernetif_init(struct netif *netif)
  3. {
  4. ……
  5. #ifdef CHECKSUM_BY_HARDWARE
  6.     eth_hw_checksum_init();
  7. #endif
  8. ……
  9.     netif->linkoutput = low_level_output;
  10.     netif->drv_send = liteos_low_level_output;
  11.     netif->hwaddr_len = NETIF_MAX_HWADDR_LEN;
  12.     low_level_init(netif);
  13.     driverif_init(netif);
  14.     return ERR_OK;
  15. ……
  16. }
复制代码
dsoftbus部件适配

在config.json中增加dsoftbus部件配置如下:
  1. {
  2.   "component": "dsoftbus",
  3.   "features": [
  4.     "softbus_adapter_config = "//vendor/bestechnic/mini_distributed_music_player/dsoftbus_lite_config""
  5.   ]
  6. },
复制代码
dsoftbus部件在//foundation/communication/dsoftbus/dsoftbus.gni文件中提供了softbus_adapter_config配置选项可供移植过程进行配置,该配置设定了软总线移植适配的路径。
在本案例中,softbus_adapter_config配置为//vendor/bestechnic/mini_distributed_music_player/dsoftbus_lite_config路径,该路径下的内容为:
  1. .
  2. ├── feature_config                                        --- 软总线功能特性配置,例如是否开启自发现功能等
  3. │   └── mini
  4. │       └── config.gni
  5. └── spec_config                                                --- 软总线规格特性配置,例如设置软总线日志级别设置
  6.     ├── softbus_config_adapter.c
  7.     ├── softbus_config_adapter.h
  8.     └── softbus_config_type.h
复制代码
在config.gni文件中规定了以下配置项:
配置项形貌dsoftbus_feature_disc_ble是否开启BLE发现功能dsoftbus_feature_disc_coap是否开启COAP发现功能dsoftbus_feature_conn_tcp是否开启TCP连接功能dsoftbus_feature_conn_br是否开启BR连接功能dsoftbus_feature_conn_ble是否开启BLE连接功能dsoftbus_feature_conn_p2p是否开启P2P连接功能dsoftbus_feature_trans_udp是否开启UDP传输功能dsoftbus_feature_trans_udp_stream是否开启UDP传输流功能dsoftbus_feature_trans_udp_file是否开启UDP传输文件功能dsoftbus_feature_ip_auth是否开启认证传输通道功能dsoftbus_feature_auth_account是否开启基于账号认证功能dsoftbus_feature_qos是否开启QoS功能 在softbus_config_adapter.c文件中规定了以下配置项:
配置项形貌SOFTBUS_INT_MAX_BYTES_LENGTHSendBytes发送最大Bytes长度SOFTBUS_INT_MAX_MESSAGE_LENGTHSendMessage发送最大消息的长度SOFTBUS_INT_CONN_BR_MAX_DATA_LENGTH蓝牙最大接收数据量SOFTBUS_INT_CONN_RFCOM_SEND_MAX_LEN蓝牙最大接收数据量SOFTBUS_INT_ADAPTER_LOG_LEVEL日志级别设置SOFTBUS_STR_STORAGE_DIRECTORY存储目次设置 由于软总线配置了后,不会默认启动,以是须要在通过启动框架调用InitSoftBusServer函数,如下:
  1. static void DSoftBus(void)
  2. {
  3.     osThreadAttr_t attr;
  4.     attr.name = "dsoftbus task";
  5.     attr.attr_bits = 0U;
  6.     attr.cb_mem = NULL;
  7.     attr.cb_size = 0U;
  8.     attr.stack_mem = NULL;
  9.     attr.stack_size = 65536;
  10.     attr.priority = 24;
  11.     extern void InitSoftBusServer(void);
  12.     if (osThreadNew((osThreadFunc_t) InitSoftBusServer, NULL, &attr) == NULL) {
  13.         printf("Failed to create WifiSTATask!\n");
  14.     }
  15. }
  16. APP_FEATURE_INIT(DSoftBus);
复制代码
RPC部件适配

在config.json中增加rpc部件配置如下:
  1. {
  2.   "component": "rpc"
  3. },
复制代码
同样地,rpc部件须要通过启动框架调用StartDBinderService函数,由于该函数正常运行依赖主机已经获取IP地址,因此在LWIP协议栈注册IP地址变化变乱的回调函数中调用该函数,如下:
  1. static void RpcServerWifiDHCPSucCB(struct netif *netif, netif_nsc_reason_t reason,
  2.                                    const netif_ext_callback_args_t *args)
  3. {
  4.     (void) args;
  5.     if (netif == NULL) {
  6.         printf("%s %d, error: input netif is NULL!\n", __FUNCTION__, __LINE__);
  7.         return;
  8.     }
  9.     if (reason == LWIP_NSC_IPSTATUS_CHANGE) {
  10.         if (netif_is_up(netif) && !ip_addr_isany(&netif->ip_addr)) {
  11.             printf("%s %d, start rpc server!\n", __FUNCTION__, __LINE__);
  12.             StartDBinderService();
  13.         }
  14.     }
  15. }
  16. static void WifiDHCPRpcServerCB(void)
  17. {
  18.     NETIF_DECLARE_EXT_CALLBACK(WifiReadyRpcServerCallback);
  19.     netif_add_ext_callback(&WifiReadyRpcServerCallback, RpcServerWifiDHCPSucCB);
  20. }
  21. APP_FEATURE_INIT(WifiDHCPRpcServerCB);
复制代码
启动恢复子系统适配

启动恢复子系统适配bootstrap_lite/syspara_lite两个部件。请在vendor/bestechnic_bak/display_demo/config.json中新增对应的配置选项。
  1. {
  2.   "subsystem": "startup",
  3.   "components": [
  4.         {
  5.           "component": "bootstrap_lite"                 --- bootstrap_lite 部件
  6.         },
  7.         {
  8.           "component": "syspara_lite",                 --- syspara_lite 部件
  9.           "features": [
  10.                 "enable_ohos_startup_syspara_lite_use_posix_file_api = true"
  11.           ]
  12.         }
  13.   ]
  14. },
复制代码
适配bootstrap_lite部件时,须要在连接脚本文件//device/soc/bestechnic/bes2600/liteos_m/sdk/bsp/out/best2600w_liteos/_best2001.lds中手动新增如下段:
  1.        __zinitcall_bsp_start = .;
  2.       KEEP (*(.zinitcall.bsp0.init))
  3.       KEEP (*(.zinitcall.bsp1.init))
  4.       KEEP (*(.zinitcall.bsp2.init))
  5.       KEEP (*(.zinitcall.bsp3.init))
  6.       KEEP (*(.zinitcall.bsp4.init))
  7.       __zinitcall_bsp_end = .;
  8.       __zinitcall_device_start = .;
  9.       KEEP (*(.zinitcall.device0.init))
  10.       KEEP (*(.zinitcall.device1.init))
  11.       KEEP (*(.zinitcall.device2.init))
  12.       KEEP (*(.zinitcall.device3.init))
  13.       KEEP (*(.zinitcall.device4.init))
  14.       __zinitcall_device_end = .;
  15.       __zinitcall_core_start = .;
  16.       KEEP (*(.zinitcall.core0.init))
  17.       KEEP (*(.zinitcall.core1.init))
  18.       KEEP (*(.zinitcall.core2.init))
  19.       KEEP (*(.zinitcall.core3.init))
  20.       KEEP (*(.zinitcall.core4.init))
  21.       __zinitcall_core_end = .;
  22.       __zinitcall_sys_service_start = .;
  23.       KEEP (*(.zinitcall.sys.service0.init))
  24.       KEEP (*(.zinitcall.sys.service1.init))
  25.       KEEP (*(.zinitcall.sys.service2.init))
  26.       KEEP (*(.zinitcall.sys.service3.init))
  27.       KEEP (*(.zinitcall.sys.service4.init))
  28.       __zinitcall_sys_service_end = .;
  29.       __zinitcall_sys_feature_start = .;
  30.       KEEP (*(.zinitcall.sys.feature0.init))
  31.       KEEP (*(.zinitcall.sys.feature1.init))
  32.       KEEP (*(.zinitcall.sys.feature2.init))
  33.       KEEP (*(.zinitcall.sys.feature3.init))
  34.       KEEP (*(.zinitcall.sys.feature4.init))
  35.       __zinitcall_sys_feature_end = .;
  36.       __zinitcall_run_start = .;
  37.       KEEP (*(.zinitcall.run0.init))
  38.       KEEP (*(.zinitcall.run1.init))
  39.       KEEP (*(.zinitcall.run2.init))
  40.       KEEP (*(.zinitcall.run3.init))
  41.       KEEP (*(.zinitcall.run4.init))
  42.       __zinitcall_run_end = .;
  43.       __zinitcall_app_service_start = .;
  44.       KEEP (*(.zinitcall.app.service0.init))
  45.       KEEP (*(.zinitcall.app.service1.init))
  46.       KEEP (*(.zinitcall.app.service2.init))
  47.       KEEP (*(.zinitcall.app.service3.init))
  48.       KEEP (*(.zinitcall.app.service4.init))
  49.       __zinitcall_app_service_end = .;
  50.       __zinitcall_app_feature_start = .;
  51.       KEEP (*(.zinitcall.app.feature0.init))
  52.       KEEP (*(.zinitcall.app.feature1.init))
  53.       KEEP (*(.zinitcall.app.feature2.init))
  54.       KEEP (*(.zinitcall.app.feature3.init))
  55.       KEEP (*(.zinitcall.app.feature4.init))
  56.       __zinitcall_app_feature_end = .;
  57.       __zinitcall_test_start = .;
  58.       KEEP (*(.zinitcall.test0.init))
  59.       KEEP (*(.zinitcall.test1.init))
  60.       KEEP (*(.zinitcall.test2.init))
  61.       KEEP (*(.zinitcall.test3.init))
  62.       KEEP (*(.zinitcall.test4.init))
  63.       __zinitcall_test_end = .;
  64.       __zinitcall_exit_start = .;
  65.       KEEP (*(.zinitcall.exit0.init))
  66.       KEEP (*(.zinitcall.exit1.init))
  67.       KEEP (*(.zinitcall.exit2.init))
  68.       KEEP (*(.zinitcall.exit3.init))
  69.       KEEP (*(.zinitcall.exit4.init))
  70.       __zinitcall_exit_end = .;
复制代码
须要新增上述段是由于bootstrap_init提供的对外接口,见//utils/native/lite/include/ohos_init.h文件,采用的是灌段的形式,最终会生存到上述链接段中。主要的服务自动初始化宏如下表格所示:
接口名形貌SYS_SERVICE_INIT(func)标识核心系统服务的初始化启动入口SYS_FEATURE_INIT(func)标识核心系统功能的初始化启动入口APP_SERVICE_INIT(func)标识应用层服务的初始化启动入口APP_FEATURE_INIT(func)标识应用层功能的初始化启动入口

 说明: 通过上面加载的组件编译出来的lib文件须要手动加入强制链接。
​ 如在 vendor/bestechnic/display_demo/config.json 中配置了bootstrap_lite 部件
  1.     {
  2.       "subsystem": "startup",
  3.       "components": [
  4.         {
  5.           "component": "bootstrap_lite"
  6.         },
  7.         ...
  8.       ]
  9.     },
复制代码
​ bootstrap_lite部件会编译//base/startup/bootstrap_lite/services/source/bootstrap_service.c,该文件中,通过SYS_SERVICE_INIT将Init函数符号灌段到__zinitcall_sys_service_start和__zinitcall_sys_service_end中,由于Init函数是没有显式调用它,以是须要将它强制链接到最终的镜像。如下:
  1. static void Init(void)
  2. {
  3.     static Bootstrap bootstrap;
  4.     bootstrap.GetName = GetName;
  5.     bootstrap.Initialize = Initialize;
  6.     bootstrap.MessageHandle = MessageHandle;
  7.     bootstrap.GetTaskConfig = GetTaskConfig;
  8.     bootstrap.flag = FALSE;
  9.     SAMGR_GetInstance()->RegisterService((Service *)&bootstrap);
  10. }
  11. SYS_SERVICE_INIT(Init);   --- 通过SYS启动即SYS_INIT启动就需要强制链接生成的lib
复制代码
​ 在//base/startup/bootstrap_lite/services/source/BUILD.gn文件中,形貌了在out/v200zr/display_demo/libs 生成 libbootstrap.a,如下:
  1. static_library("bootstrap") {
  2.   sources = [
  3.     "bootstrap_service.c",
  4.     "system_init.c",
  5.   ]
  6.   ....
复制代码
​ 那么须要在 vendor/bestechnic/display_demo/config.json 配置强制链接库bootstrap,如下:
  1. "bin_list": [
  2.     {
  3.       "elf_name": "wifiiot",
  4.       "bsp_target_name": "best2600w_liteos",
  5.       "signature": "false",
  6.       "burn_name": "rtos_main",
  7.       "enable": "true",
  8.       "force_link_libs": [
  9.         "bootstrap",         --- 强制链接libbootstrap.a
  10.         ...
  11.       ]
  12.     },
复制代码
适配syspara_lite部件时,系统参数会最终写到文件中进行长期化生存。在轻量系统中,文件操作相关接口有POSIX接口与HalFiles接口这两套实现。
由于对接内核的文件系统,采用POSIX相关的接口,以是features字段中须要增加enable_ohos_startup_syspara_lite_use_posix_file_api = true。
如果对接HalFiles相关的接口实现的,则无须修改。
在适配GetSerial接口时,开发板不像产线生产过程那样,会写入一个详细的Serial Number,因而须要确定一个数据对开发板进行唯一标识。本案例采用WiFi Mac地址进行适配。
  1. #define ETH_ALEN 6
  2. #define MAC_BITS 4
  3. #define MAC_HIGH_MASK 0xf0
  4. #define MAC_LOW_MASK 0x0f
  5. #define HEX_A 0xa
  6. #define CHAR_NUM_OFFSET 0x30
  7. #define CHAR_CAPITAL_OFFSET 0x37
  8. #define STR_END_FLAG '\0'
  9. typedef unsigned char               u8;
  10. static char serialNumber[2*ETH_ALEN + 1];                 --- 最后一位留作'\0'结束符标识
  11. static char Hex2Char(u8 hex)
  12. {
  13.     if (hex < HEX_A) {
  14.         return hex + CHAR_NUM_OFFSET;                         --- 将数值0转为char的'0'
  15.     } else {
  16.         return hex + CHAR_CAPITAL_OFFSET;                 --- 将数值0xa转为char的'A'
  17.     }
  18. }
  19. const char* HalGetSerial(void)
  20. {
  21.     char macAddr[ETH_ALEN];
  22.     // as devboard has no production serial number, we just
  23.     // use wifi mac address as device serial number.
  24.     if (serialNumber[0] == STR_END_FLAG) {                 --- 只有第一次调用时,才去获取mac地址
  25.         extern int bwifi_get_own_mac(u8 *addr);
  26.         bwifi_get_own_mac(macAddr);                                 --- 获取mac地址
  27.         int j = 0;
  28.         for (int i = 0; i < ETH_ALEN; i++) {
  29.             u8 lowFour, highFour;
  30.             highFour = (macAddr[i] & MAC_HIGH_MASK) >> MAC_BITS;
  31.             serialNumber[j] = Hex2Char(highFour);
  32.             j++;
  33.             lowFour = macAddr[i] & MAC_LOW_MASK;
  34.             serialNumber[j] = Hex2Char(lowFour);
  35.             j++;
  36.         }                 --- 将mac地址值转化为serial number
  37.     }
  38.     return serialNumber;
  39. }
复制代码
DFX子系统适配

进行DFX子系统适配须要添加hilog_lite部件,直接在config.json文件配置即可。
  1. {
  2.   "subsystem": "hiviewdfx",
  3.   "components": [
  4.         {
  5.           "component": "hilog_lite",
  6.           "optional": "true"
  7.         }
  8.   ]
  9. },
复制代码
配置完成之后,在//device/soc/bestechnic/bes2600/liteos_m/components/utils/src/hm_sys.c中注册日志输出实现函数。
  1. boolean HilogProc_Impl(const HiLogContent *hilogContent, uint32 len)
  2. {
  3.     char tempOutStr[LOG_FMT_MAX_LEN] = {0};
  4.     if (LogContentFmt(tempOutStr, sizeof(tempOutStr), hilogContent) > 0) {
  5.         printf(tempOutStr);
  6.     }
  7.         return TRUE;   
  8. }
  9. HiviewRegisterHilogProc(HilogProc_Impl);
复制代码
系统服务管理子系统适配

进行系统服务管理子系统适配须要添加samgr_lite部件,直接在config.json配置即可。
  1. {
  2.   "subsystem": "systemabilitymgr",
  3.   "components": [
  4.         {
  5.           "component": "samgr_lite",
  6.           "features": [
  7.                 "config_ohos_systemabilitymgr_samgr_lite_shared_task_size = 4096"
  8.           ]
  9.         }
  10.   ]
  11. },
复制代码
在轻量系统中,samgr_lite配置的共享任务栈巨细默认为0x800。当函数调用栈较大时,会出现栈溢出的问题。在本次适配过程中,将其调整为0x1000。
安全子系统适配

进行安全子系统适配须要添加huks/deviceauth_lite部件,直接在config.json配置即可。
  1.   {
  2.       "subsystem": "security",
  3.       "components": [
  4.         {
  5.           "component": "huks",
  6.           "features": [
  7.             "huks_use_lite_storage = true",
  8.             "huks_use_hardware_root_key = true",
  9.             "huks_config_file = "hks_config_lite.h"",
  10.             "huks_key_store_path = "/data/"",
  11.             "ohos_security_huks_mbedtls_porting_path = "//device/soc/bestechnic/hals/mbedtls""
  12.           ]
  13.         },
  14.         {
  15.           "component": "deviceauth_lite",
  16.           "features": [
  17.             "deviceauth_storage_path = "/data/"",
  18.             "deviceauth_hichain_thread_stack_size = 9472"
  19.           ]
  20.         }
  21.       ]
  22.     }
复制代码
huks部件适配时,huks_key_store_path配置选项用于指定存放秘钥路径,ohos_security_huks_mbedtls_porting_path配置选项用于指定进行mbedtls适配的目次,用于芯片对mbedtls进行硬件随机数等适配。
deviceauth_lite部件适配时,deviceauth_storage_path配置选项用于指定存放装备认证信息的路径,deviceauth_hichain_thread_stack_size用于指定线程栈巨细。
媒体子系统适配

进行媒体子系统适配须要添加histreamer部件,直接在config.json配置即可。
  1. {
  2.   "subsystem": "multimedia",
  3.   "components": [
  4.     {
  5.       "component": "histreamer",
  6.       "features": [
  7.         "histreamer_enable_plugin_hdi_adapter = true",
  8.         "histreamer_enable_plugin_minimp3_adapter = true",
  9.         "histreamer_enable_plugin_ffmpeg_adapter = false",
  10.         "config_ohos_histreamer_stack_size = 65536"
  11.       ]
  12.     }
  13.   ]
  14. },
复制代码
histreamer部件配置项说明如下:
配置项说明histreamer_enable_plugin_hdi_adapter是否使能histreamer对接到hdi接口histreamer_enable_plugin_minimp3_adapter是否使能插件适配minimp3histreamer_enable_plugin_ffmpeg_adapter是否使能插件适配FFmpegconfig_ohos_histreamer_stack_sizehistreamer栈巨细设置 公共底子库子系统适配

进行公共底子库子系统适配须要添加kv_store/js_builtin/timer_task/kal_timer部件,直接在config.json配置即可。
  1. {
  2.   "subsystem": "utils",
  3.   "components": [
  4.         {
  5.           "component": "kv_store",
  6.           "features": [
  7.                 "enable_ohos_utils_native_lite_kv_store_use_posix_kv_api = true"
  8.           ]
  9.         },
  10.         {
  11.           "component": "js_builtin"
  12.         },
  13.         {
  14.           "component": "timer_task"
  15.         },
  16.         {
  17.           "component": "kal_timer",
  18.         }
  19.   ]
  20. },
复制代码
与适配syspara_lite部件类似,适配kv_store部件时,键值对会写到文件中。在轻量系统中,文件操作相关接口有POSIX接口与HalFiles接口这两套实现。由于对接内核的文件系统,采用POSIX相关的接口,以是features须要增加enable_ohos_utils_native_lite_kv_store_use_posix_kv_api = true。如果对接HalFiles相关的接口实现的,则无须修改。
图形子系统适配

进行图形子系统适配须要添加graphic_utils部件,直接在config.json配置即可。
  1.   {
  2.       "components": [
  3.         {
  4.           "component": "graphic_utils",
  5.           "features": [
  6.             "enable_ohos_graphic_utils_product_config = true"
  7.           ]
  8.         },
  9.         {
  10.           "component": "ui"
  11.         }
  12.       ]
  13.     },
复制代码
graphic配置文件见 //vendor/bestechnic/display_demo/graphic_config/product_graphic_lite_config.h。
graphic适配见//device/soc/bestechnic/bes2600/liteos_m/components/ui, 主要功能如下:


  • display_device:实例化BaseGfxEngine。
  • touch_input:实例化PointerInputDevice。
  • UiMainTask:初始化字体引擎,执行渲染任务等。
图形子系统层次:
  1. aafwk_lite + appexecfwk_lite    (AAFWK + APPEXECFWK)
  2.       |
  3. ace_engine_lite + jerryscript + i18n_lite + resmgr_lite + utils/native/lite/... (ACE,JS引擎及其依赖)
  4.       |
  5. arkui_ui_lite + graphic_utils      (图形框架)
  6.       |
  7. giflib + libjpeg + libpng + qrcodegen + freetype... (图形第三方库)
复制代码
图形应用示例见文件//vendor/bestechnic/display_demo/tests/app.cpp,如下:
  1. /* ui app entry */
  2. void RunApp()
  3. {
  4. #ifdef UI_TEST
  5.     AnimatorDemoStart();          --- native ui demo
  6. #elif defined(ABILITY_TEST)
  7.     StartJSApp();                          --- js demo
  8. #endif
  9. }
  10. void AppEntry(void)
  11. {
  12.     UiMain();
  13. }
  14. APP_FEATURE_INIT(AppEntry);
复制代码
ACE开发框架子系统适配

进行ACE开发框架子系统适配须要添加ace_engine_lite部件,直接在config.json配置即可。
  1. {
  2.   "subsystem": "ace",
  3.   "components": [
  4.     {
  5.       "component": "ace_engine_lite",
  6.       "features": [
  7.         "enable_ohos_ace_engine_lite_product_config = true"
  8.       ]
  9.     }
  10.   ]
  11. },
复制代码
ace_engine_lite部件配置文件见 //vendor/bestechnic/display_demo/ace_lite_config/product_acelite_config.h。
ace_lite的应用采用js语言进行开发,详细步调如下:

  • 用DevEco Studio编写js应用,参考轻量级智能穿着开发。
  • 使用预览功能进行预览,并且得到js包:entry\.preview\intermediates\res\debug\lite\assets\js\default。
  • 将js包放到对应的文件系统目次下,文件系统路径为vendor/bestechnic/display_demo/fs/data/data/js,如下:
  1. ├── app.js
  2. ├── common
  3. ├── i18n
  4. ├── manifest.json
  5. └── pages
复制代码

  • 最终编译生成系统镜像,烧录到单板后,系统会从app.js加载启动ace的应用。
元本领子系统适配

进行元本领子系统适配须要添加aafwk_lite部件,直接在config.json配置即可。
  1.   {
  2.       "subsystem": "aafwk",
  3.       "components": [
  4.         {
  5.           "component": "aafwk_lite",
  6.           "features": [
  7.             "enable_ohos_appexecfwk_feature_ability = true",         --- 支持FA特性,即包含图形能力
  8.             "config_ohos_aafwk_ams_task_size = 4096"                         --- 配置aafwk栈的大小
  9.           ]
  10.         }
  11.       ]
  12.     },
复制代码
aafwk_lite相关的应用样例见vendor/bestechnic/display_demo/tests/ability目次,包含launcher和js app这两类应用,应用的函数调用流程形貌如下:

  • launcher应用,通过InstallLauncher安装BundleName为 "com.example.launcher"的native ui应用,在AbilityMgrSliteFeature启动后会调用AbilityMgrHandler::StartLauncher()启动launcher应用。
  • StartJSApp应用,通过StartAbility启动任意Want,通过将want data通报JS_APP_PATH, SetWantData(&want, JS_APP_PATH, strlen(JS_APP_PATH) + 1)。
包管理子系统适配

进行包管理子系统适配须要添加appexecfwk_lite部件,直接在config.json配置即可。
  1.   {
  2.       "subsystem": "appexecfwk",
  3.       "components": [
  4.         {
  5.           "component": "appexecfwk_lite"
  6.         }
  7.       ]
  8.     },
复制代码

最后


有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道须要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。以是有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有须要的。 
鸿蒙HarmonyOS Next全套学习资料←点击领取!(安全链接,放心点击
这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。
希望这一份鸿蒙学习资料可以大概给大家带来资助,有须要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表