看完了这篇文章,就进入 Android 的内部了
adb shell 命令
shell 命令的指的是:进入到设备内,然后执行的命令;
用大白话讲,就是“给手机下达指令”。
怎么进入?
adb shell>>
这样就进入了,然后就可以给他下达指令了。
好了,回顾一下,上一节,我们使用了
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 命令 和前两章提到的命令经常会一起用,所以大家还是多多联系吧!加油!!!