HarmonyOS NEXT编译器ArkCompiler初探
2024-12-31 10:6:0 Author: mp.weixin.qq.com(查看原文) 阅读量:0 收藏

1.背景

伴随着HarmonyOS NEXT的发布,华为实现了计算机领域三座大山的跨越:操作系统、处理器、编译器。其中HarmonyOS NEXT的编译器名叫ArkCompiler,它的发布引起了编译、程序分析、安全等领域人员的广泛关注,但是关于ArkCompiler的公开资料很少,我阅读了ArkCompiler的源码,进行了关键步骤的梳理,并绘制了相关流程图,抛砖引玉仅供大家参考,由于编译器代码非常复杂,如有错误还望批评指正。

2.ArkCompiler 发展历程简介

ArkCompiler的发展并不是一帆风顺的,充满了曲折,最初ArkCompiler 2.0 (https://gitee.com/openarkcompiler) 之前的版本设计了一套通用的中间语言Mapple IR,所有的编程语言都可以编译到Mapple IR,然后统一进行程序分析、代码优化、代码生成等。或许是因为这个目标规划的太大难以实现,亦或是这个架构从根本上仍然难以彻底摆脱Android,形成一套独立自主的生态,最终被内部放弃,开源社区代码也逐步停止了更新。

ArkCompiler 3.0则是另起炉灶以ArkTS为输入,编译到自定义字节码解释执行。由于ArkTS的原型JavaScript/TypeScript 语法简单,生态强大,ArkCompiler 3.0 很快在商用上获得了成功。官方的编译架构图如下所示。

3.ArkCompiler 3.0 架构

3.1 术语介绍

首先介绍ArkCompiler相关的一些术语

3.2  ArkCompiler的两套体系(panda体系与ark体系)

ArkCompiler 代码分布在四个仓库:arkcompiler_ets_frontend、arkcompiler_ets_runtime、arkcompiler_runtime_core、arkcompiler_toolchain。当前ArkCompiler分为两套体系,1)一套在panda命名空间之下,对应弱类型体系,支持较少的编译优化,2)一套在ark命名空间之下,对应严格类型体系,编译过程支持较多的优化,生成的代码执行效率也会更高。为了表述方便,后面以panda体系和ark体系分别代指。鸿蒙最新版的集成开发环境DevEco Studio默认搭载的是panda体系,ark体系仍然处于实验阶段,但是可以预见的未来会逐步迁移到第二套体系。
  • arkcompiler_ets_frontend

arkcompiler_ets_frontend包含的编译组件主要是es2panda和ets2panda,es2panda对应panda体系,ets2panda对应ark体系,两个体系都能将arkts代码翻译为字节码,是ArkCompiler的前端。

  • arkcompiler_runtime_core

arkcompiler_runtime_core包含了静态编译最核心的部分,static_core目录包含是ark体系代码,其他部分包含的是panda体系或者二者公用部分代码。编译的核心组件如:IR生成与优化、汇编、反汇编、padan文件解析与生成等都在这部分。

  • arkcompiler_ets_runtime

arkcompiler_ets_runtime包含的主要是JIT、解释器、内存管理等部分的代码。

3.2.1 panda 体系架构

panda体系的架构如下图所示,在该体系当中涉及的PANDA IR仅有18条,支持的优化也仅有有限的几种(如:branch_elimination)。在对ByteCode进行优化时,首先会翻译到PANDA IR,基于PANDA IR进行各种各样的分析与优化,完成之后再转换成ByteCode。如果在解释执行时,需要进行JIT或者AOT,ByteCode首先会翻译为Circuit IR进行分析,Circuit IR是一种专门针对JIT设计的IR。Circuit IR支持转换为Mapple IR(就是ArkCompiler 2.0的IR)和LLVM IR,来生成Native代码,ArkCompiler默认开启的是LLVM IR。

3.2.2 ark体系架构

在ark体系当中,PANDA IR更加丰富有上百条,与LLVM IR这些常规的中间代码更接近,理解起来也更容易,在这个体系当中支持将PANDA IR直接翻译为Native代码,当前主要是借助vixl实现,未来应该会用自研替代。 此外也支持手工构造IR,并通过irtoc翻译为Native代码。

3.2.3 Pass 机制

无论是panda体系,还是ark体系,都有类似llvm的pass管理机制,如下图所示,在ArkCompiler当中,各种各样的分析都是通过pass来实现的,包括ir构建、优化、代码生成等,这些由passManger管理执行。同样的,研究人员可以编写自己的pass进行多样的分析。

3.3 panda字节码格式

虚拟机解释执行的是panda 字节码,理解panda字节码结构对于分析鸿蒙应用有重要意义,为了直观明了地了解其结构,我绘制了字节码文件的结构图。

3.4  panda 体系下字节码生成过程

从ArkTS到字节码的生成流程相对复杂,我总结了主要流程与关键数据结构,并绘制结构图,方便大家理解。

4.京东 Taro

https://docs.taro.zone/docs/

开发一个鸿蒙原生应用,一般会有两种选择:

  • 使用原生 ArkTS 进行鸿蒙开发

  • 使用跨端框架进行鸿蒙开发

     使用原生 ArkTS 进行鸿蒙开发,面临着开发周期冗长、维护多端多套应用代码成本高昂的挑战。在交付时间紧、任务重的情况下,京东果断选择自研跨端框架Taro来开发鸿蒙原生应用。通过 Taro 提供的编译能力,开发者可以将整个 Taro 项目轻松地转换为一个独立的鸿蒙应用,无需额外的开发工作。

具体技术原理详见:https://mp.weixin.qq.com/s/qiXrgsCH18QhP2gpTL3OqQ

5.其他手机厂商

除了华为之外,国内其他的手机厂商也在尝试用类JavaScript语言开发应用,不过目前主要针对IoT设备、快应用,但不排除未来会像华为一样迁移到手机主App开发,到时候借助京东Taro就可以实现快速的迁移,国产操作系统也会遍地生根开花,完全替代Android指日可待。

6.安全分析展望

现有的软件安全自动化分析,尤其是静态分析都是借助于编译器组件实现的,正如文中介绍的那样,ArkCompiler 提供了很多现成的积木单元,未来可以借助这些基建实现对于鸿蒙应用的安全自动化分析如:污点传播,符号执行等,最终服务于企业内部众多的安全场景如:合规分析,漏洞自动化挖掘,广告反作弊分析,代码加固等等。


文章来源: https://mp.weixin.qq.com/s?__biz=MjM5OTk2MTMxOQ==&mid=2727843642&idx=2&sn=7b81990e02b956b13d4c69ddba89e57c&chksm=805040b2b727c9a41aa6170281ebf9960af4d82bc50c151140e2dbb2d011ca6a9c74cc25abc0&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh