一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Unity3D各平臺Application.xxxPath的路徑

 文清陽 2018-01-26

前幾天我們游戲在一個同事的Android手機(jī)上啟動時無法正常進(jìn)入,經(jīng)查發(fā)現(xiàn)Application.temporaryCachePath和Application.persistentDataPath返回空字符串。便花時間認(rèn)真研究了一下Unity3D的路徑問題。我們常用的是以下四個路徑:

Application.dataPath
Application.streamingAssetsPath
Application.persistentDataPath
Application.temporaryCachePath
根據(jù)測試,詳細(xì)情況如下:


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都是在一個沙盒空間中運(yùn)行,每個app也有一個獨(dú)立的數(shù)據(jù)存儲空間,各app彼此不能互相訪問、打擾。

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

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

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

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

下面是各路徑對應(yīng)的OC訪問方法
app安裝路徑: [[NSBundle mainBundle] resourcePath]
app數(shù)據(jù)沙盒存儲根目錄: 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有點(diǎn)類似,簡單說一下。Android的幾個目錄是apk程序包、內(nèi)存存儲(InternalStorage)和外部存儲(ExternalStorage)目錄。

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

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

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

????私有目錄在/storage/emulated/n/Android/data/package name/,打開可以看到里面有兩個文件夾cache和files。為什么跟內(nèi)部存儲目錄重復(fù)了?這是為了更大的存儲空間,以防內(nèi)存存儲空間較小。推薦把不需要隱私的、較大的數(shù)據(jù)存在這里,而需要隱私的或較小的數(shù)據(jù)存在內(nèi)部存儲空間。

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

理解了Android存儲的原理,最后來說說開頭提到的bug,Application.temporaryCachePath/persistentDataPath返回空字符串。這其實(shí)因?yàn)闄?quán)限的原因,app沒有聲明訪問外部存儲空間的權(quán)限,但是Application.temporaryCachePath/ ApplicationpersistentDataPath卻想返回外部存儲的路徑。這是Unity3D的bug,沒有權(quán)限本應(yīng)該拋出一個異常或者錯誤,讓開發(fā)者知道原因。

經(jīng)反復(fù)測試發(fā)現(xiàn),有【外置SD卡】的設(shè)備上,如果聲明讀/寫外部存儲設(shè)備的權(quán)限,會返回外部存儲路徑,不聲明則會返回內(nèi)部存儲路徑,這樣不會有問題。而在【無外置SD卡】的設(shè)備上,不管是否聲明讀/寫外部存儲設(shè)備的權(quán)限,Application.temporaryCachePath/persistentDataPath都返回外部存儲路徑,但是又沒有權(quán)限,就可能會導(dǎo)致返回null了,之所以說可能是因?yàn)檫@個bug不是必現(xiàn),如果出現(xiàn)了設(shè)備重啟之后就好了,懷疑是linux設(shè)備mount問題。但是出了問題,我們不能跟用戶說你重啟一下手機(jī)就好了。

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

Windows:

Application.dataPath:????????????應(yīng)用的appname_Data/
Application.streamingAssetsPath: 應(yīng)用的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


參考:

  1. iOS Data Storage Guidelines
  2. Android API: Storage Options
  3. 徹底理解Android中的內(nèi)部存儲與外部存儲

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    狠狠做深爱婷婷久久综合| 日韩免费午夜福利视频| 五月婷婷六月丁香亚洲| 99视频精品免费视频| 亚洲婷婷开心色四房播播| 国产精品欧美在线观看| 免费福利午夜在线观看| 亚洲国产91精品视频| 欧美一级黄片免费视频| 日韩精品视频高清在线观看| 国产一区二区在线免费| 国产一区二区不卡在线视频| 欧美激情一区=区三区| 国产欧美日韩视频91| 天堂网中文字幕在线视频| 欧美日韩中黄片免费看| 国产成人午夜福利片片| 午夜福利黄片免费观看| 尹人大香蕉中文在线播放| 久热在线视频这里只有精品| 亚洲一区二区久久观看| 丝袜人妻夜夜爽一区二区三区| 黄色国产精品一区二区三区| 高清在线精品一区二区| 日韩人妻毛片中文字幕| 国产精品成人免费精品自在线观看| 日韩中文字幕视频在线高清版 | 欧美精品二区中文乱码字幕高清| 麻豆蜜桃星空传媒在线观看 | 成人欧美一区二区三区视频| 国产精品欧美日韩中文字幕| 欧美国产精品区一区二区三区| 亚洲专区一区中文字幕| 高潮少妇高潮久久精品99| 麻豆一区二区三区精品视频| 久久精品a毛片看国产成人| 国产精品亚洲精品亚洲| 国产精品国产亚洲看不卡| 色婷婷久久五月中文字幕| 殴美女美女大码性淫生活在线播放| 黄片在线免费观看全集 |