iOS APP沙盒目錄

weixin_33912445發表於2017-08-18

思維導圖

1859399-63f144db4b8003f8.png
思維導圖(精簡版)
  • Xmind原始檔以及完整版請前往 Lionsom

一、UNIX作業系統的常見目錄結構

     /:根目錄,以斜槓表示,其他所有檔案和目錄在根目錄下展開。

     /bin:"binary"的簡寫,存放提供使用者級基礎功能的二進位制檔案,如ls、ps等。

     /boot:存放能使系統成功啟動的所有檔案。iOS中此目錄為空。

     /dev:"device"的簡寫,存放BSD裝置檔案。每個檔案代表系統的一個塊裝置或字元裝置,一般來說,“塊裝置”以塊為單位傳輸資料,如硬碟;而“字元裝置”以字元為單位傳輸資料,如調變解調器。

     /sbin:"system binaries"的簡寫,存放提供系統級基礎功能的二進位制檔案,如netstat、reboot等。

     /etc:"Et Cetera"的簡寫,存放系統指令碼及配置檔案,如passwd、hosts等。在iOS中,/etc是一個符號連結,實際指向/private/etc。

     /lib:存放系統庫檔案、核心模組及裝置驅動等。iOS中此目錄為空。

     /mnt:"mount"的簡寫,存放臨時的檔案系統掛載點。iOS中此目錄為空。

     /private:存放兩個目錄,分別是/private/etc和/private/var。

     /tmp:臨時目錄。在iOS中,/tmp是一個符號連結,實際指向/private/var/tmp。

     /usr:包含了大多數使用者工具和程式。/usr/bin包含那些/bin和/sbin中未出現的基礎功能,如nm、killall等;/usr/include包含所有的標準C標頭檔案;/usr/lib存放庫檔案。

     /var:"variable"的簡寫,存放一些經常更改的檔案,比如日誌、使用者資料、臨時檔案等。其中/var/mobile和/var/root分別存放了mobile使用者和root使用者的檔案,是重點關注的目錄。

二、iOS 獨有的目錄

  • /Applications : 存放所有系統app和來自Cydia的App,但是不包含App Store下載的App
1859399-4156976cef51a6c0.jpg
Applications.jpg
  • /Developer : 如果一臺裝置連線Xcode後被指定位呼叫用機,Xcode會在這個目錄生產一些除錯工具和資料
1859399-d93c7ac16533fd8c.jpg
/Developer
  • /Library :存放一些提供系統支援的資料,其中/ Library/MobileSubstrate下存放基於Cydiasubstrate的外掛。
1859399-c47b4bcc6d1affaa.jpg
Library
  • /Syetem/Library : 存放大量系統元件

    • /Systen/Library/Frameworks : 日常使用的各類框架
    • /Systen/Library/PrivateFrameworks : 蘋果未公開的私有框架
  • /System/Library/CoreServices裡的SpringBoard.app:iOS桌面管理器(類似於Windows裡的explorer),是使用者與系統交流的最重要中介。

  • /User:使用者目錄(其實就是mobile使用者的home目錄),實際指向/var/mobile,這個目錄裡存放大量使用者資料,比如:

    • /var/mobile/Media/DCIM 下存放照片;
    • /var/mobile/Media/Recordings 下存放錄音檔案;
    • /var/mobile/Library/SMS 下存放簡訊資料庫;
    • /var/mobile/Library/Mail 下存放郵件資料。
    • /var/mobile/Containers存放StoreApp
      • /var/mobile/Containers/Bundle :存放APP的執行檔案和相關資源
      • /var/mobile/Containers/Data:存放資料,沙盒目錄的真實目錄
    • NSString *directory = NSHomeDirectory(); //獲取沙盒根目錄
1859399-93dc5140431b57d6.jpg
/User == /var/mobile

三、iOS應用(Store App)沙盒目錄

出於安全考慮,iOS系統把每個應用以及資料都放到一個沙盒(sandbox)裡面,應用只能訪問自己沙盒目錄裡面的檔案、網路資源等(也有例外,比如系統通訊錄、照相機、照片等能在使用者授權的情況下被第三方應用訪問)

1859399-4f252763421b6044.png
沙盒原理
  • Application Bundle 包含應用可執行檔案和資原始檔
如獲取iOS上微信程式的Bundle路徑,可以通過ps -e | grep  appname  
luz-iphone:/ root# ps -e | grep WeChat
1368 ??         5:41.43 /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat
  • Application Data 包含App執行生產的資料和配置資訊等
如獲取iOS上微信程式的Date路徑,可以通過cycript工具
luz-iphone:~ root# cycript -p WeChat
cy# directory = NSHomeDirectory()
@"/var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE"
cy#

Data目錄結構如下:

luz-iphone:/var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE root# ls
Documents/  Library/  tmp/

-- MyApp.app 該目錄包含了應用程式本身的資料,程式打包的時候的資原始檔和一些本地檔案就是存放在這個目錄下的。 程式的可執行程式、plist檔案也在這個目錄下。 這個目錄不會被iTunes同步

-- Document 存放應用執行時生成的並且需要儲存的資料。注:iTunes或iCloud同步裝置時會備份該目錄

-- Library/Caches 存放應用執行時生成的並且需要儲存的資料。iTunes或iCloud不同步。

-- Library/Preferences 存放偏好設定。iOS的偏好設定(settings)應用也會在該目錄查詢應用的設定資訊。NSUserDefaults儲存在該目錄下。iTunes或iCloud同步裝置時備份該目錄。

-- tmp 存放應用執行時所需的臨時資料。當某個應用沒執行時,iOS系統可能會清除該目錄下的檔案。但不可依賴這種自動清除機制,應該及時手動清除。

  • 獲取主要目錄路徑的方式
    // 沙盒目錄
    NSLog(@"%@",NSHomeDirectory());
    
    // MyApp.app
    NSLog(@"%@",[[NSBundle mainBundle] bundlePath]);
    
    // tmp
    NSLog(@"%@",NSTemporaryDirectory());
    
    // Documents
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docPath = [paths objectAtIndex:0];
    NSLog(@"%@",docPath);
    
    // Library
    NSArray *paths_1 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *libPath = [paths_1 objectAtIndex:0];
    NSLog(@"%@",libPath);

// 沙盒目錄
  /var/mobile/Containers/Data/Application/0BFBB3FE-0FD0-46CB-ADDE-DDE08F6D62C3
// MyApp.app
  /var/containers/Bundle/Application/3CBD3C13-B3B3-4FBA-8616-8D7CB4D8563B/FutureDoctor.app
// tmp
  /var/mobile/Containers/Data/Application/0BFBB3FE-0FD0-46CB-ADDE-DDE08F6D62C3/tmp/
// Documents
  /var/mobile/Containers/Data/Application/0BFBB3FE-0FD0-46CB-ADDE-DDE08F6D62C3/Documents
// Library
  /var/mobile/Containers/Data/Application/0BFBB3FE-0FD0-46CB-ADDE-DDE08F6D62C3/Library

相關文章