shell 命令

shell 命令


看完了這篇文章,就進入 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

他會報錯錯誤

如下圖所示:


shell 命令


爆出了:

run-as:package not debuggable:com.lucky.luckyclient

的問題。

所以需要注意的是:

利用 run-as 能查看的是屬於你自己開發的 app ,並且安裝到 android 手機上面的應用是 debug 版本的應用才可以。

3、ps

哈哈哈,不是 photoshop
他是:查看設備的進程信息,或者查看指定進程的線程信息。

使用方法:

直接使用 ps 查看所有進程

如圖

shell 命令


這樣,就拿到了所有進程的信息

查看進程信息,可以通過 |grep 去過濾信息。

ps |grep 過濾內容

從上面的圖片我們看到,terminal列出了系統、應用的一些進程信息,我們可以找一個單獨看,那麼就可以使用 |grep去過濾這些內容了。

ps |grep smpboot_th

得到下面的結果:

shell 命令


這樣做的好處是,看的更加清晰了。

查看指定進程下的線程信息

使用方法

ps -t 進程id

從第一種方法中,看到了 smpboot_th的其中一個進程 id 是 3。
如圖

shell 命令


的進程id,下面我們直接拿

使用

ps -t 3 獲取 pid 為 3 的 線程信息。

看下結果:

shell 命令


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

查看 「潮汐」的“清單文件”:

shell 命令


“紅線部分” 是輸入的命令,“淺藍色部分” 是稍後我們要跳轉的界面。

好,我們先跳轉到

io.moreless.tide/.play.PlayActivity

這個界面,看他的單詞意思應該是“播放界面”,如下圖:

執行的命令是:

am start -n io.moreless.tide/io.moreless.tide.play.PlayActivity

shell 命令


先將手機上開啟的 「潮汐」的 app 關閉,然後通過上面的命令打開

8、am startservice

開啟一個服務

用法

am startservice -n 包名/服務名

在我們演示之前,先看看「潮汐」有哪些服務吧!

使用命令

dumpsys activity services |grep moreless

我們得到這樣的結果。


shell 命令


紅色框框 是我們執行的命令

淺藍色框框 是我們得到的一些 service 的結果

看看前綴發現「潮汐」裡面不是「友盟」的服務,就是「淘寶」的服務。

那麼我們來演示一下,使用 am startservice -n 開啟一個服務看看是什麼情況吧

am startservice -n io.moreless.tide/com.umeng.message.UmengIntentService

出現了錯誤

shell 命令


那我們把 「潮汐」打開看看呢
這裡結合了上面打開 activity 的命令

shell 命令


這樣就不報錯了,但是因為這個 service 的功能不會顯示到界面上,所以這裡手機屏幕的內容沒有變化。

9、am broadcast

發送一個廣播,這個命令就很實用了,比如我們對系統廣播做了處理,對廣播做出的相應的反應,就可以使用這個命令去模擬真實的廣播接收

使用方法

am broadcast -a 廣播 action

比如:

發送一個“電量低廣播”

am broadcast -a Intent.ACTION_BATTERY_LOW

再比如:

發一個 “網絡狀態變化的廣播”

am broadcast -a android.net.conn.CONNECTIVITY_CHANGE

看下命令執行情況


shell 命令


發現 “ 電量的廣播 ” 可以發送,但是 “ 網絡變化的廣播 ”的需要權限

再試一下 “ 鎖屏廣播 ”

shell 命令


看到了,還是需要權限。


現在看來,真機的話必須root , 有必要使用虛擬機了!
  • 通過 Android Studio 開啟一個虛擬機
  • 打開 terminal
  • adb root 將虛擬機 root
  • adb shell 進入虛擬機

使用 root 之後的虛擬機再執行以下上面兩個命令
看看如何?

shell 命令


我們可以看到,廣播發送成功,但是手機並沒有做出反應,不過這不重要,因為我們要測試的是自己應用內對特定的廣播的處理。

不過,我發現發送 “ 鎖屏通知,虛擬機會有反應 ”

請看

shell 命令


ps:剛開始我把手機界面切到了應用菜單頁面,收到通知後,手機界面回到了桌面。

10、netstat

查看手機端口號信息

如圖

shell 命令


通過此命令可以查看手機完整的網絡狀態

11、dalvikvm運行一個dex 文件

我們都知道,android 應用,是把 class 文件打包成為 dex 文件,然後交給 dalvik 虛擬機運行的

所以,可以直接通過命令來跑 dex 文件

使用方法

dalvikvm -cp dex文件 運行主類

我把 「潮汐」的 apk 文件進行了解壓,得到這樣的文件夾

shell 命令


我們看到,裡面有 classes.dex 文件,還有 classex2.dex 文件

那麼我們來跑一下 classes.dex 文件看看會怎麼樣

首先,把這個文件放到手機裡面去:

  • 退出 shell 模式
  • adb push dex文件 /sdcard/

具體操作如圖

shell 命令


這樣就把「潮汐」的 dex 文件放到了手機裡面了。

然後,再進入 shell 模式,運行這個 dex 文件

  • adb shell
  • dalvikvm -cp /sdcard/classes.dex 運行主類

不過,到這裡,我們就不能往下進行了,原因是找不到 「潮汐」的主類,即使是知道了它的啟動 activity,但是因為混淆等原因,主類無法定位。

所以,這裡就留一個小小的遺憾吧

shell 命令


12、top

查看當前應用 cpu 的消耗情況

單獨執行

top
會輸出默認查詢結果

shell 命令


當然,我們可以使用一些字符限制一下

使用方法

top -n -d -s -t

-n 表示刷新次數

-d 刷新間隔時間(默認為5s)

-s 按照哪列排序

-t 顯示線程信息不顯示進程信息

這些 命令挑選你需要的即可,不用全部輸入

我們執行以下這個命令看一下

top -d 4 -n 2

間隔 4s 刷新一次,共刷兩次

看看情況 :

shell 命令


只間隔 4s 刷兩次,然後就停止了

13、getprop

獲得設備信息

使用方法

getprop查看設備的所有屬性

shell 命令


如圖,我們看到了 debug 、gsm、dalvik 、hwservicemanager 等信息

我們再用
getprop 屬性名

這個方法查看具體的屬性信息,比如我們看一下hwservicemanager.ready

getprop hwservicemanager.ready

查看一下


shell 命令


總結一下

shell 內部命令對 “更深一步進入 Android” 有很大的幫助,如果有的同學感興趣,不妨多花點時間熟悉一下這些命令,shell 命令 和前兩章提到的命令經常會一起用,所以大家還是多多聯繫吧!加油!!!


分享到:


相關文章: