Openharmony的编译构建--进阶篇2

本文介绍了在OpenharmonyV3.1中如何新建子系统并在其部件下添加模块,涉及BUILD.gn配置、bundle.json修改、subsystem_config.json更新等步骤。同时,提到了BUILD.gn的不同模板如ohos_hap、ohos_source_set和action的使用,以及Openharmony编译构建的运行机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

承接上一篇Openharmony的编译构建--进阶篇1中说明了在Openharmony V3.1的如何在标准系统即L2设备添加一个模块的两种情况,此篇对第三种情况进行说明。

四、新建子系统并在该子系统的部件下添加模块

1.在模块目录下配置BUILD.gn,根据类型选择对应的模板

2.新建包含该模块所属部件的bundle.json

此前两步与前面介绍的两种方式并无区别。

3.修改//build/subsystem_config.json

比如:在foundation目录下新建test_subsystem,将第一步与第二步新建的bundle.json与BUILD.gn移入。

修改bundle.json中"subsystem": "test_subsystem",并且BUILD.gn中的subsystem_name = "test_subsystem",part_name = ""进行修改。

{
  "ace": {
    "path": "foundation/ace",
    "name": "ace"
  },
  "ai": {
    "path": "foundation/ai",
    "name": "ai"
  },
  "account": {					# 子系统
    "path": "base/account",		# 子系统目录
    "name": "account"			# 子系统名称
  },
  # 新增示例如下:
  "test_subsystem": {
    "path": "foundation/test_subsystem",
    "name": "test_subsystem"
  }, 
...
}

4.//productdefine/common/products/rk3568.json文件添加部件"account:os_account_test":{}

不再赘述。

Openharmony里执行

./build.sh --product-name rk3568

编译完成后,在//out/rk3568/test_subsystem/目录下可以找到编译完成的可执行文件与动态库。

五、BUILD.gn的其它模板

一些常用的模板类型:

# 生成系统hap
ohos_hap	
# 拷贝文件
ohos_copy
# 源目标集合
ohos_source_set
# 执行脚本,支持shell、python
action
# 工作集
group
# 配置集合
config

ohos_hap例子

ohos_hap("clock")
  hap_profile = "./src/main/config.json" # config.json
  js_assets = ["./src/main/js/defaults"]
  raw_assets = ["./raw_assets"]
  resources = ["./src/main/resources"]
  shared_libraries = ["//third_party/libpng:libpng"] # native库
  certificate_profile = "../signature/systemui.p7b"	 # Cer文件
  hap_name = "SystemUI-NavigationBar" 	# hap包名字
  part_name = "prebuilt_hap"
  subsystem_name = "application"
}
  • 声明一个hap目标,该目标会生成一个hap包,最终将会打包到system镜像中

  • 支持的变量

1.hap_profile:hap包的config.json

2.js_assets:js资源,编译后放置在assets/js/default目录下

3.raw_assets:原始assets,这些assets会直接拷贝到hap包的assets目录下

4.resources:资源文件,编译后放置在assets/entry/resources目录下

5.deps:当前目标的依赖

6.shared_libraries:当前目标依赖的native库

7.hap_name:hap包的名字,可选,默认为目标名

8.final_hap_path:用户可以制定生成的hap的位置,可选,final_hap_path中会覆盖hap_name

9.subsystem_name: hap包从属的子系统名,需要和bundle.json中的名字对应,否则将导致无法安装 到system镜像中

10.part_name: hap包从属的部件名。同subsystem_name

11.js2abc: 是否需要将该hap包转换为ARK的字节码

12.certificate_profile: hap对应的授权文件,用于签名

13.certificate_file: 证书文件,证书文件和授权文件,应用开发者需要去openharmony官网申请

14.keystore_path: keystore文件,用于签名

15.keystore_password: keystore的密码,用于签名

16.key_alias: key的别名

17.module_install_name: 安装时的hap包名称

18.module_install_dir: 安装到system中的位置,默认安装在system/app目录下

ohos_source_set例子:

ohos_source_set("glib_source") {
  source = [
  	"glib/deprecated/gallocator.c",
  	"glib/deprecated/gcache.c",
  	"glib/deprecated/grel.c",
  	...
  ]
  configs = [ ":glib_config"]
}

ohos_shared_library("glib") {
  deps = [ ":glib_source"]
  part_name = "multimedia_media_standard"
  subsystem_name = "multimedia"
}

action例子:

action("gen_config_header") {
  script = "//third_party/ffmpeg/ohos_config.sh"
  
  args = [
    rebase_path("//third_party/ffmpeg", root_build_dir),
    rebase_path("${target_gen_dir}/include/", root_build_dir),
  ]
  
  outputs = [ "${target_gen_dir}/include/config.h"]
}

六、Openharmony编译构建的运行机制

Openharmony侧的编译构建流程主要包含编译命令行解析,调用gn,执行ninja:

  • 命令行解析:解析待编译的产品名称,加载相关配置

  • 调用gn:根据命令行解析的产品名称和编译类型,配置编译工具链和全局的编译选项

  • 执行ninja:启动编译并生成对应的产品版本。

后续更精彩

1.L0与L1的编译构建过程以及后续V3.2版本的构建流程稍有不同,但是如果了解了Openharmony的编译构建的运行机制,可以理解相应的产品的编译过程。如果在技术朋友在此方面有疑惑时,可以留言与私信,或者如果提问的朋友相对较多时,再开一篇进行解析说明。

2.各位朋友和技术爱好者有想了解Openharmony的相关子系统或者框架的,可以留言或私信。

<think>好的,用户想了解如何将Python交叉编译OpenHarmony标准系统(arm32位)上运行。我需要先理清交叉编译的基本流程,然后针对OpenHarmony和arm32架构的具体要求进行调整。 首先,交叉编译Python通常需要配置交叉编译工具链,确保工具链支持目标平台的架构和系统库。OpenHarmony可能使用自己的工具链,比如ohos-clang,我需要确认是否有现成的工具链或者需要自己构建。 接下来,Python的编译过程依赖于许多库,比如zlib、libffi等。用户需要先交叉编译这些依赖库,确保它们安装在目标系统的路径中。此外,OpenHarmony的系统库可能和标准Linux有所不同,可能需要调整编译参数,比如指定sysroot和链接的库路径。 然后,配置Python的编译选项是关键步骤。在configure脚本中,需要指定--host参数为arm-linux-ohos,或者对应的工具链前缀。同时,可能需要禁用一些不必要的模块,避免依赖问题,比如ssl模块如果依赖未编译的库,可以先禁用以减少错误。 编译过程中可能会遇到头文件缺失或函数未定义的问题,需要检查OpenHarmony的系统头文件是否齐全,以及是否在编译时正确包含了这些路径。另外,动态链接器的路径和库的加载路径也需要正确设置,可能需要修改Makefile中的相关参数。 测试阶段,将编译好的Python可执行文件和库文件打包到OpenHarmony系统中,可能需要调整文件系统的结构,确保所有的依赖库都能被正确找到。如果出现运行时错误,可能需要使用gdbserver进行远程调试,或者检查系统日志来定位问题。 最后,用户可能需要将Python集成到OpenHarmony的应用中,考虑使用napi或其他接口进行扩展开发。此外,交叉编译大型项目时,自动化构建工具如CMake或GN可能会简化流程,需要根据OpenHarmony构建系统进行调整。 总结来说,关键步骤包括准备工具链、处理依赖库、配置和编译Python,解决兼容性问题,以及测试和部署。需要注意OpenHarmony特有的系统配置和库路径,可能需要查阅官方文档或社区资源来解决特定问题。</think>以下是Python交叉编译OpenHarmony标准系统(arm32)的步骤指南: --- ### **1. 环境准备** - **交叉编译工具链**:获取OpenHarmony官方提供的arm32工具链(如ohos-clang) - **Python源码**:从[python.org](https://www.python.org/)下载目标版本源码(推荐3.8+) - **OpenHarmony SDK**:包含系统头文件与库文件(如libc等) - **依赖项**:zlib/readline/libffi等库的交叉编译版本 --- ### **2. 依赖库交叉编译** ```bash # 示例:交叉编译zlib export CC=arm-linux-ohos-clang export CXX=arm-linux-ohos-clang++ ./configure --prefix=/path/to/ohos-sysroot make && make install ``` --- ### **3. Python配置与编译** ```bash cd Python-3.x.x ./configure \ --host=arm-linux-ohos \ # 指定目标平台 --build=x86_64-linux-gnu \ # 本机架构 --prefix=/system \ # OpenHarmony系统路径 --enable-shared \ --disable-ipv6 \ --with-system-ffi \ # 使用已编译的libffi CFLAGS="-I/path/to/ohos-sysroot/include" \ LDFLAGS="-L/path/to/ohos-sysroot/lib" ``` --- ### **4. 关键问题处理** - **文件系统适配**: ```c // 修改Modules/posixmodule.c #undef HAVE_FORK #undef HAVE_GETENTROPY ``` - **动态链接器路径**: ```makefile # 在Makefile中设置 LINKFORSHARED = -Wl,-rpath-link=/system/lib ``` --- ### **5. 编译与部署** ```bash make -j4 arm-linux-ohos-strip python # 精简二进制体积 # 部署到OpenHarmony设备: adb push ./python /system/bin adb push Lib/ /system/lib/python3.x ``` --- ### **6. 验证测试** ```bash # 在OpenHarmony终端执行 ./system/bin/python -c "print('Hello OpenHarmony')" ``` --- ### **常见问题解决** | 问题现象 | 解决方案 | |-----------------------|---------------------------------| | 缺少`libpython3.x.so` | 检查`--enable-shared`配置项是否启用 | | 符号链接错误 | 使用`busybox`创建手动链接 | | 段错误(SEGFAULT) | 检查内存对齐设置与ARM指令集兼容性 | --- ### **进阶建议** - 使用OpenHarmony的**GN构建系统**集成Python编译 - 通过**NAPI框架**开发Python原生扩展 - 参考OpenHarmony官方文档调整`seccomp`沙箱策略 需要完整工具链配置文件或遇到具体编译错误时,可提供详细日志进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值