• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# NO-Depends-On-NAPI规则说明
2
3
4
5## 1. NAPI模块的定义
6
7NAPI模块是指应用import的TS模块对应的接口实现动态库。如下所示:
8
9```javascript
10import @ohos.deviceinfo
11```
12
13应用import该模块时,本质上是dlopen("/system/lib{64}/module/lib**deviceinfo**.z.so")。这里libdeviceinfo.z.so就是NAPI模块。
14
15所有的NAPI模块都是安装在/system/lib{64}/module目录下。
16
17## 2. 规则解释
18
19NO-Depends-On-NAPI规则如字面意思,不允许任何模块依赖NAPI模块。具体原因如下:
20
21- 后续linker不会到/system/lib{64}/module下搜索动态库,该路径下的so只能被应用import时通过框架dlopen来访问。
22- 编译框架上会对所有的NAPI模块进行全局符号优化,使得所有的NAPI模块对外只保留如下version script文件中的符号:
23
24```apl
251.0 {
26  global:
27    _init;
28    _fini;
29    NAPI_*_GetABCCode;
30    NAPI_*_GetJSCode;
31
32  local:
33    *;
34};
35```
36
37## 3. 违规场景及处理方案建议
38
39### 3.1 非NAPI模块安装到了/system/lib{64}/module目录下
40
41有些非NAPI模块(并没有实现任何@ohos.xxx TS模块的API)BUILD.gn编写错误,增加了以下字段,导致安装到了NAPI模块的目录:
42
43```go
44relative_install_dir = "module"
45```
46
47**修改方案**:去掉relative_install_dir字段。
48
49### 3.2 其它模块确实使用到了NAPI模块中的符号
50
51此场景需要把NAPI模块中被使用到的符号下沉到对应的Inner API模块中供调用者使用,解除对NAPI模块的依赖。
52
53### 3.2 ut测试代码需使用NAPI模块中的符号
54
55此场景可以为NAPI模块增加静态库目标,ut测试代码deps静态库目标来完成测试。
56
57
58
59## 4. 例外说明
60
61由于linker后续不会搜索/system/lib{64},此规则不允许任何例外存在。
62
63当前的白名单列表只用于归档存量待整改模块,整改完成后需清零。
64
65