• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# OpenHarmony启用应用沙箱机制-适配指导
2
3## 验证流程
4
5![](figures/verification-process.png)
6
71. 取发布版本自验证功能,如果功能正常,则适配流程结束。
82. 取版本验证发现自身应用功能异常,则进行问题定位,通过分析代码识别到问题点,通过[适配流程](#适配流程)中的方法来进行文件访问模型的适配。
93. 适配完毕之后,重新验证功能,功能正常则适配流程结束。功能依旧存在问题则重新回到第二步继续定位,直到问题解决为止。
10
11## 适配流程
12
13![](figures/adaptation-process.png)
14
151. 定位出app异常的问题点之后,识别该问题是否是app源代码访问路径出错导致的,是否是访问有效文件可以通过下一章节的[沙箱文件访问规格清单](#沙箱文件访问规格清单)自查。
162. 如果是app源码访问无效路径,则可以通过调整访问路径的策略,将原来访问/data目录从绝对路径访问方式调整为使用context接口进行访问,具体请见context接口使用说明:
17   https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/application-models/application-context-stage.md
18   https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-ability-context.md
19   https://gitee.com/OpenHarmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-Context.md
203. 如果是app调用三方模块,异常调用栈出现在三方模块中,而app源码没有使用绝对路径去访问文件,则适配过程如下:
21   - 通知三方模块,让其访问文件路径通过context接口进行访问而非使用绝对路径的方式。
22   - 如果三方模块是个公共模块,除了给appspawn孵化的进程使用之外还给native进程使用,则可以将三方模块抽象成一个服务,应用通过ipc的方式去访问服务。
23
24## 沙箱文件访问规格清单
25
26**应用根目录访问路径清单**
27
28| 路径名                | 备注                                       |
29| --------------------- | ------------------------------------------ |
30| bin                   | 存放着各种二进制文件                       |
31| config                | 配置目录                                   |
32| data                  | 应用数据目录                               |
33| dev                   | 设备节点                                   |
34| etc                   | /system/etc的软连接                        |
35| init                  | /system/bin/init的软连接                   |
36| lib                   | /system/lib的软连接                        |
37| mnt                   | 挂载目录                                   |
38| proc                  | proc文件系统目录                           |
39| sys                   | sys文件系统目录                            |
40| sys_prod              | 此目录不同设备上存在差异,部分设备无此目录 |
41| system/app            | 系统目录资源                               |
42| system/fonts          | 系统文字资源                               |
43| system/lib            | 系统库                                     |
44| system/data           | 系统目录资源                               |
45| system/usr            | 系统目录资源                               |
46| system/profile        | 系统目录资源                               |
47| system/bin            | 系统程序                                   |
48| system/etc            | 系统配置                                   |
49| vendor/lib/chipsetsdk | 芯片组件目录,目前仅挂载chipsetsdk         |
50
51**应用数据目录访问路径清单**
52
53| 路径名                             | 备注                                                         |
54| ---------------------------------- | ------------------------------------------------------------ |
55| /data                              | 应用数据目录                                                 |
56| /data/storage                      | 应用数据                                                     |
57| /data/bundles                      | 所有应用安装目录,仅应用apl权限为BASIC及以上权限的应用可访问 |
58| /data/storage/el1                  | 应用el1加密级别数据目录                                      |
59| /data/storage/el2                  | 应用el2加密级别数据目录                                      |
60| /data/storage/el1/base             | 应用el1加密级别数据目录                                      |
61| /data/storage/el1/bundles          | 应用el1加密级别应用安装包目录                                |
62| /data/storage/el1/database         | 应用el1加密级别数据库存储目录                                |
63| /data/storage/el2/base             | 应用el2加密级别数据目录                                      |
64| /data/storage/el2/database         | 应用el2加密级别数据库存储目录                                |
65| /data/storage/el2/auth_groups      | 应用el2加密级别无账号分布式数据融合目录                      |
66| /data/storage/el2/distributedfiles | 应用el2加密级别有账号分布式数据融合目录                      |
67
68启用应用沙箱之后,应用命名空间内无法再访问物理路径下数据目录的访问方式,而是只能通过context接口来访问应用的数据目录,具体访问应用数据目录的方式可以通过context接口进行访问,参考[适配流程](#适配流程)中的context接口访问链接了解更多细节。
69应用的物理数据目录跟沙箱数据目录存储的是同一份应用的数据,通过bind mount技术进行关联,改动任意一处会影响另一处的数据。应用在命名空间下访问数据,只能通过沙箱路径来访问,下面列出应用的数据目录在物理路径跟沙箱路径下的对应关系。
70
71**应用的数据目录在物理路径跟沙箱路径下的对应关系**
72
73| 物理路径                                                     | 沙箱路径                           | 备注                                    |
74| ------------------------------------------------------------ | ---------------------------------- | --------------------------------------- |
75| /data/app/el1/bundle/public/\<PackageName>\                  | /data/storage/el1/bundle           | 应用安装包目录                          |
76| /data/app/el1/\<USERID\>/base/\<PACKAGENAME\>                | /data/storage/el1/base             | 应用el1级别加密数据目录                 |
77| /data/app/el2/\<USERID\>/base/\<PACKAGENAME\>                | /data/storage/el2/base             | 应用el2级别加密数据目录                 |
78| /data/app/el1/\<USERID\>/database/\<PACKAGENAME\>            | /data/storage/el1/database         | 应用el1级别加密数据库目录               |
79| /data/app/el2/\<USERID\>/database/\<PACKAGENAME\>            | /data/storage/el2/database         | 应用el2级别加密数据库目录               |
80| /mnt/hmdfs/\<USERID\>/account/merge_view/data/\<PACKAGENAME\> | /data/storage/el2/distributedfiles | 应用el2加密级别有账号分布式数据融合目录 |
81| /mnt/hmdfs/\<USERID\>/non_account/merge_view/data/           | /data/storage/el2/auth_groups      | 应用el2加密级别无账号分布式数据融合目录 |
82| /mnt/hmdfs/                                                  | /mnt/hmdfs/                        | 分布式文件系统目录                      |
83
84> **说明:**<br>\<USERID\>代表当前的用户ID
85> \<PACKAGENAME\>代表当前的应用包名
86
87更多物理路径沙箱路径的对应关系,请访问:
88https://gitee.com/OpenHarmony/startup_appspawn/blob/master/appdata-sandbox64.json
89
90## 案例:Contacts.hap拨号场景无法触发音频问题
91
92联系人应用沙箱整改前访问资源文件的方式如下,可以看到访问的路径是绝对路径硬编码,为/data/app/el1此类目录,而此类目录在应用沙箱中是访问受限的,所以会造成访问异常。
93
94![](figures/example1.png)
95
96此代码的核心是想通过fileIO接口open固定路径得到fdNumber,使用fdNumber去做接下来的文件访问。FileIO是通过路径得到fdNumber的,而现在路径访问已经被限制了,因此考虑用其他的接口去获取fdNumber即可,
97查阅OpenHarmony相关开发手册得知,使用resourceManager可以获取fdNumber。
98更改后的代码如下:
99
100![](figures/example2.png)
101
102## 规避方案
103
104如果发现应用异常且定位没有结论,可以使用关闭进程沙箱的方式来规避问题,规避方式如下:
105
1061. 打开OpenHarmony startup_appspawn仓的源码,找到应用沙箱配置文件,根据自己编译类型修改对应的配置代码文件。
107   32位修改:https://gitee.com/OpenHarmony/startup_appspawn/blob/master/appdata-sandbox.json
108   64位修改:https://gitee.com/OpenHarmony/startup_appspawn/blob/master/appdata-sandbox.json
109
1102. 在json中文件找到camera的配置,在下方参照camera的配置新建一条自身应用的配置,将包名改为自身应用报名,其他项保持跟camera一致即可,OFF字段代表关闭进程沙箱。
111
112   ![](figures/example3.png)