目录

配置CPP

Hvigor集成cmake,ninja为cpp代码的构建工具。在初始状态下,您无需额外配置,为了定制您的cpp代码编译,您可通过以下配置添加自定义配置。

在模块的build-profile.json5中,存在以下配置项:

{
  ...
  "buildOptionSet": [
    {
      "name": "release",
      "arkOptions": {
        "obfuscation": {
          "ruleOptions": {
            "enable": true,
            "files": [
              "./obfuscation-rules.txt"
            ]
          }
        }
      },
      "externalNativeOptions": {
        "path": "./src/main/cpp/CMakeLists.txt", // 自定义cmake配置脚本CMakeLists.txt的位置,它是以模块根目录为起始位置的相对路径
        "arguments": ["-DCMAKE_BUILD_TYPE=Debug"], // Hvigor将会把此处的自定义参数传递给cmake构建工具,您可通过cmake官方文档查找您所需的编译参数,同时它也将覆盖默认同名参数
        "cppFlags": "-g", // 自定义cpp flags参数
        "abiFilters": ["arm64-v8a"] // 自定义cpp编译架构,默认编译架构为arm64-v8a
      },
      "nativeLib": {
        "debugSymbol": { // 可通过此配置对cpp编译产物so执行strip,移除so中的调试信息与符号表等
          "strip": true, // 执行strip
          "exclude": [] //执行strip的过滤正则表达式规则
        },
        "filter": { // 可通过此选项自定义此cpp产物so是否打包到应用包中
          "excludes": [ // 根据正则表达式排除匹配到的.so文件,匹配到的so文件将不会被打包,可用于打包时缩小包体积
            "**/3.so", // 排除所有名称为“3”的so文件
            "**/x86_64/*.so" // 排除所有x86_64架构的so文件
          ], 
          "pickFirsts": [], // 按照.so文件的优先级顺序,打包最高优先级的.so文件
          "pickLasts": [], // 按照.so文件的优先级顺序,打包最低优先级的.so文件
          "enableOverride": true, // 当.so重名冲突时,允许打包时so文件的覆盖
          "select": [ // select提供native产物的精准选择能力,根据包名、版本、产物名称等选择或排除,select的优先级高于excludes、pickFirsts等配置项
            {
              "package": "@ohos/curl", // 包名
              "version": "1.3.5", // 包版本
              "include": ["libcurl.so"], // 选择打包的native产物
              "exclude": ["libc++_shared.so"] // 排除的native产物
            }
          ],
        },
        "headerPath": "./src/main/cpp/include" // 声明模块打包共享的c/cpp接口
        "librariesInfo":[
          {
             "name": "libentry.so",
             "linkLibraries": ["curl::curl"]
          }
        ]
      },
    },
  ],
  ...
}

通过自定义externalNativeOptions参数,可修改cpp编译表现。nativeLib/headerPath声明了模块的c/cpp接口文件,并通过打包暴露给依赖模块。而通过debugSymbol、filter等配置,可修改so产物的体积与打包规则。

关于库文件so的优先级

库文件so的优先级选择,可以通过pickFirsts,pickLasts选项来选择,其中pickFirsts选择高优先级的库文件,pickLasts选择低优先级的库文件。

这个优先级是由本模块所依赖模块或三方包的收集顺序决定的,本模块依赖声明在oh-package.json5文件的dependencies配置项中,收集顺序按照广度优先的遍历方式来收集依赖。

如下图,优先级顺序为current > library0 > library1 > library5 > library2 > library3 > library4。

图1

关于select的使用

select提供native产物的精准选择能力,根据包名,版本,产物名称等,选择打包或排除native产物到hap/hsp/har产物。

例如本模块依赖的libcurl.so所在的har包为@ohos/curl,并且存在多个版本的libcurl.so,需要打包1.3.5版本,那可以通过以下配置,精确打包这个so到产物中。

{
  buildOption: {
    nativeLib: {
      filter: {
        select: [ // select的优先级高于excludes、pickFirsts等配置项
          {
            package: "@ohos/curl", // 包名
            version: "1.3.5", // 包版本
            include: ["libcurl.so"], // 选择打包的native产物
            exclude: ["libc++_shared.so"] // 排除的native产物
           }
        ]
      }
    }
  }
}