大概每个人出生的时间都以为这天下都是为他一个人而存在的,当他发现自己错的时间,他便开始长大
少走了弯路,也就错过了风景,无论如何,感谢履历
已转行,从此不问网络安全江湖事… …
0x01 常用的一些ADB命令
1.1 ADB 命令(主)
- adb shell dumpsys activity top
- # 把系统中所有应用运行的四大组件都会打印出来
- adb shell dumpsys >> info.txt
- start info.txt
复制代码
- adb shell dumpsys package xxx
- 或进入adb shell使用下面的命令
- dumpsys package xxx
- # 清空应用数据
- adb shell pm clear xxx
复制代码
- adb shell dumpsys meminfo xxx
复制代码
- 查看指定包名应用的数据库存储信息(包罗存储的SQL语句)
- adb shell dumpsys dbinfo xxx
复制代码
- adb intall xxx.apk
- adb install test.apk -r 覆盖安装,保留数据和缓存文件 -d 解决低版本version问题 -s 安装apk到sd卡
复制代码
- adb uninstall xxx.apk
- adb uninstall -k <package_name>
- 可选参数-k的作用为卸载软件但是保留配置和缓存文件
- adb shell
- cd data/app
- rm apk包
- exit
- adb uninstall apk包的主包名
- adb install -r apk包
复制代码
- adb remount
- (重新挂载系统分区,使系统分区重新可写)
- adb shell
- cd system/app
- rm *.apk
复制代码
- adb pull 目标系统中的文件路径(a.txt) 本机系统要存放取出来的路径(a.txt)
复制代码
- adb push 本机系统中的文件路径(a.txt) 目标系统中要存放的路径(a.txt)
复制代码
- adb shell screencap -p /sdcard/test.png
- adb pull /sdcard/test.png D:\img\
- start D:\img\test.png
复制代码
- adb shell screenrecord /sdcard/test.mp4
复制代码
- adb shell input text 'xxx'
复制代码
- adb forward [(远程端)协议:端口号] [(设备端)协议:端口号]
- adb forward tcp:23946 tcp:23946
- adb forward tcp:8700 jwdp:1786
复制代码
- adb logcat
- 用法1:adb logcat -s tag
- 案例: adb Logcat -s fb
- 用法2:adb logcat |findstr pname/pid/keyword
- 案例: adb Logcat |findstr cn.test.demo
- 或进入adb shell使用下面的命令
- Logcat grep tencent
复制代码
- 非root设备中查看指定debug模式的包名应用沙盒数据
- ps | grep 过滤内容
- ps | grep cn.test.demo
- ps -t 19977
复制代码
- pm clear grep cn.test.demo
复制代码
- pm install /sdcard/test.apk
复制代码
- pm uninstall cn.test.demo
复制代码
- am start -n [包(package)名]/[包名].[活动(activity)名称]
- am start -n com.androidtest/com.androidtest.test
复制代码
- am startservice -n [包 (package) 名]/[包名].[服务(service)名]
- am startservice -n com.androidtest2/com.androidtest.test2
复制代码
- 运行Java代码(特别场景利用,把dx命令把dex文件转化成jar包)
- app_process [运行代码目录] [运行主类]
- export CLASSPATH=/data/test.jar
- exec /system/bin/app_process /data/cn.test.main
复制代码
- dalvikvm -cp [dex文件] [运行主类]
- dalvikvm -cp /data/test.dex cn. Widiankong Main
复制代码
- top [-n/-m/-d/-s/-t]
- -m // 最多显示多少个进程
- -n // 刷新次数
- -d // 刷新间隔时间(默认5 秒)
- -s // 按哪列排序
- -t // 显示线程信息而不是进程
复制代码
- 用aapt操作apk命令(查看apk中的信息以及编辑apk程序包)
- aapt dump xmltree [apk包] [需要查看的资源文件xml ]
复制代码
- 用dexdump操作dex命令(查看dex文件的详细信息)
- 查看当前历程的内存加载情况(查看当前历程的内存映射信息,比如加载了哪些so文件,dex文件等)
- cat /proc/[pid]/maps
- 用法:cat /proc/663/maps
复制代码
- cat /proc/[pid]/status
- 用法:cat /proc/663/status
复制代码
- cat /proc/[pid]/net/tcp/tcp6/udp/udp6
- 用法:cat /proc/663/net/tcp/tcp6/udp/udp6
复制代码 1.2 ADB 命令(次)
- adb shell
- abd shell -s 模拟器编号 命令
复制代码
- # 关闭服务
- adb kill-server
- # 启动服务
- adb start-server
复制代码
- adb get-product
- adb get-serialno
复制代码
- cd system/sd/data
- #ls //列表显示当前文件夹内容
- #rm -r xxx //删除名字为xxx的文件夹及其里面的所有文件
- #rm xxx //删除文件xxx
- #rmdir xxx //删除xxx的文件夹
复制代码
- adb shellinput keyevent 80
复制代码
- 将system分区重新挂在为可读写分区,此命令在操作系统目次时很重要
- 重启设备,可选参数进入bootloader(刷机模式)或recovery(规复模式)
- adb reboot
- bootloader
- adb reboot
- recovery
复制代码
- adb shell kill pidNumber
- # 列出进程列表及其pid
- adb shell ps
- # 查看指定进程信息
- adb shell ps
- -x pid
复制代码
- adb shell getprop | grep heapgrowthlimit
- 得到的结果为128M: [dalvik.vm.heapgrowthlimit]: [128m]
- 这就是说Dalvik Heap size的最大值超过了128M,就很可能发生OOM
复制代码
- adb shell getprop | grep version
复制代码
- adb shell getprop | grep product
复制代码
- 获取到的序列号即为adb devices
- 列出来的序列号adb get-serialno
复制代码
- adb shell cat data/misc/wifi/*.conf
复制代码
- adb shell cat /sys/class/net/wlan0/address
复制代码
- adb shell screenrecord /sdcard/test.mp4
复制代码
- adb shell am start -a android.intent.action.CALL -d tel:10086
- 停止应用
- adb shell am force-stop package
- 查看当前 Activity 名称
- adb shell dumpsys activity | findstr “mFocusedActivity”
复制代码
- adb shell mv /sdcard/1.txt /sdcard/2.text
- 移动同一目录下文件相当于重命名文件
复制代码
- adb shell screencap /sdcard/Test.png
- adb pull /sdcard/Test.png
- adb open Test.png
复制代码
- adb shell dumpsys meminfo <pakagename>
复制代码
- adb shell top
- adb shell dumpsys cpuinfo
复制代码
- adb shell dumpsys battery
复制代码
- adb shell cat /proc/<PID>/stat
复制代码
- adb shell cat /proc/meminfo | head -n 4
复制代码
- adb shell dumpsys meminfo| grep "Free RAM"
复制代码
- adb shell dumpsys meminfo <packagename>
- adb shell dumpsys meminfo <PID>
复制代码
- adb shell cat proc/self/net/dev
复制代码
- adb shell cat /proc/uid_stat/2000/tcp_snd
复制代码
- adb shell cat /proc/uid_stat/2000/tcp_rcv
复制代码
- adb logcat threadtime -b events>d:\log\events.txt
复制代码
- adb logcat -v threadtime | grep ActivityManager
复制代码
- adb shell am start -W -n <某activity>
复制代码 0x02 ADB常用命令总结
- 存在多个设备/模拟器,指定单独一个设备/模拟器并进入交互式Shell
adb 根本语法格式:adb [-d|-e|-s <serialNumber>] <command>
参数如下:
参数描述-d指定当前唯一通过 USB 连接的 Android 设备为命令目的-e指定当前唯一运行的模拟器为命令目的-s <serialNumber>指定相应 serialNumber 号的设备/模拟器为命令目的 注:如果有多个设备/模拟器连接,则需要命令指定目的设备。常用的是 -s 参数,设备/模拟器的serialNumber(序列号)可通过adb devices
命令获取,如下:
- $ adb devices
- List of devices attachedcf33328f deviceemulator-5554 device10.1.2.6:5555 device
复制代码 上述案例表现电脑连接了三个设备/模拟器,输出里的cf33328f、emulator-5554 和 10.1.2.6:5555均为设备/模拟器的序列号,想连接emulator-5554模拟器,输入如下命令:
adb 输出格式为[serialNumber] [state],serialNumber 即我们常说的 SN,state 有如下几种:
参数描述offline表现设备未连接乐成或无相应device设备已连接。留意这个状态并不能标识 Android 系统已经完全启动和可操作,在设备启动过程中设备实例就可连接到 adb,但启动完毕后系统才处于可操作状态no device没有设备/模拟器连接List of devices attached没有设备/模拟器连接乐成List of devices attached 【序列号】 offline设备/模拟器未连接到 adb 或无相应
- # 启动adb
- adb start-server
- # adb
- adb kill-server
复制代码
- restart adbd
- # 或分开使用停止和启动命令来重启adbd服务
- stop adbd
- start adbd
复制代码
- adb -P <port> start-server
复制代码
查看应用列表的根本命令格式:adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
- # 显示所有应用
- adb shell pm list packages
- # 显示系统应用
- adb shell pm list packages -s
- # 显示第三方应用
- adb shell pm list packages -3
- # 包名包含某字符串的应用,比如要查看包名包含字符串 test 的应用列表
- adb shell pm list packages tesr
- 或使用 grep 来过滤
- adb shell pm list packages | grep test
复制代码 上面的参数如下:
参数名描述默认所有应用-f表现应用关联的 apk 文件-d只表现 disabled 的应用-e只表现 enabled 的应用-s只表现系统应用-3只表现第三方应用-i表现应用的 installer-u包含已卸载应用<FILTER>包名包含 <FILTER> 字符串
格式:adb install [-lrtsdg] <path_to_apk>
adb install 安装步骤如下:
- 1)push apk 文件到 /data/local/tmp
- 2)调用 pm install 安装
- 3)删除 /data/local/tmp 下的对应 apk 文件
复制代码 参数及含义如下:
参数含义-l 将应用安装到保护目次 /mnt/asec-r允许覆盖安装-t允许安装 AndroidManifest.xml里 application 指定android:testOnly="true"的应用-s将应用安装到 sdcard-d允许降级覆盖安装-g授予所有运行时权限–abi abi-identifier为特定 ABI 强制安装 apk,abi-identifier可以是 armeabi-v7a、arm64-v8a、v86、x86_64等 常见APK安装失败输出代码、含义及大概的办理办法如下:
输出含义办理办法INSTALL_FAILED_ALREADY_EXISTS应用已经存在,或卸载了但没卸载干净adb install 时利用 -r 参数,大概先adb uninstall <packagename>再安装INSTALL_FAILED_INVALID_APK无效的 APK 文件INSTALL_FAILED_INVALID_URI无效的 APK 文件名确保 APK 文件名里无中文INSTALL_FAILED_INSUFFICIENT_STORAGE空间不足清算空间INSTALL_FAILED_DUPLICATE_PACKAGE已经存在同名程序INSTALL_FAILED_NO_SHARED_USER请求的共享用户不存在INSTALL_FAILED_UPDATE_INCOMPATIBLE以前安装过同名应用,但卸载时数据没有移除;大概已安装该应用,但签名不一致先 adb uninstall <packagename> 再安装INSTALL_FAILED_SHARED_USER_INCOMPATIBLE请求的共享用户存在但签名不一致INSTALL_FAILED_MISSING_SHARED_LIBRARY安装包利用了设备上不可用的共享库INSTALL_FAILED_REPLACE_COULDNT_DELETE替换时无法删除INSTALL_FAILED_DEXOPTdex 优化验证失败或空间不足INSTALL_FAILED_OLDER_SDK设备系统版本低于应用要求INSTALL_FAILED_CONFLICTING_PROVIDER设备里已经存在与应用里同名的content providerINSTALL_FAILED_NEWER_SDK设备系统版本高于应用要求INSTALL_FAILED_TEST_ONLY应用是 test-only 的,但安装时没有指定 -t 参数INSTALL_FAILED_CPU_ABI_INCOMPATIBLE包含不兼容设备 CPU 应用程序二进制接口的 native codeINSTALL_FAILED_MISSING_FEATURE应用利用了设备不可用的功能INSTALL_FAILED_CONTAINER_ERROR1. sdcard 访问失败;
2. 应用签名与 ROM 签名一致,被当作内置应用1. 确认 sdcard 可用,大概安装到内置存储
2. 打包时不与 ROM 利用相同签名INSTALL_FAILED_INVALID_INSTALL_LOCATION1. 不能安装到指定位置
2. 应用签名与 ROM 签名一致,被当作内置应用1. 切换安装位置,添加或删除 -s 参数
2. 打包时不与 ROM 利用相同签名INSTALL_FAILED_MEDIA_UNAVAILABLE安装位置不可用一样平常为 sdcard,确认 sdcard 可用或安装到内置存储INSTALL_FAILED_VERIFICATION_TIMEOUT验证安装包超时INSTALL_FAILED_VERIFICATION_FAILURE验证安装包失败INSTALL_FAILED_PACKAGE_CHANGED应用与调用程序期望的不一致INSTALL_FAILED_UID_CHANGED以前安装过该应用,与本次分配的 UID 不一致清除以前安装过的残留文件INSTALL_FAILED_VERSION_DOWNGRADE已经安装了该应用更高版本利用 -d 参数INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE已安装target SDK支持运行时权限的同名应用,要安装的版本不支持运行时权限INSTALL_PARSE_FAILED_NOT_APK指定路径不是文件,或不是以 .apk 结尾INSTALL_PARSE_FAILED_BAD_MANIFEST无法剖析的 AndroidManifest.xml 文件INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION剖析器遇到异常INSTALL_PARSE_FAILED_NO_CERTIFICATES安装包没有签名INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES已安装该应用,且签名与 APK 文件不一致先卸载设备上的该应用,再安装INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING剖析 APK 文件时遇到 CertificateEncodingExceptionINSTALL_PARSE_FAILED_BAD_PACKAGE_NAMEmanifest 文件里没有大概利用了无效的包名INSTALL_PARSE_FAILED_BAD_SHARED_USER_IDmanifest 文件里指定了无效的共享用户 IDINSTALL_PARSE_FAILED_MANIFEST_MALFORMED剖析 manifest 文件时遇到布局性错误INSTALL_PARSE_FAILED_MANIFEST_EMPTY在 manifest 文件里找不到找可操作标签(instrumentation 或 application)INSTALL_FAILED_INTERNAL_ERROR因系统问题安装失败INSTALL_FAILED_USER_RESTRICTED用户被限制安装应用在开发者选项里将「USB安装」打开,如果已经打开了,那先关闭再打开INSTALL_FAILED_DUPLICATE_PERMISSION应用尝试界说一个已经存在的权限名称INSTALL_FAILED_NO_MATCHING_ABIS应用包含设备的应用程序二进制接口不支持的native codeINSTALL_CANCELED_BY_USER应用安装需要在设备上确认,但未操作设备或点了取消在设备上同意安装INSTALL_FAILED_ACWF_INCOMPATIBLE应用程序与设备不兼容INSTALL_FAILED_TEST_ONLYAPK 文件是利用Android Studio 直接 RUN 编译出来的文件通过 Gradle 的 assembleDebug或assembleRelease 重新编译,大概Generate Signed APKdoes not contain AndroidManifest.xml无效的 APK 文件is not a valid zip file 无效的 APK 文件Offline设备未连接乐成先将设备与 adb 连接乐成unauthorized设备未授权允许调试error: device not found没有连接乐成的设备先将设备与 adb 连接乐成protocol failure设备已断开连接先将设备与 adb 连接乐成Unknown option: -sAndroid 2.2 以下不支持安装到 sdcard倒霉用 -s 参数No space left on device空间不足清算空间Permission denied … sdcard …sdcard 不可用signatures do not match the previously installed version; ignoring! 已安装该应用且签名不一致先卸载设备上的该应用,再安装
命令格式如下:
- # <packagename> 表示应用的包名,-k 参数可选,表示卸载应用但保留数据和缓存目录
- adb uninstall [-k] <packagename>
复制代码- adb uninstall android.uid.sysytem
复制代码
命令格式如下:
- # <packagename> 表示应用名包,这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」
- adb shell pm clear <packagename>
复制代码- adb shell pm clear android.uid.sysytem
复制代码
- adb shell dumpsys activity activities | grep mResumedActivity
复制代码 或
- adb shell dumpsys activity activities | findstr mResumedActivity
- adb shell "dumpsys activity activities | grep mResumedActivity"
复制代码
命令格式如下:
- # <packagename> 参数不是必须的,指定 <packagename> 表示查看与某个包名相关的 Services,不指定表示查看所有 Services
- adb shell dumpsys activity services [<packagename>]
复制代码
输出中包含许多信息,包罗Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等
命令格式如下:
- adb shell dumpsys package <packagename>
复制代码
命令格式如下:
- adb shell pm path <PACKAGE>
复制代码
- 启动应用/调起Activity(指定Activity名称启动)
重要是利用am <command>命令,常用的 <command> 如下:
command用途start [options] <INTENT> 启动<INTENT> 指定的 Activitystartservice [options] <INTENT> 启动<INTENT> 指定的 Servicebroadcast [options] <INTENT> 发送<INTENT> 指定的广播force-stop <packagename> 停止<packagename>干系的历程 <INTENT>参数很灵活,和写 Android 程序期间码里的 Intent 相对应
用于决定 intent 对象的选项如下:
参数含义-a <ACTION> 指定 action,比如android.intent.action.VIEW -c <CATEGORY> 指定 category,比如android.intent.category.APP_CONTACTS -n <COMPONENT> 指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity <INTENT> 里还能带数据,就像写代码时的 Bundle 一样:
参数含义--esn <EXTRA_KEY>null 值(只有 key 名)-e--es <EXTRA_KEY> <EXTRA_STRING_VALUE> --ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> boolean 值--ei <EXTRA_KEY> <EXTRA_INT_VALUE> integer 值--el <EXTRA_KEY> <EXTRA_LONG_VALUE> long 值--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> float 值--eu <EXTRA_KEY> <EXTRA_URI_VALUE> URI--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE> component name --eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...] integer 数组--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...] long 数组 命令格式如下:
- adb shell am start [options] <INTENT>
复制代码- # 调起微信主界面
- adb shell am start -n com.tencent.mm/.ui.LauncherUI
复制代码- # 表示调起 org.mazhuang.boottimemeasure/.MainActivity 并传给它 string 数据键值对 toast - hello, world
- adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"
复制代码
- 启动应用/调起Activity(不指定Activity名称启动【启动主Activity】)
命令格式如下:
- adb shell monkey -p <packagename> -c android.intent.category.LAUNCHER
复制代码- # 调起微信主界面
- adb shell monkey -p com.tencent.mm -c android.intent.category.LAUNCHER 1
复制代码
命令格式如下:
- adb shell am startservice [options] <INTENT>
复制代码- # 调起微信的某 Service
- adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
复制代码
命令格式如下:
- adb shell am stopservice [options] <INTENT>
复制代码
命令格式如下:既能发送系统预界说的广播,也能发送自界说广播
- adb shell am broadcast [options] <INTENT>
复制代码- # 向所有组件广播 BOOT_COMPLETED
- adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
- # 只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 广播 BOOT_COMPLETED
- adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver
复制代码 如下是部门系统预界说广播及正常触发机遇:
action触发机遇android.net.conn.CONNECTIVITY_CHANGE网络连接发生变化android.intent.action.SCREEN_ON屏幕点亮android.intent.action.SCREEN_OFF屏幕熄灭android.intent.action.BATTERY_LOW电量低,会弹出电量低提示框android.intent.action.BATTERY_OKAY电量规复了android.intent.action.BOOT_COMPLETED设备启动完毕android.intent.action.DEVICE_STORAGE_LOW存储空间过低android.intent.action.DEVICE_STORAGE_OK存储空间规复android.intent.action.PACKAGE_ADDED安装了新的应用android.net.wifi.STATE_CHANGEWiFi 连接状态发生变化android.net.wifi.WIFI_STATE_CHANGEDWiFi 状态变为启用/关闭/正在启动/正在关闭/未知android.intent.action.BATTERY_CHANGED电池电量发生变化android.intent.action.INPUT_METHOD_CHANGED系统输入法发生变化android.intent.action.ACTION_POWER_CONNECTED外部电源连接android.intent.action.ACTION_POWER_DISCONNECTED外部电源断开连接android.intent.action.DREAMING_STARTED系统开始休眠android.intent.action.DREAMING_STOPPED系统停止休眠android.intent.action.WALLPAPER_CHANGED壁纸发生变化android.intent.action.HEADSET_PLUG插入耳机android.intent.action.MEDIA_UNMOUNTED卸载外部介质android.intent.action.MEDIA_MOUNTED挂载外部介质android.os.action.POWER_SAVE_MODE_CHANGED省电模式开启
命令格式如下:
- adb shell am force-stop <packagename>
复制代码
命令格式如下:
- adb shell am send-trim-memory <pid> <level>
复制代码- # HOME 键
- adb shell input keyevent 3
复制代码- level:
- 1)HIDDEN
- 2)RUNNING_MODERATE
- 3)BACKGROUND
- 4)RUNNING_LOW
- 5)MODERATE
- 6)RUNNING_CRITICAL
- 7)COMPLETE
复制代码- # 表示向 pid=986 的进程,发出 level=RUNNING_LOW 的收紧内存命令
- adb shell am send-trim-memory 986 RUNNING_LOW
复制代码
命令格式如下:
- adb pull <设备里的文件路径> [电脑上的目录]
复制代码
命令格式如下:
- adb push <电脑上的文件路径> <设备里的目录>
复制代码
在 adb shell 里有个很实用的命令叫 input,input 命令的完整 help 信息如下:
- Usage: input [<source>] <command> [<arg>...]
- The sources are:
- mouse
- keyboard
- joystick
- touchnavigation
- touchpad
- trackball
- stylus
- dpad
- gesture
- touchscreen
- gamepad
- The commands and default sources are:
- text <string> (Default: touchscreen)
- keyevent [--longpress] <key code number or name> ... (Default: keyboard)
- tap <x> <y> (Default: touchscreen)
- swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
- press (Default: trackball)
- roll <dx> <dy> (Default: trackball)
复制代码 利用adb shell input keyevent <keycode>命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 KeyEvent,部门内容如下:
keycode含义3HOME 键4返回键5打开拨号应用6挂断电话24增长音量2526电源键27拍照(需要在相机应用里)64打开浏览器82菜单键85播放/暂停86停止播放87播放下一首88播放上一首122移动光标到行首或列表顶部123移动光标到行末或列表底部126规复播放127暂停播放164静音176打开系统设置187切换应用207打开联系人208打开日历209打开音乐210打开计算器220降低屏幕亮度221进步屏幕亮度223系统休眠224点亮屏幕231打开语音助手276如果没有 wakelock 则让系统休眠
Android 系统的日志分为两部门,底层的 Linux 内核日志输出到/proc/kmsg,Android 的日志输出到 /dev/log
命令格式如下:
- [adb] logcat [<option>] ... [<filter-spec>] ...
复制代码 按级别过滤日志:
- Android 的日志分为如下几个优先级(priority):
- 1)V :Verbose(最低,输出得最多)
- 2)D :Debug
- 3)I : Info
- 4)W :Warning
- 5)E : Error
- 6)F : Fatal
- 7)S :Silent(最高,啥也不输出)
- 按某级别过滤日志则会将该级别及以上的日志输出
- # 比如如下命令会将Warning、Error、Fatal 和 Silent 日志输出
- adb logcat *:W
复制代码 按 tag 和级别过滤日志:
- # <filter-spec> 可以由多个 <tag>[:priority] 组成
- # 下面表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)
- adb logcat ActivityManager:I MyApp:D *:S
复制代码 日志格式:可以用adb logcat -v <format> 选项指定日志输出格式
- 日志支持按以下几种 <format>:
- 1)brief默认格式。格式为:<priority>/<tag>(<pid>): <message>
- 示例:D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
- 2)process格式为:<priority>(<pid>) <message>
- 示例:D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine)
- 3)tag格式为:<priority>/<tag>: <message>
- 示例:D/HeadsetStateMachine: Disconnected process message: 10, size: 0
- 4)raw格式为:<message>
- 示例:Disconnected process message: 10, size: 0
- 5)time格式为:<datetime> <priority>/<tag>(<pid>): <message>
- 示例:08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
- 6)threadtime格式为:<datetime> <pid> <tid> <priority> <tag>: <message>
- 示例:08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0
- 7)long格式为:[ <datetime> <pid>:<tid> <priority>/<tag> ] <message>
- 示例:[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ] Disconnected process message: 10, size: 0
- # 指定格式可与上面的过滤同时使用,如下:
- adb logcat -v long ActivityManager:I *:S
复制代码
- adb shell getprop ro.product.model
复制代码
- adb shell settings get secure android_id
复制代码
- # 在 Android 4.4 及以下版本可通过如下命令获取 IMEI,其中的 Device ID 就是 IMEI:
- adb shell dumpsys iphonesubinfo
- # 在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限),把里面的有效内容提取出来就是 IMEI :
- adb shell
- su
- service call iphonesubinfo 1
复制代码
- adb shell getprop ro.build.version.release
复制代码
手动查看IP地址:「设置」-「关于手机」-「状态信息」-「IP地址」,下面是通过ADB查看IP地址
或
- # 网络连接名称、启用状态、IP 地址和 Mac 地址等信息
- adb shell netcfg
复制代码
- adb shell cat /sys/class/net/wlan0/address
复制代码
- adb shell cat /proc/cpuinfo
复制代码
- # 注意,在命令执行后展示的信息中MemTotal 就是设备的总内存,MemFree 是当前空闲内存
- adb shell cat /proc/meminfo
复制代码
- adb shell cat /system/build.prop
- # 或通过 adb shell getprop <属性名>,比如查看SDK版本
- adb shell getprop ro.build.version.sdk
复制代码 部门系统属性如下:
属性名含义ro.build.version.sdkSDK 版本ro.build.version.releaseAndroid 系统版本ro.build.version.security_patchAndroid 安全补丁程序级别ro.product.model型号ro.product.brand 品牌ro.product.name设备名ro.product.board 处置惩罚器型号ro.product.cpu.abilistCPU 支持的 abi 列表persist.sys.isUsbOtgEnabled 是否支持 OTGdalvik.vm.heapsize每个应用程序的内存上限ro.sf.lcd_density屏幕密度 注:一些定制的 ROM 大概修改过 CPU 支持的 abi 列表的属性名,如果用 ro.product.cpu.abilist 属性名查找不到,尝试如下命令:
- adb shell cat /system/build.prop | grep ro.product.cpu.abi
复制代码
注:用命令关闭后,只能手动规复,步骤:「设置」-「开发者选项」-「Android 调试」
- adb shell settings put global adb_enabled 0
复制代码
- adb shell settings put global hidden_api_policy_pre_p_apps 1
- adb shell settings put global hidden_api_policy_p_apps 1
复制代码 数字的含义如下:
值含义0禁止检测非 SDK 接口的调用。该情况下,日志记载功能被禁用,而且令strict mode API,即 detectNonSdkApiUsage() 无效,不保举1仅警告——允许访问所有非 SDK 接口,但保留日志中的警告信息,可继续利用strick mode API2禁止调用深灰名单和黑名单中的接口3禁止调用黑名单中的接口,但允许调用深灰名单中的接口
- adb shell settings delete global hidden_api_policy_pre_p_apps
- adb shell settings delete global hidden_api_policy_p_apps
复制代码
- adb shell settings put global policy_control <key-values>
复制代码 <key-values> 可由如下几种键及其对应的值构成,格式为 <key1>=<value1>:<key2>=<value2>,如下:
key含义immersive.full同时隐藏immersive.status 隐藏状态栏immersive.navigation 隐藏导航栏immersive.preconfirms? 这些键对应的值可则如下值用逗号组合:
value含义apps 所有应用*所有界面packagename指定应用-packagename排除指定应用 例如表现设置在所有界面下都同时隐藏状态栏和导航栏:
- # 表示设置在包名为 com.package1 和 com.package2 的应用里隐藏状态栏,在除了包名为 com.package3 的所有应用里隐藏导航栏
- adb shell settings put global policy_control immersive.full=*
复制代码
- # 先截图保存到设备的/sdcard/下
- adb exec-out screencap -p > /sdcard/test.png
- # 将 png 文件导出到电脑
- adb pull /sdcard/test.png
复制代码 adb shell screencap -h查看 screencap 命令的帮助信息,下面是两个有意义的参数及含义:
参数含义-p指定保存文件为 png 格式-d display-id指定截图的表现屏编号(有多表现屏的情况下) 注:如果指定文件名以 .png 结尾时可以省略 -p 参数;否则需要利用 -p 参数。如果不指定文件名,截图文件的内容将直接输出到 stdout
其它方式截图并保存到电脑的方法:
- # Linux 和 Windows
- adb shell screencap -p | sed "s/\r$//" > test.png
- # Mac OS X
- adb shell screencap -p | gsed "s/\r$//" > test.png
复制代码 注:利用其它方式截图并保存到电脑的方法,需要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安装目次的 bin 文件夹下也有,并将sed.exe 所在文件夹添加到 PATH 情况变量里;Mac 下利用系统自带的 sed 命令会报错,需要安装 gnu-sed,利用该命令进行安装brew install gnu-sed
- # 录制屏幕以 mp4 格式保存到 /sdcard,默认录制时间和最长录制时间都是 180 秒
- adb shell screenrecord /sdcard/filename.mp4
- # 导出mp4到电脑
- adb pull /sdcard/filename.mp4
复制代码 adb shell screenrecord --help 查看 screenrecord 命令的帮助信息,下面是常见参数及含义:
参数含义–size WIDTHxHEIGHT视频的尺寸,比如 1280x720,默认是屏幕分辨率–bit-rate RATE 视频的比特率,默认是 4Mbps–time-limit TIME 录制时长,单元秒–verbose输出更多信息
注:需要root权限,因为/system 分区默认挂载为只读,但有些操作比如给 Android 系统添加命令、删除自带应用等需要对 /system 进行写操作,所以需要重新挂载它为可读写
- adb remount
- # 或利用如下步骤:1)进入 shell 并切换到 root 用户权限,执行命令:adb shell su2)查看当前分区挂载情况,执行命令:mount | grep system 会输出如下内容:/dev/block/platform/mstar_mci.0/by-name/system /system ext4 ro,relatime,data=ordered 0 0设备:/dev/block/platform/mstar_mci.0/by-name/system挂载点:/system权限:ro,即只读3)以读写方式(rw)重新挂载/system分区,执行命令:mount -o remount,rw /dev/block/platform/mstar_mci.0/by-name/system /system 或mount -o remount /system
复制代码
- # 需Root 权限,全部命令执行完后展示的内容中ssid 即为 WLAN 设置里看到的名称,psk 为密码,key_mgmt 为安全加密方式
- adb shell
- su
- cat /data/misc/wifi/*.conf
复制代码 需要留意 Android O 或以后,WiFi 暗码保存的地址有变化,是在 WifiConfigStore.xml 里面,如下:
- # 需Root 权限,全部命令执行完后展示的内容中的 ConfigKey为WiFi 名字、PreSharedKey为WiFi 密码
- adb shell
- su
- cat /data/misc/wifi/WifiConfigStore.xml
复制代码
- # 需Root 权限,如下表示将系统日期和时间更改为 2022 年 08 月 21 日 13 点 11 分 00 秒
- adb shell
- su
- date -s 20220821.131100
复制代码
Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试,如下:
- # 表示向 <packagename> 指定的应用程序发送 500 个伪随机事件
- adb shell monkey -p <packagename> -v 500
复制代码
- adb root
- adb shell svc wifi enable
复制代码
- adb root
- adb shell svc wifi disable
复制代码
- 用 adb forward tcp:port jdwp:<pid>在PC上做端口映射, 然后在PC上通过端口连接手机,进行调试。命令如下:
- jdb -attach locaohost:8000
- jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000
复制代码
- ADB从 Recovery 重启到 Android
如果下载了 Android 设备对应的系统更新包到电脑上,那么可通过 adb 来完成更新,以 Recovery 模式下更新为例:
- 1)重启到 Recovery 模式。命令:adb reboot
- recovery2)在设备的 Recovery 界面上操作进入 Apply update–Apply from ADB注:不同的 Recovery 菜单大概与此有差异,有的是一级菜单就有 Apply update from ADB3)通过 adb 上传和更新系统。命令:adb sideload <path-to-update.zip>
复制代码
- adb root
- adb shell setenforce 1
复制代码
- adb root
- adb shell setenforce 0
复制代码 注:遇到权限问题,在logcat大概kernel的log中肯定会打印avc denied提示缺少什么权限,通过命令过滤出所有的avc denied,再根据这些log进行排查:
- cat /proc/kmsg | grep avc
- 或
- dmesg | grep avc
复制代码
- adb root
- adb enable-verity
复制代码
- adb root
- adb disable-verity或fastboot --disable-verity flash vbmeta vbmeta.img
复制代码
- # adb shell settings put global http_proxy 代理IP地址:端口号
- adb shell settings put global http_proxy 192.168.137.1:8080
- adb shell settings put global https_proxy 192.168.137.1:8080
复制代码
- adb shell settings put global http_proxy :0
复制代码
- adb shell settings delete global http_proxy
- adb shell settings delete global global_http_proxy_host
- adb shell settings delete global global_http_proxy_port
- adb reboot
复制代码
历程各列含义如下:
列名含义USER所属用户PID历程 IDPPID父历程 IDNAME历程名
top命令展示内容的各列含义如下:
列名含义PID历程 IDPR 优先级CPU%当前刹时占用 CPU 百分比S历程状态(R=运行,S=睡眠,T=跟踪/停止,Z=僵尸历程)#THR线程数VSSVirtual Set Size虚拟耗用内存(包含共享库占用的内存)RSSResident Set Size 现实利用物理内存(包含共享库占用的内存)PCY调理策略优先级,SP_BACKGROUND/SPFOREGROUNDUID历程所有者的用户 IDNAME历程名 top 命令还支持一些命令行参数,详细用法如下:
- Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
- -m num 最多显示多少个进程
- -n num 刷新多少次后退出
- -d num 刷新时间间隔(单位秒,默认值 5)
- -s col 按某列排序(可用 col 值:cpu, vss, rss, thr)
- -t 显示线程信息
- -h 显示帮助文档
复制代码
- # adb shell dumpsys package <packagename>
- | grep userId=$ adb shell dumpsys package cn.test.main | grep userId=# 通过 ps 命令找到对应历程的 pid 之后 adb shell cat /proc/<pid>/status | grep Uid$ ps$ cat /proc/28635/status | grep Uid
复制代码
命令功能cat表现文件内容cd切换目次chmod改变文件的存取模式/访问权限df查看磁盘空间利用情况grep过滤输出kill杀死指定 PID 的历程ls枚举目次内容mount挂载目次的查看和管理mv移动或重命名文件ps查看正在运行的历程rm删除文件top查看历程的资源占用情况 参考链接:
https://cloud.tencent.com/developer/article/1797357
https://zhuanlan.zhihu.com/p/43731848
https://github.com/android/platform_frameworks_base/blob/master/core%2Fjava%2Fandroid%2Fcontent%2Fpm%2FPackageManager.java
https://developer.android.com/studio/command-line/adb.html
https://developer.android.com/studio/command-line/shell.html
https://developer.android.com/studio/command-line/logcat.html
https://zmywly8866.github.io/2015/01/24/all-adb-command.html
https://github.com/ZQiang94/StudyRecords/blob/master/other/src/main/java/com/other/adb%20%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%9A%84%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.md
https://www.jianshu.com/p/860bc2bf1a6a
https://stackoverflow.com/questions/27002663/adb-shell-dumpsys-iphonesubinfo-not-working-since-android-5-0-lollipop
http://yifeiyuan.me/2016/06/30/ADB%E5%91%BD%E4%BB%A4%E6%95%B4%E7%90%86/
http://blog.csdn.net/kittyboy0001/article/details/38562515
https://cabins.github.io/2016/03/25/UseAdbLikeAPro-2/
你以为你有许多路可以选择,其实你只有一条路可以走
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |