Android Device Monitor 文件管理的常見問題

Android Device Monitor 是 Android Studio 中用於監測模擬器或真機運行狀態的一款開發者工具。但開發者在使用它的過程中往往會遇到很多問題,尤其對於新手。本文分析了實際學習中遇到的問題,包括:1. File Explorer 不顯示文件;2. 無權訪問 data 等文件; 3. 無權下載文件等,涉及到 Monitor 的基本操作以及 adb shell 和命令行的操作等。

背景

最近在看《第一行代碼》(第二版)中關於數據存儲方案的介紹。數據的狀態分爲兩種:瞬時狀態和持久狀態,一般保存在內存中的數據隨着活動的關閉,數據也就銷燬了,如果我們想保存這些數據,該怎麼辦呢?書中介紹了三種實現數據持久化的方法,分別是:文件存儲,SharedPreference 存儲以及數據庫存儲。

在學習第一種數據持久化方法文件存儲的時候,我們通過 Context 類中的 openFileOutput() 方法創建一個指定了保存路徑的 FileOutputStream 對象 out,然後用這個 out 對象去創建一個 OutputStreamWriter 對象,之後再用這個 OutputStreamWriter 對象創建一個 BufferedWriter 對象 writer,我們就是通過這個 writer 的 write() 方法向文件輸出流寫入我們想要保存的數據的。文件寫入數據之後默認保存在 /data/data/(package name)/files 目錄下。我們可以通過 Android Studio 中的 Android Device Monitor 去查看,Android Device Monitor 的打開方法如下所示。


打開 Android Device Monitor

問題1:設備 Offline, File Explorer 空空如也

打開 Android Device Monitor 之後,發現裏面什麼都沒有,左邊的面板上顯示了一臺模擬器,但出於 offline 狀態,不對呀,我的模擬器命名開着的呀,它正在運行我剛剛寫的 app 呢,怎麼這裏會顯示離線狀態呢?於是我試着 Google 去找解決方案。


File Explorer 不顯示文件

在 StackOverflow 上我發現了有人和我一樣也碰到了這個問題,不過底下的回答寥寥無幾,我找到了一個最高讚的答案(其實也就一個贊....),如下圖所示,他的意思是他也不明白其中的具體原理,但是他發現如果先打開 Android Device Monitor,然後再運行模擬器,就可以解決這個問題。


解決 File Explorer 不顯示文件(from SO)

於是我按照這個方法嘗試,先打開 Android Device Monitor,裏面什麼也沒有,然後打開模擬器,隨着模擬器的啓動,Monitor 左側面板出現了 offline 的模擬器,然後再相繼啓動很多服務,最後就顯示爲 online 了,如下圖所示,這樣我們就可以通過 Monitor 中的 File Explorer 標籤訪問模擬器中的文件了。


解決 File Explorer 不顯示文件

問題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 了…)。我們來看看結果:

修改後的文件訪問權限

問題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 一下,臥槽!!成功了,真是踏破鐵鞋無覓處,得來全得靠姑姑(谷歌)。


文件下載成功

總結

總結一下吧,初次使用 Android Device Monitor,本來只是用來輔助學習 SQLite,結果一上午碰到一大堆問題,總算都一一解決了,在此總結一下。

  1. Android Device Monitor 要在模擬器運行之前就打開,這樣纔不會出現模擬器設備 offline 的問題。

  2. Android Device Monitor 和 Instant Run 貌似有衝突,在用 Android Device Monitor 時關閉 Instant Run 功能。我相信還有更好的解決方法,不然打開一個大一點的 APP,不能同時用這兩個功能,那多影響效率啊。只是我目前還處於學習階段,上述方案能解決我當前的問題,不影響我進一步學習,那它就是 OK 的。

  3. 操作 Android Device Monitor 時,應該默認把你當做其他人(other)對待,所以你對文件的訪問權限很受限制。解決方法是在命令行中,通過在 adb shell 裏獲取 root 權限,並更改相應文件的訪問權限,當然記得將 adb 所在目錄添加進環境變量。

  4. 能訪問了但是不能下載也是很麻煩的事,通過在命令行運行 adb root 獲取文件的下載權限

  5. 通過上述操作之後,就能正常使用 Android Device Monitor 進行文件管理了。但不幸的是,當你重啓模擬器,或啓動另一臺模擬器時,這些配置又得重新來過,否則你還是無法訪問和下載模擬器中的文件。這個問題的根源在於權限二字,問題不是不能獲取權限(通過 adb shell 可以獲取 root 權限),而在於獲取權限太麻煩了,希望後續版本的 Android Studio 可以直接在 Android Device Monitor 的 GUI 中設置相應獲取權限的命令,使得廣大 Android 開發者對模擬器中的文件操作更有效率。

  6. Google 大法好

  7. 作者 knightaoko

發佈了41 篇原創文章 · 獲贊 145 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章