1ba991379Sopenharmony_ci# NO-Depends-On-SA规则说明 2ba991379Sopenharmony_ci 3ba991379Sopenharmony_ci 4ba991379Sopenharmony_ci 5ba991379Sopenharmony_ci## 1. SA模块的定义 6ba991379Sopenharmony_ci 7ba991379Sopenharmony_ciSA模块是指System Ability对应的动态库模块,一般都在/system/profile/下描述,示例如下: 8ba991379Sopenharmony_ci 9ba991379Sopenharmony_ci```xml 10ba991379Sopenharmony_ci<?xml version="1.0" encoding="utf-8"?> 11ba991379Sopenharmony_ci<info> 12ba991379Sopenharmony_ci <process>telephony</process> 13ba991379Sopenharmony_ci <loadlibs> 14ba991379Sopenharmony_ci <libpath>libtel_cellular_call.z.so</libpath> 15ba991379Sopenharmony_ci <libpath>libtel_cellular_data.z.so</libpath> 16ba991379Sopenharmony_ci <libpath>libtel_core_service.z.so</libpath> 17ba991379Sopenharmony_ci <libpath>libtel_sms_mms.z.so</libpath> 18ba991379Sopenharmony_ci </loadlibs> 19ba991379Sopenharmony_ci ... 20ba991379Sopenharmony_ci</info> 21ba991379Sopenharmony_ci``` 22ba991379Sopenharmony_ci 23ba991379Sopenharmony_ci如上图所示,这些libpath里的动态库都是由SA框架通过dlopen的方式动态加载。 24ba991379Sopenharmony_ci 25ba991379Sopenharmony_ci## 2. 规则解释 26ba991379Sopenharmony_ci 27ba991379Sopenharmony_ciNO-Depends-On-SA规则有两个方面的含义: 28ba991379Sopenharmony_ci 29ba991379Sopenharmony_ci### 2.1 SA模块需要在编译模板中标识 30ba991379Sopenharmony_ci 31ba991379Sopenharmony_ci如下图所示,每个SA模块需要在对应的BUILD.gn中通过shlib_type字段来标识其类型: 32ba991379Sopenharmony_ci 33ba991379Sopenharmony_ci```go 34ba991379Sopenharmony_ciohos_shared_library(sample_sa_module) { 35ba991379Sopenharmony_ci ... 36ba991379Sopenharmony_ci shlib_type = "sa" 37ba991379Sopenharmony_ci ... 38ba991379Sopenharmony_ci} 39ba991379Sopenharmony_ci``` 40ba991379Sopenharmony_ci 41ba991379Sopenharmony_ci同样,非SA模块不要增加shlib_type="sa"标识。 42ba991379Sopenharmony_ci 43ba991379Sopenharmony_ci### 2.2 不允许依赖SA模块 44ba991379Sopenharmony_ci 45ba991379Sopenharmony_ci编译框架上ohos_shared_library模板会对所有的SA模块(shlib_type为sa)进行全局符号优化,使得所有的SA模块默认都不对外暴露符号,减小SA模块的大小,同时加快SA模块的加载速度。 46ba991379Sopenharmony_ci 47ba991379Sopenharmony_ci```go 48ba991379Sopenharmony_ci# Hide symbols for all sa libraries if not specified by version_script 49ba991379Sopenharmony_ciif (defined(invoker.shlib_type) && invoker.shlib_type == "sa") { 50ba991379Sopenharmony_ci if (!defined(invoker.version_script)) { 51ba991379Sopenharmony_ci configs += [ "//build/config/gcc:symbol_visibility_hidden" ] 52ba991379Sopenharmony_ci } 53ba991379Sopenharmony_ci} 54ba991379Sopenharmony_ci``` 55ba991379Sopenharmony_ci 56ba991379Sopenharmony_ci## 3. 违规场景及处理方案建议 57ba991379Sopenharmony_ci 58ba991379Sopenharmony_ci### 3.1 SA模块没有添加shlib_type标识 59ba991379Sopenharmony_ci 60ba991379Sopenharmony_ci处理方式:参考2.2章节的描述增加shlib_type = "sa"标识。 61ba991379Sopenharmony_ci 62ba991379Sopenharmony_ci### 3.2 其它模块确实使用到了SA模块中的符号 63ba991379Sopenharmony_ci 64ba991379Sopenharmony_ci**方案一**:把SA模块中被使用到的符号下沉到对应的Inner API模块中供调用者使用,解除对SA模块的依赖。 65ba991379Sopenharmony_ci 66ba991379Sopenharmony_ci 67ba991379Sopenharmony_ci 68ba991379Sopenharmony_ci**方案二**:对于支持插件扩展的SA模块,需要提供API给插件调用。此场景可以通过version_script来显式申明SA模块需要对外提供的符号,示例如下: 69ba991379Sopenharmony_ci 70ba991379Sopenharmony_ci```go 71ba991379Sopenharmony_ciohos_shared_library(partly_exported_symbols) { 72ba991379Sopenharmony_ci ... 73ba991379Sopenharmony_ci version_script = "libbeget_proxy.versionscript" 74ba991379Sopenharmony_ci ... 75ba991379Sopenharmony_ci} 76ba991379Sopenharmony_ci``` 77ba991379Sopenharmony_ci 78ba991379Sopenharmony_ci示例的version_script文件如下: 79ba991379Sopenharmony_ci 80ba991379Sopenharmony_ci```apl 81ba991379Sopenharmony_ci1.0 { 82ba991379Sopenharmony_ci global: 83ba991379Sopenharmony_ci AclGetDevUdid; 84ba991379Sopenharmony_ci AclGetSerial; 85ba991379Sopenharmony_ci ServiceWatchForStatus; 86ba991379Sopenharmony_ci SystemWatchParameter; 87ba991379Sopenharmony_ci WatchParameter; 88ba991379Sopenharmony_ci Remove*Watcher; 89ba991379Sopenharmony_ci local: 90ba991379Sopenharmony_ci *; 91ba991379Sopenharmony_ci}; 92ba991379Sopenharmony_ci``` 93ba991379Sopenharmony_ci 94ba991379Sopenharmony_ci> 提示:如果符号名称有规律,可以使用*作为通配符简化version_script编写的工作量;如Acl\*;。 95ba991379Sopenharmony_ci 96ba991379Sopenharmony_ci### 3.3 ut测试代码需使用SA模块中的符号 97ba991379Sopenharmony_ci 98ba991379Sopenharmony_ci此场景可以为SA模块增加静态库目标,ut测试代码deps静态库目标来完成测试。 99ba991379Sopenharmony_ci 100ba991379Sopenharmony_ci## 4. 例外说明 101ba991379Sopenharmony_ci 102ba991379Sopenharmony_ciSA模块默认都不对外暴露符号;如需提供符号,通过version_script来申明,无其它例外选项。 103ba991379Sopenharmony_ci 104ba991379Sopenharmony_ci当前的白名单列表只用于归档存量待整改模块,整改完成后需清零。