# 编译期自定义修改方舟字节码

如果开发者希望自定义修改方舟字节码文件的内容，可以使用ArkTS编译工具链提供的方法自定义修改方舟字节码文件。

## 能力配置说明

准备一个操作方舟字节码文件的动态库文件，在工程的配置文件build-profile.json5中[配置编译选项transformLib](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkoptions-guide#transformlib)，选项值为这个动态库的路径。编译器会在编译过程中加载该动态库，调用其中的Transform方法，并在Transform方法执行完成后卸载该动态库。

## 能力执行机制

如果配置了transformLib且对应的动态库文件能正确加载，编译器将先生成方舟字节码文件到默认目标位置，然后调用动态库中的Transform方法，并将方舟字节码文件的路径作为参数传入。Transform方法包含开发者自定义的修改逻辑，用于对编译器传入的方舟字节码文件进行插桩或其他修改。开发者需要在Transform方法中通过字节码文件写入接口，将修改后的内容写回编译器传入的方舟字节码文件。一次编译生成多个方舟字节码文件时，编译器会分别调用Transform方法处理每个方舟字节码文件，并传入当前文件的路径。包含卡片的工程中，卡片对应的方舟字节码文件同样支持插桩。

以下提供动态库模板，开发者可根据需求实现Transform逻辑。

## 开发示例

1. 创建自定义修改动态库的源码。

   example.cpp：

       #include <cstdlib>

       /**
        * @brief 方舟字节码文件修改的入口方法
        * @param abc_path 待处理的方舟字节码文件的存储路径
        * @return 返回0（EXIT_SUCCESS）表示字节码文件修改成功，返回非0值表示修改失败。
        */
       extern "C" int Transform(const char *abc_path)
       {
           // 开发者可以在这里读取abc_path对应的方舟字节码文件，然后根据方舟字节码格式修改相关数据，然后再重新生成方舟字节码文件
           return EXIT_SUCCESS;
       }

2. 使用C语言编译工具（这里使用g++）编译动态库。

   Windows平台：

   ```bash
   g++ --shared -o example.dll example.cpp
   ```

   Linux平台：

   ```bash
   g++ --shared -o example.so example.cpp
   ```

   Mac平台：

   ```bash
   g++ --shared -o example.so example.cpp
   ```

3. 在DevEco Studio中配置build-profile.json5的transformLib选项（以Windows环境为例）。

   选项中配置的路径为步骤2生成的链接库文件在项目中的路径（这里是dll目录下）。

   ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/8b/v3/W6err2bIRmylHN1J0xr7Yw/zh-cn_image_0000002779689566.png?HW-CC-KV=V1&HW-CC-Date=20261102T125436Z&HW-CC-Expire=31536000000&HW-CC-Sign=DFA4C3A905FE6971A8037552347F2A987B26CFEB00C41C0FD0176FD197B8948A)
4. 重新编译项目，即可完成自定义修改方舟字节码。

