# OpenHarmonyå¯ç”¨åº”用沙箱机制-适酿Œ‡å¯¼ ## éªŒè¯æµç¨‹  1. å–å‘布版本自验è¯åŠŸèƒ½ï¼Œå¦‚æžœåŠŸèƒ½æ£å¸¸ï¼Œåˆ™é€‚é…æµç¨‹ç»“æŸã€‚ 2. å–版本验è¯å‘现自身应用功能异常,则进行问题定ä½ï¼Œé€šè¿‡åˆ†æžä»£ç 识别到问题点,通过[适酿µç¨‹](#适酿µç¨‹)ä¸çš„æ–¹æ³•æ¥è¿›è¡Œæ–‡ä»¶è®¿é—®æ¨¡åž‹çš„适é…。 3. 适é…完毕之åŽï¼Œé‡æ–°éªŒè¯åŠŸèƒ½ï¼ŒåŠŸèƒ½æ£å¸¸åˆ™é€‚é…æµç¨‹ç»“æŸã€‚åŠŸèƒ½ä¾æ—§å˜åœ¨é—®é¢˜åˆ™é‡æ–°å›žåˆ°ç¬¬äºŒæ¥ç»§ç»å®šä½ï¼Œç›´åˆ°é—®é¢˜è§£å†³ä¸ºæ¢ã€‚ ## 适酿µç¨‹  1. 定ä½å‡ºapp异常的问题点之åŽï¼Œè¯†åˆ«è¯¥é—®é¢˜æ˜¯å¦æ˜¯appæºä»£ç è®¿é—®è·¯å¾„å‡ºé”™å¯¼è‡´çš„ï¼Œæ˜¯å¦æ˜¯è®¿é—®æœ‰æ•ˆæ–‡ä»¶å¯ä»¥é€šè¿‡ä¸‹ä¸€ç« 节的[æ²™ç®±æ–‡ä»¶è®¿é—®è§„æ ¼æ¸…å•](#æ²™ç®±æ–‡ä»¶è®¿é—®è§„æ ¼æ¸…å•)自查。 2. 如果是appæºç è®¿é—®æ— æ•ˆè·¯å¾„ï¼Œåˆ™å¯ä»¥é€šè¿‡è°ƒæ•´è®¿é—®è·¯å¾„çš„ç–略,将原æ¥è®¿é—®/data目录从ç»å¯¹è·¯å¾„访问方å¼è°ƒæ•´ä¸ºä½¿ç”¨context接å£è¿›è¡Œè®¿é—®ï¼Œå…·ä½“请è§context接å£ä½¿ç”¨è¯´æ˜Žï¼š https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/application-models/application-context-stage.md 3. 如果是app调用三方模å—ï¼Œå¼‚å¸¸è°ƒç”¨æ ˆå‡ºçŽ°åœ¨ä¸‰æ–¹æ¨¡å—ä¸ï¼Œè€Œappæºç 没有使用ç»å¯¹è·¯å¾„去访问文件,则适é…过程如下: - 通知三方模å—,让其访问文件路径通过context接å£è¿›è¡Œè®¿é—®è€Œéžä½¿ç”¨ç»å¯¹è·¯å¾„的方å¼ã€‚ - å¦‚æžœä¸‰æ–¹æ¨¡å—æ˜¯ä¸ªå…¬å…±æ¨¡å—,除了给appspawnåµåŒ–的进程使用之外还给native进程使用,则å¯ä»¥å°†ä¸‰æ–¹æ¨¡å—抽象æˆä¸€ä¸ªæœåŠ¡ï¼Œåº”ç”¨é€šè¿‡ipc的方å¼åŽ»è®¿é—®æœåŠ¡ã€‚ ## æ²™ç®±æ–‡ä»¶è®¿é—®è§„æ ¼æ¸…å• **åº”ç”¨æ ¹ç›®å½•è®¿é—®è·¯å¾„æ¸…å•** | 路径å | 备注 | | --------------------- | ------------------------------------------ | | bin | å˜æ”¾ç€å„ç§äºŒè¿›åˆ¶æ–‡ä»¶ | | config | é…置目录 | | data | 应用数æ®ç›®å½• | | dev | 设备节点 | | etc | /system/etc的软连接 | | init | /system/bin/init的软连接 | | lib | /system/lib的软连接 | | mnt | 挂载目录 | | proc | proc文件系统目录 | | sys | sys文件系统目录 | | sys_prod | æ¤ç›®å½•ä¸åŒè®¾å¤‡ä¸Šå˜åœ¨å·®å¼‚ï¼Œéƒ¨åˆ†è®¾å¤‡æ— æ¤ç›®å½• | | system/app | ç³»ç»Ÿç›®å½•èµ„æº | | system/fonts | 系统文å—èµ„æº | | system/lib | 系统库 | | system/data | ç³»ç»Ÿç›®å½•èµ„æº | | system/usr | ç³»ç»Ÿç›®å½•èµ„æº | | system/profile | ç³»ç»Ÿç›®å½•èµ„æº | | system/bin | ç³»ç»Ÿç¨‹åº | | system/etc | 系统é…ç½® | | vendor/lib/chipsetsdk | 芯片组件目录,目å‰ä»…挂载chipsetsdk | **应用数æ®ç›®å½•访问路径清å•** | 路径å | 备注 | | ---------------------------------- | ------------------------------------------------------------ | | /data | 应用数æ®ç›®å½• | | /data/storage | åº”ç”¨æ•°æ® | | /data/bundles | 所有应用安装目录,仅应用aplæƒé™ä¸ºBASICåŠä»¥ä¸Šæƒé™çš„应用å¯è®¿é—® | | /data/storage/el1 | 应用el1åŠ å¯†çº§åˆ«æ•°æ®ç›®å½• | | /data/storage/el2 | 应用el2åŠ å¯†çº§åˆ«æ•°æ®ç›®å½• | | /data/storage/el1/base | 应用el1åŠ å¯†çº§åˆ«æ•°æ®ç›®å½• | | /data/storage/el1/bundles | 应用el1åŠ å¯†çº§åˆ«åº”ç”¨å®‰è£…åŒ…ç›®å½• | | /data/storage/el1/database | 应用el1åŠ å¯†çº§åˆ«æ•°æ®åº“å˜å‚¨ç›®å½• | | /data/storage/el2/base | 应用el2åŠ å¯†çº§åˆ«æ•°æ®ç›®å½• | | /data/storage/el2/database | 应用el2åŠ å¯†çº§åˆ«æ•°æ®åº“å˜å‚¨ç›®å½• | | /data/storage/el2/auth_groups | 应用el2åŠ å¯†çº§åˆ«æ— è´¦å·åˆ†å¸ƒå¼æ•°æ®èžåˆç›®å½• | | /data/storage/el2/distributedfiles | 应用el2åŠ å¯†çº§åˆ«æœ‰è´¦å·åˆ†å¸ƒå¼æ•°æ®èžåˆç›®å½• | å¯ç”¨åº”用沙箱之åŽï¼Œåº”用命åç©ºé—´å†…æ— æ³•å†è®¿é—®ç‰©ç†è·¯å¾„下数æ®ç›®å½•的访问方å¼ï¼Œè€Œæ˜¯åªèƒ½é€šè¿‡contextæŽ¥å£æ¥è®¿é—®åº”用的数æ®ç›®å½•,具体访问应用数æ®ç›®å½•的方å¼å¯ä»¥é€šè¿‡context接å£è¿›è¡Œè®¿é—®ï¼Œå‚考[适酿µç¨‹](#适酿µç¨‹)ä¸çš„context接å£è®¿é—®é“¾æŽ¥äº†è§£æ›´å¤šç»†èŠ‚ã€‚ åº”ç”¨çš„ç‰©ç†æ•°æ®ç›®å½•跟沙箱数æ®ç›®å½•å˜å‚¨çš„æ˜¯åŒä¸€ä»½åº”用的数æ®ï¼Œé€šè¿‡bind mount技术进行关è”,改动任æ„一处会影å“å¦ä¸€å¤„的数æ®ã€‚应用在命å空间下访问数æ®ï¼Œåªèƒ½é€šè¿‡æ²™ç®±è·¯å¾„æ¥è®¿é—®ï¼Œä¸‹é¢åˆ—出应用的数æ®ç›®å½•在物ç†è·¯å¾„跟沙箱路径下的对应关系。 **应用的数æ®ç›®å½•在物ç†è·¯å¾„跟沙箱路径下的对应关系** | 物ç†è·¯å¾„ | 沙箱路径 | 备注 | | ------------------------------------------------------------ | ---------------------------------- | --------------------------------------- | | /data/app/el1/bundle/public/\<PackageName>\ | /data/storage/el1/bundle | 应用安装包目录 | | /data/app/el1/\<USERID\>/base/\<PACKAGENAME\> | /data/storage/el1/base | 应用el1çº§åˆ«åŠ å¯†æ•°æ®ç›®å½• | | /data/app/el2/\<USERID\>/base/\<PACKAGENAME\> | /data/storage/el2/base | 应用el2çº§åˆ«åŠ å¯†æ•°æ®ç›®å½• | | /data/app/el1/\<USERID\>/database/\<PACKAGENAME\> | /data/storage/el1/database | 应用el1çº§åˆ«åŠ å¯†æ•°æ®åº“目录 | | /data/app/el2/\<USERID\>/database/\<PACKAGENAME\> | /data/storage/el2/database | 应用el2çº§åˆ«åŠ å¯†æ•°æ®åº“目录 | | /mnt/hmdfs/\<USERID\>/account/merge_view/data/\<PACKAGENAME\> | /data/storage/el2/distributedfiles | 应用el2åŠ å¯†çº§åˆ«æœ‰è´¦å·åˆ†å¸ƒå¼æ•°æ®èžåˆç›®å½• | | /mnt/hmdfs/\<USERID\>/non_account/merge_view/data/ | /data/storage/el2/auth_groups | 应用el2åŠ å¯†çº§åˆ«æ— è´¦å·åˆ†å¸ƒå¼æ•°æ®èžåˆç›®å½• | | /mnt/hmdfs/ | /mnt/hmdfs/ | åˆ†å¸ƒå¼æ–‡ä»¶ç³»ç»Ÿç›®å½• | > **说明:**<br>\<USERID\>代表当å‰çš„用户ID > \<PACKAGENAME\>代表当å‰çš„åº”ç”¨åŒ…å æ›´å¤šç‰©ç†è·¯å¾„沙箱路径的对应关系,请访问: https://gitee.com/OpenHarmony/startup_appspawn/blob/master/appdata-sandbox64.json ## 案例:Contacts.hap拨å·åœºæ™¯æ— 法触å‘音频问题 è”系人应用沙箱整改å‰è®¿é—®èµ„æºæ–‡ä»¶çš„æ–¹å¼å¦‚下,å¯ä»¥çœ‹åˆ°è®¿é—®çš„路径是ç»å¯¹è·¯å¾„硬编ç ,为/data/app/el1æ¤ç±»ç›®å½•,而æ¤ç±»ç›®å½•åœ¨åº”ç”¨æ²™ç®±ä¸æ˜¯è®¿é—®å—é™çš„ï¼Œæ‰€ä»¥ä¼šé€ æˆè®¿é—®å¼‚常。  æ¤ä»£ç çš„æ ¸å¿ƒæ˜¯æƒ³é€šè¿‡fileIO接å£open固定路径得到fdNumber,使用fdNumberåŽ»åšæŽ¥ä¸‹æ¥çš„æ–‡ä»¶è®¿é—®ã€‚FileIO是通过路径得到fdNumber的,而现在路径访问已ç»è¢«é™åˆ¶äº†ï¼Œå› æ¤è€ƒè™‘用其他的接å£åŽ»èŽ·å–fdNumberå³å¯ï¼Œ 查阅OpenHarmonyç›¸å…³å¼€å‘æ‰‹å†Œå¾—知,使用resourceManagerå¯ä»¥èŽ·å–fdNumber。 更改åŽçš„代ç 如下:  ## è§„é¿æ–¹æ¡ˆ 如果å‘çŽ°åº”ç”¨å¼‚å¸¸ä¸”å®šä½æ²¡æœ‰ç»“论,å¯ä»¥ä½¿ç”¨å…³é—è¿›ç¨‹æ²™ç®±çš„æ–¹å¼æ¥è§„é¿é—®é¢˜ï¼Œè§„é¿æ–¹å¼å¦‚下: 1. 打开OpenHarmony startup_appspawn仓的æºç ,找到应用沙箱é…ç½®æ–‡ä»¶ï¼Œæ ¹æ®è‡ªå·±ç¼–译类型修改对应的é…ç½®ä»£ç æ–‡ä»¶ã€‚ 32ä½ä¿®æ”¹:https://gitee.com/OpenHarmony/startup_appspawn/blob/master/appdata-sandbox.json 64ä½ä¿®æ”¹:https://gitee.com/OpenHarmony/startup_appspawn/blob/master/appdata-sandbox.json 2. 在json䏿–‡ä»¶æ‰¾åˆ°cameraçš„é…置,在下方å‚ç…§cameraçš„é…置新建一æ¡è‡ªèº«åº”用的é…ç½®ï¼Œå°†åŒ…åæ”¹ä¸ºè‡ªèº«åº”用报åï¼Œå…¶ä»–é¡¹ä¿æŒè·Ÿcamera一致å³å¯ï¼ŒOFFå—æ®µä»£è¡¨å…³é—进程沙箱。 