當前位置:首頁 » 服務存儲 » 外部存儲文件是安全的
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

外部存儲文件是安全的

發布時間: 2023-06-02 05:01:53

⑴ 文件必須存儲在外部磁碟上

是的
所有的文件都存儲在外部存儲器裡面,硬碟、U盤、光碟和軟盤都是外部存儲器而內存無法長久保持數據,是一種隨機存儲器。
存儲器是計算機的第二個子系統。它有一個重要的特性——無限可復制性,即其存放的數據被取出後,原來存放的數據依然存在,所以可以被反復利用。本報告將從存儲器的原理、分類、功能和發展狀況等方面進行探究分析。

⑵ 外部存儲、WRITE_EXTERNAL_STORAGE許可權與maxSdkVersion屬性的使用

最近在項目中發現READ_EXTERNAL_STORAGE配置了maxSdkVersion 屬性,於是決定對maxSdkVersion屬性研究一番。研究過程中涉及好幾個知識點:文件存儲結構、外部存儲許可權、動態許可權申請等。

Android 的文件存儲分為:Internal file storage 和 External file storage。

如果您希望與其他應用共享文件,可以使用 FileProvider。

外部存儲空間中的文件並非始終都能訪問到,因其存儲於外部存儲空間,有可能是從內部存儲中分配出來的虛擬外部存儲,有可能是SD卡存儲。還有可能會移除 SD卡,因此在訪問之前,您應檢查外部存儲目錄及您嘗試訪問的文件是否可用。

市場上有些設備將內部存儲分出虛擬外部存儲,同時還會提供 SD 卡插槽。這意味著這些設備會有兩個不同的外部存儲目錄,因此在將「私有」文件寫入外部存儲時,需要選擇使用哪個目錄。

Android 包含以下訪問外部存儲中的文件的許可權:

從 Android 4.4(API 19)開始,在 「應用特定的目錄(「私有文件目錄」)」 中讀取或寫入文件不再需要任何與存儲相關的許可權。

因此,如果您的應用支持 Android 4.3(API 18)及更低版本, 並且您只想訪問應用特定的目錄(「私有文件目錄」) ,則可以添加 maxSdkVersion 屬性,聲明僅在較低版本的 Android 上請求許可權: (這里可能有坑,會和Android6.0許可權有點小問題,慎用。)

具體說明:

最後關於許可權的結論:
"存儲許可權最好還是都在清單中配置上,而且maxSdkVersion屬性要慎用。"

可能有人會問,我這篇文章說了這么多,好像是都在說廢話,還得出了一個廢話結論,其實我是帶著下面的疑問和設想來研究本文的。
以下幾點是我對外部存儲許可權的理解,本文旨在理清其中一些隱藏細節。

上面是我的理解,歡迎大家指出我理解不對的地方~

參考鏈接:
https://developer.android.google.cn/guide/topics/data/data-storage
https://developer.android.google.cn/training/data-storage/files/external

⑶ android 數據存儲的幾種方式

總體的來講,數據存儲方式有三種:一個是文件,一個是資料庫,另一個則是網路。其中文件和資料庫可能用的稍多一些,文件用起來較為方便,程序可以自己定義格式;資料庫用起稍煩鎖一些,但它有它的優點,比如在海量數據時性能優越,有查詢功能,可以加密,可以加鎖,可以跨應用,跨平台等等;網路,則用於比較重要的事情,比如科研,勘探,航空等實時採集到的數據需要馬上通過網路傳輸到數據處理中心進行存儲並進行處理。 對於Android平台來講,它的存儲方式也不外乎這幾種,按方式總體來分,也是文件,資料庫和網路。但從開發者的角度來講它可以分為以下五種方式: 1.SharedPreferences共享偏好 2.Internal Storage內部存儲空間 3.External Storage外部存儲空間 4.SQLite Database資料庫 5.Internet網路 這幾種方式各自有各自的優點和缺點,要根據不同的實際情況來選擇,而無法給出統一的標准。下面就各種方式談談它們的優缺點,以及最合適的使用情況: 1.Shared Preferences共享偏好 SharedPreferences是用來存儲一些Key/Value類似的成對的基本數據類型,注意,它只能存儲基本數據類型,也即int, long, boolean, String, float。事實上它完全相當於一個HashMap,唯一不同的就是HashMap中的Value可以是任何對象,而SharedPreferences中的值只能存儲基本數據類型(primitive types)。 對於它的使用方法,可以參考Android Developer Guide,這里不重復。 如此來看,最適合SharedPreferences的地方就是保存配置信息,因為很多配置信息都是Key/Value。事實上,在Android當中SharedPreferences使用最多的地方也是用來保存配置(Settings)信息,系統中的Settings中這樣,各個應用中的Settings也是這樣。並且,Android中為了方便的使用SharedPreferences保存配置信息,它來專門有PreferenceActivity用來封裝。也就是說如果你想在應用程序中創建配置(Settings),卜罩你可以直接使用PreferenceActivity和一些相關的專門為Preference封裝的組件,而不用再直接去創建,讀取和保存SharedPreference,Framework中的這些組件會為你做這些事。 再談談一些使用SharedPreference時的技巧,它只能保存基本數據類型,但假如我想保存一個數組,怎麼辦?可以把數據進行處理,把它轉化成一個String,取出的時候再還原就好了;再如,如想保存一個對象,怎麼辦,同樣,可以把對象序列化成為字元序列,或轉成String(Object.toString()),或是把它的HashCode(Object.hashCode())當成Value保存進去。 總之,SharedPreferences使用起來十分的方便,可以靈活應用,因為它簡單方便,所以能用它就盡量不伏喊要用文件或是資料庫。 1.Internal Storage內部存儲空間 所謂的內部存儲與外部存儲,是指是否是手機內置。手機內置的存儲空間,稱為內部存儲,它是手機一旦出廠就無法改變,它也是手機的硬體指標之一,通常來講手機內置存儲空間越大意味著手機價格會越貴(很多地方把它稱為手機內存,但我們做軟體的知道,這並不準確,內存是指手機運行時存儲程序,數據和指令的地方;這里應該是手機內部存儲的簡稱為內存缺弊野,而並非嚴格意義上的內存)。 內部存儲空間十分有限,因而顯得可貴,所以我們要盡可能避免使用;另外,它也是系統本身和系統應用程序主要的數據存儲所在地,一旦內部存儲空間耗盡,手機也就無法使用了。所以對於內部存儲空間,我們要盡量避免使用。上面所談到的Shared Preferences和下面要談到的SQLite資料庫也都是存儲在內部存儲空間上的。 Android本身來講是一個Linux操作系統,所以它的內部存儲空間,對於應用程序和用戶來講就是「/data/data"目錄。它與其他的(外部的存儲)相比有著比較穩定,存儲方便,操作簡單,更加安全(因為可以控制訪問許可權)等優點。而它唯一的缺點就是它比較有限,比較可貴。 雖然,可以非常容易的知道程序本身的數據所在路徑,所有的應用程序的數據路徑都是「/data/data/app-package-name/」,所有的程序用到的數據,比如libs庫,SharedPreferences都是存放在這個路徑下面。但我們在使用的時候最好不要,或是千萬不要直接引用這個路徑。 使用內部存儲主要有二個方式,一個是文件操作,一個是文件夾操作。無論哪種方式,Context中都提供了相應的函數來支持,使用Context不但操作簡單方便,最重要的是Context會幫助我們管理這些文件,也可以方便幫助我們控制文件的訪問許可權。先來系統的說下Context中關於文件和文件夾操作的函數有哪些。 a. 創建一個文件,並打開成一個文件輸出流,需要提供一個String,作為文件名 1.FileOutputStream output = Context.openOutputFile(filename, Context.MODE_PRIVATE); 2.output.write(data);// use output to write whatever you like 3.output.close(); 1.FileOutputStream output = Context.openOutputFile(filename, Context.MODE_PRIVATE); output.write(data);// use output to write whatever you like output.close(); b. 同樣,想打開一個文件作為輸入的話,也是只需要提供文件名 1.FileInputStream input = Context.openInputFile(filename); 2.input.read(); 3.input.close(); 1.FileInputStream input = Context.openInputFile(filename); input.read(); input.close(); c. 列出所有的已創建的文件 1.String[] files = Context.fileList(); 2.for (String file : files) { 3. Log.e(TAG, "file is " + file); 4.} 1.String[] files = Context.fileList(); for (String file : files) { Log.e(TAG, "file is " + file); } d. 刪除文件,能創建就要能夠刪除,當然也會提供了刪除文件的介面,它也非常簡單,只需要提供文件名 1.if (Context.deleteFile(filename)) { 2. Log.e(TAG, "delete file " + filename + " sucessfully「); 3.} else { 4. Log.e(TAG, "failed to delete file " + filename); 5.} 1.if (Context.deleteFile(filename)) { Log.e(TAG, "delete file " + filename + " sucessfully「); } else { Log.e(TAG, "failed to delete file " + filename); } e. 獲取文件已創建文件的路徑,它返回一個文件對象用於操作路徑 1.File fileDir = Context.getFileDir(); 2.Log.e(TAG, "fileDir " + fileDir.getAbsolutePath(); 1.File fileDir = Context.getFileDir(); Log.e(TAG, "fileDir " + fileDir.getAbsolutePath(); f. 創建一個目錄,需要傳入目錄名稱,它返回 一個文件對象用到操作路徑 1.File workDir = Context.getDir(dirName, Context.MODE_PRIVATE); 2.Log.e(TAG, "workdir " + workDir.getAbsolutePath(); 1.File workDir = Context.getDir(dirName, Context.MODE_PRIVATE); Log.e(TAG, "workdir " + workDir.getAbsolutePath(); g. 以File對象方式查看所創建文件,需要傳入文件名,會返迴文件對象 1.File store = Context.openFileStreamPath(filename); 2.Log.e(TAG, "store " + store.length()); 1.File store = Context.openFileStreamPath(filename); Log.e(TAG, "store " + store.length()); h. 獲取Cache路徑,無需要傳入參數,返迴文件對象 1.File cachedir = Context.getCacheDir(); 2.Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath()); 1.File cachedir = Context.getCacheDir(); Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath()); 總結一下文件相關操作,可以得出以下三個特點: 1. 文件操作只需要向函數提供文件名,所以程序自己只需要維護文件名即可; 2. 不用自己去創建文件對象和輸入、輸出流,提供文件名就可以返回File對象或輸入輸出流 3. 對於路徑操作返回的都是文件對象。 如前所述,內部存儲空間有限,可貴,安全,穩定,所以應該用來保存比較重要的數據,比如用戶信息資料,口令秘碼等不需要與其他應用程序共享的數據。也可以用來創建臨時文件,但一定要注意及時刪除。另外,對於內部存儲還有一個非常重要的特點,那就是在應用程序被卸載時,應用程序在內部存儲空間的文件數據將全部被刪除。系統這樣做的原因很簡單,就是因為內部存儲很有限,它必須保證它的可用性,因為一旦添滿,系統將無法再正常工作。 1.External Storage外部存儲空間 再來談談手機外部存儲空間,與內部存儲空間相對,外部存儲空間是指手機出廠的時候不存在,用戶在使用時候可以自由添加的外部存儲介質比如TS卡,SD卡等快閃記憶體儲介質。這些快閃記憶體介質由最初的空間小價格貴,到現在的大容量價格便宜,所以幾乎每個支持外部存儲的手機上面都有大容量(大於等於2G)的快閃記憶體卡。 Android也是不例外,它完全支持外部存儲介質。其實更確切的說,它是要依賴於外部存儲卡的,因為對於Android系統,如果沒有外部存儲卡,很多的系統應用無法使用,比如多媒體相關的應用程序無法使用。雖然Android很依賴,但是外部存儲卡也有它自身的特點,它最大的優點就是存儲空間大,基本上你可無限制的使用,也不怎麼擔心去清除數據。就目前來看,很多程序都在使用外部存儲卡,但很少有程序去主動清理數據,所以無論你的SD卡有多大,它的可用空間卻越來越少。與內部存儲不同的是,當程序卸載時,它在外部存儲所創建的文件數據是不會被清除的。所以清理外部存儲空間的責任丟給了用戶自己,每隔一段時間就去查看下SD卡,發現無用數據立馬刪除。外部存儲的缺點就是不是很穩定,對於Android手機來講可以說,很不穩定,本身快閃記憶體介質就容易出問題,SD卡處於不能正常使用的狀態十分多。 先來說說外部存儲相關的使用方法和API: a. Check media availability檢查介質的可用性 如前所述,外部存儲介質的穩定性十分的差,所以在使用之前一定要先檢查它的可用性,如果可用再去用 view plain to clipboardprint? 1.final String state = Environment.getExternalStorageState(); 2.if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } view plain to clipboardprint? 1.final String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } final String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } b. Get the directory獲取外部存儲卡的路徑 事實上,外部存儲卡的路徑是「/mnt/sdcard",所以你直接這樣寫去訪問也能訪問的到。鑒於可讀性和可移植性的考慮,建議這樣寫: view plain to clipboardprint? 1.File sdcardDir = Environment.getExternalStorageDirectory(); view plain to clipboardprint? 1.File sdcardDir = Environment.getExternalStorageDirectory(); File sdcardDir = Environment.getExternalStorageDirectory(); c. For API 8 or greater, there are some other useful APIs helping to manager files and directories. 如果你使用API 8(Android 2.2)或者更高,那麼SDK中又多了幾個操作外部存儲文件和路徑的介面,文檔中也建議開始者更加規范的使用SD卡。比如,創建相應的目錄去存儲相應的數據,Music,Picture,Video等。應用程序目錄也變成了"/Android/data/package-name/data"。具體的使用可以參考文檔,這里不重復。當然,就像編程規范一樣,這里只是規范,你完全可以不遵守它,但出於可讀性和可移植性,還是建議按照文檔建議的去做。 下面總結一下使用時應該注意的一些和外部存儲的特點: a. 外部存儲卡不是隨時想用就能夠用的,所以一定要記得在使用之前檢查它的可用性 b. 存儲在外部存儲卡上的數據是所有應用程序都可見,用戶也可見(使用FileManager),所以安全性不是很好,雖然文檔聲稱可以在外部存儲卡上寫程序私有數據,但貌似沒用,用FileManager仍然可以刪除或編輯文件(Market上面的FileManager功能都十分的強大,能讓用戶看到SD卡中的所有文件,和操作能看到的文件)。 c. Android手機支持把外部存儲卡Mount至PC做為U盤,當連接數據線時,這時SD卡變成了U盤連接到了另外的操作系統中。什麼意思,就是在Android當中雖然有的文件屬性(隱藏,私有等),到了PC上就不一定管用了,用戶在PC上可以隨意操作文件(這就是第二點中所提及的)。 d. 如果使用外部存儲卡保存數據,一定要額外做好異常處理:外部存儲卡不可用時把數據存入哪裡;可用的時候再怎麼同步數據(這是比較頭疼的地方,可行的做法就是當SD卡不可用時不準用戶寫數據,但這用戶體驗又不是很好,但如你所知,很多應用都這么干);你的數據被破壞了。當然常見的異常也要考慮,比如空間滿了,無法寫入,磁碟壞道等。 1.SQLite Database資料庫 Android對資料庫的支持很好,它本身集成了SQLite資料庫,每個應用都可以方便的使用它,或者更確切的說,Android完全依賴於SQLite資料庫,它所有的系統數據和用到的結構化數據都存儲在資料庫中。 它具有以下優點: a. 效率出眾,這是無可否認的 b. 十分適合存儲結構化數據 c. 方便在不同的Activity,甚至不同的應用之間傳遞數據 先前有一篇文章講到了不同Activity和不同應用之間傳遞數據的麻煩,特別是對於大型數據結構,因為Activity雖是Java對象,但去無法像使用其他類對象那樣去創建一個實例然後使用它,更無法給Activity加上Setters和Getters(雖然這樣做了沒有編譯錯誤)。比較好的解決方案就是把結構化數據寫入資料庫,然後在不同的Activity之間傳遞它們的Uri。 d. 由專門的ContentProvider來幫忙管理和維護資料庫 e. 可以方便的設置訪問許可權,私有還是都可見 f. 操作方便,使用標準的CRUDE語句,ContentResolver.query(), update(), delete() insert(),詳見ContentResolver g. 良好的可移植性和通用性,用標準的SQL語句就能實現CRUDE 對於它的使用方法可以去參考文檔,這里也說不清楚。 1.Internet網路 網路是比較不靠譜的一個,因為移動終端的網路穩定性,以及所產生的流量讓人傷不起,用戶更傷不起。但若是對於非常重要的實時數據,或是需要發送給遠端伺服器處理的,也可以考慮使用網路實時發送。這已經有先例了,Apple和Google就是這樣,iPhone設備和Android設備都會在用戶不知情的情況 下收集用戶的信息,然後又在用戶不知情的情況 下發送到Apple和Google的伺服器上,也就是所謂的「跟蹤門」。除此之外,智能手機(特別是Android和火熱的iPhone)上面的應用程序都會偷偷的在後台運行,收集用戶數據,然後再偷偷的發伺服器,直接傷害是用戶流量,請看先前的文章。 對比這幾種方式,可以總結下: 1. 簡單數據和配置信息,SharedPreference是首選; 2. 如果SharedPreferences不夠用,那麼就創建一個資料庫 3. 結構化數據,一定要創建資料庫,雖然這稍顯煩鎖,但是好處無窮 4. 文件就是用來存儲文件(也即非配置信息或結構化數據),如文本文件,二進制文件,PC文件,多媒體文件,下載的文件等等。 5. 盡量不要創建文件 6. 如果創建文件,如果是私密文件或是重要文件,就存儲在內部存儲,否則放到外部存儲 7. 不要收集用戶數據,更不要發到網路上,雖然你們也有很多無奈。用戶也無奈,也無辜,但更無助 平台為開發者准備了這么多的方式固然是一件好事,但我們要認清每一種的優點和缺點,根據實際情況選擇最合適的。還有一個原則就是最簡單原則,也就是說能用簡單的方式處理,就不要用復雜的方式。比如存儲幾個數據或簡單對象,用SharedPreference也能做到,何必還去寫個ContentProvider呢?

⑷ 安卓內部外部文件存儲

總述

覺得十分有必要搞清楚內存,內部存儲和外部存儲的區別,還有我們在開發中真正將數據存在了手機的哪兒。

先提一個問題:手機設置的應用管理中,每個App下都有清除數據和清除緩存,清除的分別是哪裡的數據?

一 內存,內部存儲和外部存儲

整個存儲空間分為內部存儲和外部存儲兩部分,內部存儲中又包含RAM和ROM等部分。

內部存儲,即InternalStorage,也常說內置存儲卡,這是手機內置的存儲空間,出廠時就被確定,是手機的一個硬體指標。類比電腦的內存。

外部存儲,即ExternalStorage,也常說外置存儲卡,手機出廠時並不存在,是由用戶自由擴展的存儲空間,常見的就是SD卡。類比電腦的外接移動硬碟。
RAM,即常說的運行時內存,是手機運行時存儲數據和指令的地方,注意是運行時內存。類比電腦的內存條。
ROM,用來存放一些系統文件,應用配置和其他數據的地方,是內部存儲中主要存儲區域。類比於Windows電腦的C盤。

上圖中運行內存即RAM,共2G,機身存儲即內部存儲,共8G。
打開手機的文件管理,再點擊手機一項,可以看到下圖:

上圖中箭頭所指的地方,可以進行內部存儲與外部存儲的切換,當前頁為內部存儲下的展示,這只是Android系統存儲數據的一部分而已,大部分數據都對用戶隱藏。至於紅框部分下面繼續講。

二 詳說存儲

一般來說,App軟體大都安裝在內部存儲的ROM區,當然現在也有辦法安裝在SD卡上,但這需要App自身支持及SD卡分區等一系列操作,下面討論的App是安裝在ROM區的。

以Genymotion模擬器設備為例來分析,型號是三星GalaxyS5。直接使用AndroidStudio的DDMS,打開File Explorer,我們可以看到下圖:

這張圖是手機根目錄下的完整目錄結構圖,內外部存儲均包含在內。不過有些文件內容需要root許可權才能看到。

上面展示的內部存儲圖就是其中一部分子目錄。

選其中幾個重要的文件夾介紹。

2.1 /data包:主要存儲手機應用的相關數據。

如上圖的二級目錄中,/data/app文件夾下存放三方應用的apk文件;/data/data文件夾下存放系統應用和三方應用的包私有數據,每個應用都有獨屬於自己的包。

選一個三方應用包——com.X.main,來分析三級目錄——/data/data/com.X.main下都有什麼數據:

由包名不難看出:cache包存放緩存數據,databases包存放使用SQLite存儲的數據,files包存放普通數據(log數據,json型數據等),shared_prefs包存放使用SharedPreference存放的數據。這些包都是由系統創建的。

2.2 /mnt/sdcard/storage包:這三個包,與手機的部分內置存儲卡數據和外置存儲卡數據有關。

上面的完整目錄結構圖中有其子目錄信息展示。

以內置存儲卡來說,通常用sdcard0表示:Android4.1上,首先掛載到目錄/storage/sdcard0上面,/sdcard和/mnt/sdcard都只是指向/storage/sdcard0的軟鏈接;Android4.2上,首先掛載到目錄/storage/emulated/0(0就表示內置存儲)上面,為兼容之前版本,又掛載到/storage/emulated/legency上面,/storage/sdcard0、/sdcard和/mnt/sdcard都只是指向/storage/emulated/legency的軟鏈接。(掛載相當於真正位置,軟鏈接相當於指針)。

/mnt/sdcard是Android2.2及之上版本使用,/sdcard是Android2.1及之下版本使用。

在手機的文件管理中看到的內置存儲卡文件,如上面文件管理頁面的圖,就是/storage/emulated /0包的子目錄,Android包的路徑就是:/storage/emulated/0/Android。

2.3 其他
/dev包:Linux系統的常規文件夾。
/system包:系統配置的文件夾,比如Android系統框架(framework)、底層類庫(lib)、字體(font)等。

三 存儲相關操作

在Android開發中,我們常打交道的存儲空間有三部分。

一是根目錄下路徑為 /data/data/包名/XX 的文件。開發中SQLite數據、SharedPreference數據均保存在這里,雖說我們可以讀寫操作,但這部分空間由系統維護。

二是在外置存儲卡上做存儲。暫時不講。

三是在內置存儲卡中做存儲。在/storage/emulated/0/Android/data包下或與/storage/emulated/0/Android包同級目錄上,建立App包存儲數據,這部分空間均由開發者維護。區別在於/storage/emulated/0/Android/data包下的數據為私有目錄數據,會隨App卸載被清除,與/storage/emulated/0/Android包同級的數據(如系統目錄DCIM包,DOWNLOWN包和bluetooth包,還有下圖中的包)屬於公有目錄數據,不會隨App卸載被清除,這就會造成數據的卸載殘留。

Google官方建議開發者將App的數據存儲在私有目錄即/storage/emulated/0/Android/data包下,這樣卸載App時數據會隨之被系統清除,不會造成數據殘留。

對存儲空間進行操作,首先要獲取存儲空間的存儲路徑,對此Android提供了Environment類和Context類來獲取路徑。

就上面對存儲空間的劃分,第一部分空間對用戶不可見,是在具體包名下的,和特定的App有關,所以對這些數據的訪問需調用Context類中的方法;第三部分空間對用戶可見,私有目錄數據仍與特定App有關,需調用Context類中的方法,而公有目錄數據與App無關,應調用Environment類中的方法。

總結如下圖:

寫了個小程序對Environment類和Context類相關方法測試,如下圖:(冒號前為方法名,冒號後為輸出結果)

四 回答最初提出的問題

手機設置的應用管理中,每個App下都有清除數據和清除緩存,清除的分別是哪裡的數據?

還是用上面的Genymotion模擬器設備來分析,主要測試三部分數據:

內部數據:/data/data/包名/XXX

外部私有數據:/storage/emulated/0/Android/data/包名/XXX

外部公有數據:/storage/emulated/0/包名/XXX

測試結果圖就不上了,直接上結論:
清除緩存:將外部私有數據下的cache包(/storage/emulated/0/Android/data/包名/cache)清除,將內部數據下的cache包下的內容(/data/data/包名/cache/XXX)清除 。

清楚數據:將外部私有數據包(/storage/emulated/0/Android/data/包名)清除,將內部數據下的所有內容(/data/data/包名/XXX)清除;

而兩種操作對外部公有數據均無影響。