Unity3D各平臺Application.xxxPath的路徑

iOS:

Application.dataPath            /var/containers/Bundle/Application/app sandbox/xxx.app/Data 
Application.streamingAssetsPath /var/containers/Bundle/Application/app sandbox/test.app/Data/Raw 
Application.temporaryCachePath /var/mobile/Containers/Data/Application/app sandbox/Library/Caches 
Application.persistentDataPath  /var/mobile/Containers/Data/Application/app sandbox/Documents

iOS和Mac OS X不同於Windows,app都是在一個沙盒空間中運行,每個app也有一個獨立的數據存儲空間,各app彼此不能互相訪問、打擾。

dataPath是app程序包安裝路徑,app本身就在這裏,此目錄是隻讀的。streamingAssetsPath是dataPath下的Raw目錄。

app的獨立數據存儲目錄下有三個文件夾:Documents,Library和tmp。 
Documents目錄,這個目錄用於存儲需要長期保存的數據,比如我們的熱更新內容就寫在這裏。需要注意的是,iCloud會自動備份此目錄,如果此目錄下寫入的內容較多,審覈的可能會被蘋果拒掉。

Library目錄,這個目錄下有兩個子目錄,Caches和Preferences。 
    Caches是一個相對臨時的目錄,適合存放下載緩存的臨時文件,空間不足時可能會被系統清除,Application.temporaryCachePath返回的就是此路徑。我把熱更新的臨時文件寫在這裏,等一個版本的所有內容更新完全後,再把內容轉移到Documents目錄。 
    Preferences用於應用存儲偏好設置,用NSUserDefaults讀取或設置。

tmp目錄,臨時目錄,存放應用運行時臨時使用的數據。 
需要注意的是,以上無論臨時、緩存或者普通目錄,如果不需要的數據,都請刪除。不要佔用用戶的存儲空間,像微信就是壞榜樣。

下面是各路徑對應的OC訪問方法 
app安裝路徑: [[NSBundle mainBundle] resourcePath] 
app數據沙盒存儲根目錄: NSHomeDirectory() 
Documents: NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 
Library:     NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) 
Caches:     NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) 
tmp:        NSTemporaryDirectory()

================================================================================================

Android:

Application.dataPath            /data/app/package name-1/base.apk 
Application.streamingAssetsPath jar:file:///data/app/package name-1/base.apk!/assets 
Application.temporaryCachePath /storage/emulated/0/Android/data/package name/cache 
Application.persistentDataPath   /storage/emulated/0/Android/data/package name/files

看Android上的路徑,跟iOS有點類似,簡單說一下。Android的幾個目錄是apk程序包、內存存儲(InternalStorage)和外部存儲(ExternalStorage)目錄。

apk程序包目錄: apk的安裝路徑,/data/app/package name-n/base.apk,dataPath就是返回此目錄。

內部存儲目錄: /data/data/package name-n/,用戶自己或其它app都不能訪問該目錄。打開會發現裏面有4個目錄(需要root) 
    cache 緩存目錄,類似於iOS的Cache目錄 
    databases 數據庫文件目錄 
    files 類似於iOS的Documents目錄 
    shared_prefs 類似於iOS的Preferences目錄,用於存放常用設置,比如Unity3D的PlayerPrefs就存放於此

外部存儲目錄: 在內置或外插的sd上,用戶或其它app都可以訪問,外部存儲目錄又分私有和公有目錄。 
    公有目錄是像DCIM、Music、Movies、Download這樣系統創建的公共目錄,當然你也可以像微信那樣直接在sd卡根目錄創建一個文件夾。好處嘛,就是卸載app數據依舊存在。

    私有目錄在/storage/emulated/n/Android/data/package name/,打開可以看到裏面有兩個文件夾cache和files。爲什麼跟內部存儲目錄重複了?這是爲了更大的存儲空間,以防內存存儲空間較小。推薦把不需要隱私的、較大的數據存在這裏,而需要隱私的或較小的數據存在內部存儲空間。

下面是各路徑對應的Java訪問方法: 
apk包內: AssetManager.open(String filename) 
內部存儲: context.getFilesDir().getPath() or context.getCacheDir().getPath() 
外部存儲: context.getExternalFilesDir(null).getPath() or context.getExternalCacheDir().getPath()

理解了Android存儲的原理,最後來說說開頭提到的bug,Application.temporaryCachePath/persistentDataPath返回空字符串。這其實因爲權限的原因,app沒有聲明訪問外部存儲空間的權限,但是Application.temporaryCachePath/ ApplicationpersistentDataPath卻想返回外部存儲的路徑。這是Unity3D的bug,沒有權限本應該拋出一個異常或者錯誤,讓開發者知道原因。

經反覆測試發現,有【外置SD卡】的設備上,如果聲明讀/寫外部存儲設備的權限,會返回外部存儲路徑,不聲明則會返回內部存儲路徑,這樣不會有問題。而在【無外置SD卡】的設備上,不管是否聲明讀/寫外部存儲設備的權限,Application.temporaryCachePath/persistentDataPath都返回外部存儲路徑,但是又沒有權限,就可能會導致返回null了,之所以說可能是因爲這個bug不是必現,如果出現了設備重啓之後就好了,懷疑是linux設備mount問題。但是出了問題,我們不能跟用戶說你重啓一下手機就好了。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


================================================================================================

Windows:

Application.dataPath:            應用的appname_Data/ 
Application.streamingAssetsPath: 應用的appname_Data/StreamingAssets 
Application.temporaryCachePath: C:\Users\username\AppData\Local\Temp\company name\product name 
Application.persistentDataPath:   C:\Users\username\AppData\LocalLow\company name\product name

參考:

iOS Data Storage Guidelines
Android API: Storage Options
徹底理解Android中的內部存儲與外部存儲
PS. 如果你對各平臺文件管理或熱更新有興趣,歡迎一起討論。
--------------------- 
作者:_夜風_ 
來源:CSDN 
原文:https://blog.csdn.net/ynnmnm/article/details/52253674 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章