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)