• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 编译期自定义修改方舟字节码
2<!--Kit: ArkTS-->
3<!--Subsystem: ArkCompiler-->
4<!--Owner: @oatuwwutao-->
5<!--Designer: @hufeng20-->
6<!--Tester: @kirl75; @zsw_zhushiwei-->
7<!--Adviser: @foryourself-->
8
9如果开发者希望自定义修改方舟字节码文件的内容,可以使用ArkTS编译工具链提供的方法自定义修改方舟字节码文件。
10
11## 能力配置说明
12
13准备一个操作方舟字节码文件的动态库文件,在工程的配置文件build-profile.json5中[配置编译选项transformLib](arkoptions-guide.md#transformlib),选项值为这个动态库的路径,编译器会在指定时机加载该动态库,并执行其中指定的Transform方法。
14
15## 能力执行机制
16
17如果配置了transformLib且对应的动态库文件能正确加载,编译器将先生成方舟字节码文件到默认目标位置,然后调用动态库中的Transform方法,并将方舟字节码文件的路径作为参数传入。Transform方法包含开发者自定义的修改逻辑,用于重新生成方舟字节码文件,同时更新字节码文件的落盘操作是由用户执行。
18
19以下提供动态库模板,开发者可根据需求实现Transform逻辑。
20
21## 开发示例
22
231. 创建自定义修改动态库的源码。
24
25   example.cpp26
27   ```c++
28   /**
29    * @brief 方舟字节码文件修改的入口方法
30    * @param abc_path 待处理的方舟字节码文件的存储路径
31    */
32   extern "C" int Transform(const char *abc_path)
33   {
34       // 开发者可以在这里读取abc_path对应的方舟字节码文件,然后根据方舟字节码格式修改相关数据,然后再重新生成方舟字节码文件
35       return 0;
36   }
37   ```
38
392. 使用c语言编译工具(这里使用g++)编译动态库。
40
41   Windows平台:
42
43   ```
44   g++ --shared -o example.dll example.cpp
45   ```
46
47   Linux平台:
48
49   ```
50   g++ --shared -o example.so example.cpp
51   ```
52
53   Mac平台:
54
55   ```
56   g++ --shared -o example.so example.cpp
57   ```
58
593. 在DevEco Studio中配置build-profile.json5的transformLib选项(以windows环境为例)。
60
61   选项中配置的路径为步骤2生成的链接库文件在项目中的路径(这里是dll目录下)。
62
63   ![zh-cn_image_0000002079773605](figures/zh-cn_image_0000002079773605.png)
64
654. 重新编译项目,即可完成自定义修改方舟字节码。
66