1. 程式人生 > >DDMS File Explorer 中的檔案無法訪問和匯出pull

DDMS File Explorer 中的檔案無法訪問和匯出pull

問題2:File Explorer 中的檔案無法訪問

還記得剛剛說的嗎,openFileOutput() 方法生成的檔案存放在一個預設路徑,即 /data/data/(package name)/files 下。由於我的包名是 com.knightaoko.filepersistencetest,所以在下文的敘述中,大家看到這個陌生的字串不要驚訝,實際操作下替換成你自己的包名即可。(這期間還碰到個問題,好像 Android Device Monitor 不能和 Instant Run 同時執行,所以在此需要把 Instant Run 功能關閉,怎麼關閉大家自行 Google,很簡單的。)於是,下一步當然是開啟這個路徑了,找到 data,點選,沒反應,再點選,還是沒反應。又遇到問題了,我無法訪問 data 目錄,通過 Google 搜尋,我知道了 File Explorer 中的每個檔案和資料夾都是有訪問許可權的,如下圖紅框中標識的就是 data 資料夾的訪問許可權。


無權訪問

訪問許可權是 drwxrwx--x,這玩意是什麼意思呢?我相信,學過 Linux 的同學肯定一眼就知道這是什麼意思。不知道也沒關係,聽我慢慢道來,這一個字串一共有 10 個字元,第一個字元表示是資料夾還是目錄,如果第 1 個字元是 d,則表示是資料夾。後面 9 個字元可以分為三組,第一組 rwx 表示所有者(user)對檔案的訪問許可權,r 表示可讀(read),w 表示可寫(write),x 表示可被執行,- 表示沒有該許可權;第二組 rwx 表示組群(group)對檔案的訪問許可權;第三組 --x 表示其他人(other)對檔案的訪問許可權,可以看到,沒有 r 和 w,說明 data 對其他人來說是不可讀不可寫的,怪不得我們不能開啟它呢,那怎麼辦呢?於是我又網上搜啊搜,發現可以通過一定的方法修改檔案的訪問許可權的,對,這個方法就是 adb shell。

adb shell 是 Android SDK 中的一個工具,你可以在你的 Android SDK 目錄下的 platform-tools 找到它,下圖就是我電腦上的該目錄:


adb 所在目錄

我們需要將這個目錄新增到環境變數,為的是後面在命令列直接呼叫 adb 中的命令。比如在此我將 D:\AndroidSDK\platform-tools 新增到環境變數(具體怎麼新增應該不用手把手教學了吧)後,執行 cmd 命令列,然後輸入下面的命令。


通過 adb shell 獲取檔案訪問許可權
  • adb shell 是開啟 adb 外殼程式。
  • su 是獲取 root 許可權,只有 root 許可權才能修改檔案的訪問許可權。
  • 底下一堆 chmod 777 是把對應的檔案或資料夾的訪問許可權的後 9 位設定成 rwxrwxrwx,777 就三個二進位制 111, 喝起來就是 111111111(9 個 1),即相當於把後 9 位訪問許可權都置 1,於是就成了 rwxrwxrwx,即所有使用者都具有該檔案的全部訪問許可權(媽媽再也不用擔心我打不開 data 了…)。我們來看看結果:

我這裡挑選一條來分析:

adb push <local> <remote>    - copy file/dir to device    

這就是adb push的使用方法了,這個不用我解釋,大家都懂吧。

下面介紹如何使用這個命令:

假設你的檔案在D盤的根目錄下,比如D:\file.txt

進入DOC後,使用命令:adb push D:\file.txt  /system/temp/

意思是將Windows下D盤根目錄下的file.txt檔案拷貝到小機(手機或者平板)的/system/temp/目錄下。

你在執行這條命令時,可能會遇到failed to copy  'D:\file.xtxt' to '/system/temp/' : Read-only file system 的報錯資訊。

怎麼解決呢?很簡單,使用下面這條命令:

先退出adb,再remount!!!

adb remount

它的意思是將裝置改為可讀可寫。

 adb remount    - remounts the /system partition on the device read-write

看到remount succeeded後,就可以再次執行:adb push D:\file.txt  /system/temp/  這樣就可以成功了,就可以在小機的/system/temp/目錄下看到file.txt檔案了。

如果你要將小機的檔案拷貝到電腦上來,那就執行adb pull命令,這很簡單了吧?

修改後的檔案訪問許可權

問題3:File Explorer 中的檔案無法 pull(下載)

可以看到這些目錄都能訪問了,可以在包名目錄下看到生成的 data 檔案了,下一步我們想把這個檔案複製到我們的電腦裡,怎麼操作呢?選中該檔案,點選右上角的 pull 圖示即可,如下圖所示:


檔案下載按鈕

點選之後,選好儲存路徑。結果我們發現檔案並沒有儲存下來,在 Console 視窗還提示了錯誤:


檔案下載出錯

意思就是拉取檔案失敗,因為你無權進行該操作。又是一臉懵逼,怎麼辦?還能怎麼辦,繼續 Google 唄!這裡我找了很久,終於發現瞭解決方案:adb root 。沒錯,在命令列輸入這條語句,完美解決!(注意是在 windows 下的命令列,而不是 adb shell 裡,當然前提是你添加了 adb 的目錄到你的環境變數裡)


通過 adb root 獲取檔案下載許可權

然後我們再來 pull 一下,臥槽,崩潰了,又發現問題了:Failed to pull selection。


檔案下載再次出錯

怎麼辦?OK,繼續 Google,在 StackOverflow 裡找到了一個高讚的解決方法:


重新選擇模擬器(from SO)

什麼意思?重新選擇一下 Android Device Monitor 左側面板的裝置即可,沒錯!就是把下圖紅框中國的玩意兒點一下。


重新選擇模擬器

好了,我們再找到剛剛那個要拷貝的檔案,pull 一下,臥槽!!成功了,真是踏破鐵鞋無覓處,得來全得靠姑姑(谷歌)。


檔案下載成功