1.背景
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 架构
首先介绍ArkCompiler相关的一些术语
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、解释器、内存管理等部分的代码。
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。
在ark体系当中,PANDA IR更加丰富有上百条,与LLVM IR这些常规的中间代码更接近,理解起来也更容易,在这个体系当中支持将PANDA IR直接翻译为Native代码,当前主要是借助vixl实现,未来应该会用自研替代。 此外也支持手工构造IR,并通过irtoc翻译为Native代码。
无论是panda体系,还是ark体系,都有类似llvm的pass管理机制,如下图所示,在ArkCompiler当中,各种各样的分析都是通过pass来实现的,包括ir构建、优化、代码生成等,这些由passManger管理执行。同样的,研究人员可以编写自己的pass进行多样的分析。
虚拟机解释执行的是panda 字节码,理解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 提供了很多现成的积木单元,未来可以借助这些基建实现对于鸿蒙应用的安全自动化分析如:污点传播,符号执行等,最终服务于企业内部众多的安全场景如:合规分析,漏洞自动化挖掘,广告反作弊分析,代码加固等等。