4

OpenHarmony应用编译 - 如何在源码中编译复杂应用(4.0-Release)

 9 months ago
source link: https://www.51cto.com/article/776224.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

OpenHarmony应用编译 - 如何在源码中编译复杂应用(4.0-Release)

作者:TiZizzz 2023-12-11 17:30:52
在OpenHarmony系统中预安装应用的hap包会随系统编译打包到镜像中,目前有两种编译预安装应用hap包的方式,一种为随系统编译时,编译应用源码生成hap包的方式,另一种是将已生成的hap包放入系统源码中,再进行打包的方式。
036ff0711ac2891fe3c852f29186a148a0dd9b.png

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com

  • 开发环境:Windows 11
  • 编译环境:Ubuntu 22.04
  • 开发板型号:DAYU 200(RK3568)
  • 系统版本:OpenHarmony-4.0-Release
  • 涉及仓库:applications_launcher
  • 在OpenHarmony系统中预安装应用的hap包会随系统编译打包到镜像中,目前有两种编译预安装应用hap包的方式,一种为随系统编译时,编译应用源码生成hap包的方式,另一种是将已生成的hap包放入系统源码中,再进行打包的方式。后者需要开发者使用DevEco Studio或其它途径,把应用源码编译构建为hap包,再将hap放入系统源码中。
  • 在OpenHarmony应用编译 - 如何在源码中编译复杂应用(3.2-Release)文章中,介绍了如何在3.2Release版本的系统源码中编译系统应用Launcher。本文档将继续以Launcher为例,带大家了解如何通过4.0Release的系统源码编译应用的方式来打包预安装应用。
  • 由于应用依赖和构建工具的升级和替换,3.2Release系统编译构建应用的方式是NPM+Webpack,而4.0Release使用OHPM+Hvigor的方式进行构建,差别较大。

4.0-Release系统编译Launcher

由于Launcher自身原因,导致需要做2处改动才可进行源码编译构建。本步骤并非所有项目通用,如果新建的项目可以跳过本步骤,后续Launcher或工具更新后也不需要本步骤。

适配系统源码中NODE_HOME环境变量的配置,需要修改应用目录下hvigorw工具为最新。

文件位置:applications/standard/launcher/hvigorw

内容如下:

#!/bin/bash

# ----------------------------------------------------------------------------
#  Hvigor startup script, version 1.0.0
#
#  Required ENV vars:
#  ------------------
#    NODE_HOME - location of a Node home dir
#    or
#    Add /usr/local/nodejs/bin to the PATH environment variable
# ----------------------------------------------------------------------------

HVIGOR_APP_HOME="`pwd -P`"
HVIGOR_WRAPPER_SCRIPT=${HVIGOR_APP_HOME}/hvigor/hvigor-wrapper.js
warn() {
	echo ""
	echo -e "\033[1;33m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m"
}

error() {
	echo ""
	echo -e "\033[1;31m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m"
}

fail() {
	error "$@"
	exit 1
}

# Determine node to start hvigor wrapper script
if [ -n "${NODE_HOME}" ];then
   EXECUTABLE_NODE="${NODE_HOME}/bin/node"
   if [ ! -x "$EXECUTABLE_NODE" ];then
       fail "ERROR: NODE_HOME is set to an invalid directory,check $NODE_HOME\n\nPlease set NODE_HOME in your environment to the location where your nodejs installed"
   fi
else
   EXECUTABLE_NODE="node"
   which ${EXECUTABLE_NODE} > /dev/null 2>&1 || fail "ERROR: NODE_HOME is not set and not 'node' command found in your path"
fi

# Check hvigor wrapper script
if [ ! -r "$HVIGOR_WRAPPER_SCRIPT" ];then
	fail "ERROR: Couldn't find hvigor/hvigor-wrapper.js in ${HVIGOR_APP_HOME}"
fi

# start hvigor-wrapper script
exec "${EXECUTABLE_NODE}" \
	"${HVIGOR_WRAPPER_SCRIPT}" "$@"
4909178935fa840f37c0326b1eb2ff7506a84b.png

由于系统编译应用目前不支持配置产品,所以需要把Launcher应用源码中有关pad的构建项删除。

文件位置:applications/standard/launcher/build-profile.json5

内容如下:

{
  	...
    {
      "name": "phone_launcher",
      "srcPath": "./product/phone",
      "targets": [
        {
          "name": "default",
          "applyToProducts": [
            "default",
          ],
        },
      ],
    },
    {
      "name": "launcher_settings",
      "srcPath": "./feature/settings",
      "targets": [
        {
          "name": "default",
          "applyToProducts": [
            "default",
          ],
        },
      ],
    }
  ],
}
84cfc9e3304791dd188067c47ab05b7580cccc.png

文件位置:applications/standard/launcher/feature/settings/build-profile.json5。

内容如下:

{
  "apiType": 'stageMode',
  "buildOption": {
  },
  "targets": [
    {
      "name": "default",
    }
  ],
  "entryModules": ["phone_launcher"]
}
66fc50c03448c0edc7991944fe803d4091ed8e.png

删除或注释系统中默认的Launcher应用hap包编译方式。

文件位置:applications/standard/hap/BUILD.gn 。

group("hap") {
  deps = [
    	...
      # "//applications/standard/hap:launcher_hap", // 直接删除或注释,不参与编译
      # "//applications/standard/hap:launcher_settings_hap",  // 直接删除或注释,不参与编译
    	...
  ]
 }
28d7ce466bcb217d37d834b794bff93aa3e5b7.png

在applications/standard/launcher目录中增加BUILD.gn文件。

a917089102a0e6508157632576afa9340bf3a0.png

内容如下:

import("//build/ohos.gni")

ohos_app("launcher_OS") {
  part_name = "prebuilt_hap"
  subsystem_name = "applications" 
  hap_name = "Launcher_OS"   
  certificate_profile = "./signature/launcher.p7b"
  module_libs_dir = "entry"
  module_install_dir = "app/com.ohos.launcher"
  js_build_mode = "release"
  build_level = "module"
  assemble_type = "assembleHap"
}
  • 此处产物名称hap_name定义为Launcher_OS是为了区分原系统源码中默认的hap包名称,实际可以填写为Launcher或任意值。
  • BUILD.gn的模板参数可以参考编译系统提供的模板。

在applications/standard/hap/ohos.build文件的module_list中增加launcher_OS模块编译。

{
  "subsystem": "applications",
  "parts": {
    "prebuilt_hap": {
	  	...
      "module_list": [
       	...
       "//applications/standard/launcher:launcher_OS",
        ...
      ]
    }
  }
}
3406c8e501d5fd862e9918b41c9f961150bf9e.png

执行源码编译指令。如果以下2个目录产物正确,则说明应用源码编译方式修改成功。

在out/rk3568/obj/applications/standard/launcher/launcher_OS目录中,会生成2个hap的编译产物。

5935b1b10687ef23a357322c9d6064bab95981.png

在out/rk3568/packages/phone/system/app/com.ohos.launcher目录中,是实际系统环境中的hap包产物。

989ebfc199c5057a2fb879e2387a9160468334.png

烧录系统验证功能。

Launcher正常启动:

c5c949213e4010d34ee59633fb94def16413a6.jpeg

系统应用目录文件正确:

b84bc2f06e9b5d3cba3062c341a028c88976d3.png

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com

责任编辑:jianghua 来源: 51CTO 开源基础软件社区

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK