看完了這篇文章,就進入 Android 的內部了
adb shell 命令
shell 命令的指的是:進入到設備內,然後執行的命令;
用大白話講,就是“給手機下達指令”。
怎麼進入?
<code>adb shell>>/<code>
這樣就進入了,然後就可以給他下達指令了。
好了,回顧一下,上一節,我們使用了
adb shell dumpsys
命令獲得了 手機上安裝的應用的一些信息
這裡面用到了 shell,只不過,他是在“電腦端” “傳遞命令”進入“手機”,然後獲取到的信息;
現在我們直接“進入設備”,然後“下達指令”。
當然,這裡的前提是你的設備最好是 “root” 之後的,否則一些命令就會出現 “permission denied” 的問題
進入正題
1、dumpsys 命令
這個命令等同於上節提到的對應的命令,功能是等效的,所以這裡不再贅述。
2、run-as
在手機中查看指定 包名的 應用的數據,適用於 非 root 的手機。
但是這裡注意一下,不能用於查看“上架到應用市場的app”。
為什麼呢?
因為這些 app 是正式版本的,不是 debug 版本的,如果你執意操作的話:
比如像通過這個命令查看「瑞幸」的app數據,
執行
run-as com.lucky.luckyclient
他會報錯錯誤
如下圖所示:
爆出了:
run-as:package not debuggable:com.lucky.luckyclient
的問題。
所以需要注意的是:
利用 run-as 能查看的是屬於你自己開發的 app ,並且安裝到 android 手機上面的應用是 debug 版本的應用才可以。
3、ps
哈哈哈,不是 photoshop
他是:查看設備的進程信息,或者查看指定進程的線程信息。
使用方法:
直接使用 ps 查看所有進程
如圖
這樣,就拿到了所有進程的信息
查看進程信息,可以通過 |grep 去過濾信息。
ps |grep 過濾內容
從上面的圖片我們看到,terminal列出了系統、應用的一些進程信息,我們可以找一個單獨看,那麼就可以使用 |grep去過濾這些內容了。
ps |grep smpboot_th
得到下面的結果:
這樣做的好處是,看的更加清晰了。
查看指定進程下的線程信息
使用方法
ps -t 進程id
從第一種方法中,看到了 smpboot_th的其中一個進程 id 是 3。
如圖
的進程id,下面我們直接拿
使用
ps -t 3 獲取 pid 為 3 的 線程信息。
看下結果:
4、pm clear
清除指定包名應用的數據
用法
pm clear 包名
pm.clear io.moreless.tide 清空「潮汐」的數據
如果當前正在開啟這這個應用,那麼一執行這個命令,就會關閉,並且清空所有數據
再次打開「潮汐」時,就像安裝新的應用一樣。
5、pm install
安裝 apk 文件
等同於 在電腦下使用的 adb install apk文件
使用方法:
pm install apk在手機的路徑
前提是,你手機上有這個包,所以這個命令並不實用。
這裡就不再演示了。
6、pm uninstall
卸載指定包名的應用
用法:
pm uninstall 包名
pm uninstall com.lucky.luckyclient
等同於電腦端使用的
adb uninstall com.lucky.luckyclient
這樣就卸載掉了手機上安裝的「瑞幸」的包了。
這裡不再演示了。
7、am start 啟動一個應用
下面這個方法十分實用,可以直接定位到頁面
用法:打開app
am start -n 包名/activity名稱 打開指定頁面
甚至,你還可以 “以debug模式打開”,只需要在命令中添加 -D 即可
非常實用啦。
好,我們來看一下 潮汐的包名和其中的一個頁面的路徑
使用
dumpsys package io.moreless.tide
查看 「潮汐」的“清單文件”:
“紅線部分” 是輸入的命令,“淺藍色部分” 是稍後我們要跳轉的界面。
好,我們先跳轉到
io.moreless.tide/.play.PlayActivity
這個界面,看他的單詞意思應該是“播放界面”,如下圖:
執行的命令是:
am start -n io.moreless.tide/io.moreless.tide.play.PlayActivity
先將手機上開啟的 「潮汐」的 app 關閉,然後通過上面的命令打開
8、am startservice
開啟一個服務
用法
am startservice -n 包名/服務名
在我們演示之前,先看看「潮汐」有哪些服務吧!
使用命令
dumpsys activity services |grep moreless
我們得到這樣的結果。
紅色框框 是我們執行的命令
淺藍色框框 是我們得到的一些 service 的結果
看看前綴發現「潮汐」裡面不是「友盟」的服務,就是「淘寶」的服務。
那麼我們來演示一下,使用 am startservice -n 開啟一個服務看看是什麼情況吧
am startservice -n io.moreless.tide/com.umeng.message.UmengIntentService
出現了錯誤
那我們把 「潮汐」打開看看呢
這裡結合了上面打開 activity 的命令
這樣就不報錯了,但是因為這個 service 的功能不會顯示到界面上,所以這裡手機屏幕的內容沒有變化。
9、am broadcast
發送一個廣播,這個命令就很實用了,比如我們對系統廣播做了處理,對廣播做出的相應的反應,就可以使用這個命令去模擬真實的廣播接收
使用方法
am broadcast -a 廣播 action
比如:
發送一個“電量低廣播”
am broadcast -a Intent.ACTION_BATTERY_LOW
再比如:
發一個 “網絡狀態變化的廣播”
am broadcast -a android.net.conn.CONNECTIVITY_CHANGE
看下命令執行情況
發現 “ 電量的廣播 ” 可以發送,但是 “ 網絡變化的廣播 ”的需要權限
再試一下 “ 鎖屏廣播 ”
看到了,還是需要權限。
現在看來,真機的話必須root , 有必要使用虛擬機了!
- 通過 Android Studio 開啟一個虛擬機
- 打開 terminal
- adb root 將虛擬機 root
- adb shell 進入虛擬機
使用 root 之後的虛擬機再執行以下上面兩個命令
看看如何?
我們可以看到,廣播發送成功,但是手機並沒有做出反應,不過這不重要,因為我們要測試的是自己應用內對特定的廣播的處理。
不過,我發現發送 “ 鎖屏通知,虛擬機會有反應 ”
請看
ps:剛開始我把手機界面切到了應用菜單頁面,收到通知後,手機界面回到了桌面。
10、netstat
查看手機端口號信息
如圖
通過此命令可以查看手機完整的網絡狀態
11、dalvikvm運行一個dex 文件
我們都知道,android 應用,是把 class 文件打包成為 dex 文件,然後交給 dalvik 虛擬機運行的
所以,可以直接通過命令來跑 dex 文件
使用方法
dalvikvm -cp dex文件 運行主類
我把 「潮汐」的 apk 文件進行了解壓,得到這樣的文件夾
我們看到,裡面有 classes.dex 文件,還有 classex2.dex 文件
那麼我們來跑一下 classes.dex 文件看看會怎麼樣
首先,把這個文件放到手機裡面去:
- 退出 shell 模式
- adb push dex文件 /sdcard/
具體操作如圖
這樣就把「潮汐」的 dex 文件放到了手機裡面了。
然後,再進入 shell 模式,運行這個 dex 文件
- adb shell
- dalvikvm -cp /sdcard/classes.dex 運行主類
不過,到這裡,我們就不能往下進行了,原因是找不到 「潮汐」的主類,即使是知道了它的啟動 activity,但是因為混淆等原因,主類無法定位。
所以,這裡就留一個小小的遺憾吧
12、top
查看當前應用 cpu 的消耗情況
單獨執行
top
會輸出默認查詢結果
當然,我們可以使用一些字符限制一下
使用方法
top -n -d -s -t
-n 表示刷新次數
-d 刷新間隔時間(默認為5s)
-s 按照哪列排序
-t 顯示線程信息不顯示進程信息
這些 命令挑選你需要的即可,不用全部輸入
我們執行以下這個命令看一下
top -d 4 -n 2
間隔 4s 刷新一次,共刷兩次
看看情況 :
只間隔 4s 刷兩次,然後就停止了
13、getprop
獲得設備信息
使用方法
getprop查看設備的所有屬性
如圖,我們看到了 debug 、gsm、dalvik 、hwservicemanager 等信息
我們再用
getprop 屬性名
這個方法查看具體的屬性信息,比如我們看一下hwservicemanager.ready
getprop hwservicemanager.ready
查看一下
總結一下
shell 內部命令對 “更深一步進入 Android” 有很大的幫助,如果有的同學感興趣,不妨多花點時間熟悉一下這些命令,shell 命令 和前兩章提到的命令經常會一起用,所以大家還是多多聯繫吧!加油!!!
閱讀更多 黑鍵手記 的文章