转载表明来源:http://blog.csdn.net/yzzst/article/details/47128581
创业要接地气,GOOGLE、亚马逊、微软在中国做的怎么样,完全取决于他们的本地化程度。 ——周鸿祎
Java命令行工具
am工具(启动和调试组件)
am工具的含义为Activity Manager。
usage: am [subcommand] [options]
start an Activity: am start [-D] [-W]
-D: enable debugging
-W: wait for launch to complete
start a Service: am startservice
send a broadcast Intent: am broadcast
start an Instrumentation: am instrument [flags] -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT) -e : set argument to -p : write profiling data to -w: wait for instrumentation to finish before returning start profiling: am profile start stop profiling: am profile stop start monitoring: am monitor [--gdb ] --gdb: start gdbserv on the given port at crash/ANR
主要参数Intent:
显式启动Activity:
am start -n {包名}/{包名}.{活动名}
隐式启动Activity:
am start -a {指定的action} -d {URI}
隐式启动服务:
am startService -a {指定的action}
隐式发送广播:
am broadcast -a {指定的action}
启动Calculator应用:
am start -n com.android.calculator2/com.android.calculator2.Calculator
Starting: Intent { cmp=com.android.calculator2/.Calculator }
am start -n com.android.calculator2/.Calculator
Starting: Intent { cmp=com.android.calculator2/.Calculator }
启动应用并带有URL参数:
am start -a android.intent.action.VIEW -d http://www.baidu.com
Starting: Intent { act=android.intent.action.VIEW dat=http://www.baidu.com }
am start -a android.intent.action.CALL -d tel:12345
Starting: Intent { act=android.intent.action.CALL dat=tel:xxx-xxx-xxxx }
几种VIEW类型(查看)的启动:
am start -a android.intent.action.VIEW -d file:///sdcard/image.jpg -t image/*
am start -a android.intent.action.VIEW -d file:///sdcard/audio.mp3 -t audio/*
am start -a android.intent.action.VIEW -d file:///sdcard/video.3gp -t video/*
几种GET_CONTENT类型(获取)的启动:
am start -a android.intent.action.GET_CONTENT -t image/*
am start -a android.intent.action.GET_CONTENT -t video/*
am start -a android.intent.action.GET_CONTENT -t audio/*
注意:
[–activity-brought-to-front]等的参数和 android.content.Intent类的FLAG_XXX内容相对应。
-f参数可以直接加代表10进制或者16进制的FLAG数字。
pm工具(应用程序包)
PM工具的含义为Package Manager。
pm
usage: pm [list|path|install|uninstall]
pm list packages [-f]
pm list permission-groups
pm list permissions [-g] [-f] [-d] [-u] [GROUP]
pm list instrumentation [-f] [TARGET-PACKAGE]
pm list features
pm path PACKAGE
pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f] PATH
pm uninstall [-k] PACKAGE
pm enable PACKAGE_OR_COMPONENT
pm disable PACKAGE_OR_COMPONENT
pm setInstallLocation [0/auto] [1/internal] [2/external]
列出安装包的信息。
pm list packages -f
另一个文件: /data/system/packages.xml
禁止包(或者组件),清除包的数据,可以排除个别包的影响。
pm disable {包名.组件名}
pm enable {包名.组件名}
pm clear {包名}
直接安装包
pm install /sdcard/SkeletonApp.apk
pkg: /sdcard/SkeletonApp.apk Success D/installd( 36): DexInv:
— BEGIN ‘/data/app/com.example.android.skeletonapp-1.apk’ — D/dalvikvm( 763): DexOpt: load 37ms, verify+opt 52ms D/installd(
36): DexInv: — END ‘/data/app/com.example.android.skeletonapp-1.apk’
(success) —
指定路径,进行安装
pm set-install-location
pm get-install-location
input工具(模拟按键工具)
input工具用于模拟用户的按键输入和文本输入。
input
usage: input [text|keyevent]
input text
input keyevent
input tap
input swipe
模拟按键的输入,按键码参考 android.View.KeyEvent。
input keyevent 82 # 菜单事件(MENU)
input keyevent 4 # 回退事件 (BACK)
input text “i_love_beijing” # 输入文字
模拟按键输入可以用于简单的程序调试,在Activity中实现onKeyUp()方法即可。
Android 4.0+才可以使用tap和swipe子命令。
ime工具(输入法管理)
ime工具用于输入法管理。
ime
usage: ime list [-a] [-s]
ime enable ID
ime disable ID
ime set ID
列出输入法:
ime list
选择输入法
ime set
连续命令行脚本
脚本实际上是利用了Android的shell系统运行的,同样可以传入命令行的参数。 通过使用am调用Activity,通过input进行输入事件,可以模拟一个可执行程序的执行过程。 脚本中还可以传递shell中传入的参数。
编写一个自动化脚本:
echo $*am start -a android.intent.action.VIEW -d about://blankecho "Enter Browser"input keyevent 82 echo "Browser Menu"input keyevent 22 input keyevent 22 input keyevent 66 input keyevent 4 echo "Browser Main"
运行脚本:
chmod 777 test.sh./test.sh
(我就不告诉你,很多同学通过这种方式去抓别人app的数据)
命令行和插入式组件结合的调试
Android应用程序APK调试的几个要点:
- 核心方法是利用命令行的Intent。
- 单次调用可使用BroadcastReceiver组件
- 后台调用可使用Service组件
- BroadcastReceiver组件也可放入其他组件内部
- 调用的参数使用Intent传入;
启动:am startservice和am broadcast
首要参数使用-a,数据参数为-d
AndroidManifest.xml当中要定义IntentFilter
带数据的Intet和不带数据的Intent命令行不同
:// : //…/ # ?
Host是字符串,Port是整数,Path是多个字符串, Segments是字符串,QueryParameter是无顺序的多个参数。
android.net.Uri类可以完成参数的
public abstract String getScheme ()public abstract String getHost() public abstract int getPort()public abstract String getFragment()public abstract String getPath()public abstract List getPathSegments()public String getQueryParameter(String key)public List getQueryParameters(String key)
方法:
am startservice -a android.intent.action.testtools.stub1 command://?key=10
am startservice -a android.intent.action.testtools.stub1 -d command://?key=5
am startservice -a android.intent.action.testtools.stub2 -d “command://?key1=hello&key2=120”
am broadcast -a android.intent.action.testtools.stub
am broadcast -a android.intent.action.testtools.stub command://abc:1234#hello
am broadcast -a android.intent.action.testtools.stub command:#/sdcard/test.txt
am broadcast -a android.intent.action.testtools.stub command://abc/hi1/hi2/hi3#hello
参数解析方法
String action = intent.getAction();Uri data = intent.getData();Log.i(TAG, "action = " + action + " data = " + data); if(null != data){ String host = data.getHost(); int port = data.getPort(); String path = data.getPath(); String fragment = data.getFragment(); Log.i(TAG, "[Host]:[" + host + "] " + "[Port]:[" + port + "] " + "[Path]:[" + path + "] " + "[Fragment]:[" + fragment + "] "); List pathlist = data.getPathSegments(); for(int i=0;i< pathlist.size();i++ ){ Log.i(TAG, "PATH["+i+"]:[" + pathlist.get(i) + "] "); }}
注意:不同的Android版本组件是否可以直接使用的问题。
Android的特殊命令
网络配置netcfg
netcfg -h
usage: netcfg [ {dhcp|up|down}]
netcfg
ndc和vdc
vdc volume list
ndc interface list
service
service -h
Usage: service [-h|-?]
service list
service check SERVICE
service call SERVICE CODE [i32 INT | s16 STR] … Options: i32: Write the integer INT into the send parcel. s16: Write the
UTF-16 string STR into the send parcel.
service list
iphonesubinfo等就是ServiceManager管理的服务名称。
直接利用Binder方式调用。
属性服务
Android具有prop属性系统,使用getprop和setprop可以获得属性和设置属性。
getprop查看属性值
getprop ro.secure
setprop 设置属性值
usage: setprop
watchprops检测属性值变化
watchprops用于监测属性的变化,直接运行这个命令,将形成循环,将把系统每一个属性的变化列出。
watchprops
<时间> 属性 = ‘属性值’ ……
<时间> 属性 = ‘属性值’
start和stop命令,用于开始和停止init进程中的service。
start {service_name}
stop {service_name}
解决Android系统的daemon被kill之后重新启动的问题
系统信息查看小工具
Android中还提供了dumpstate、dumpsys、bugreport等几个工具,用于查看系统各个方面的信息。
dumpstate
工具用于将系统设备的状态导出,通过访问sys文件系统和调用其他工具来完成。dumpsys
用于查看应用的状态。
由于dumpstate和dumpsys两个工具导出的内容都较多,最好在主机端配合adb来使用。procrank抓取内存信息
procrank工具用于抓取Android进程的内存使用信息。
procrank
VSS = Virtual Set Size
RSS = Resident Set Size
PSS = Proportional Set Size
USS = Unique Set Size
Android中的Linux命令
由于Android系统基于Linux实现,在系统中可以使用Linux中标准的方法进行调试。在Android中常用的通用Linux的调试方法主要包括以下几个:
- 系统信息工具(ps、kill、proc文件系统)
- /dev/设备文件和/sys/文件系统
- 系统性能工具(vmstat和top)
- gdb调试
ps和proc查看进程
ps
USER PID PPID VSIZE RSS WCHAN PC NAMEroot 1 0 268 180 c009b74c 0000875c S /initroot 2 0 0 0 c004e72c 00000000 S kthreadd各个内核线程root 3 2 0 0 c003fdc8 00000000 S ksoftirqd/0root 4 2 0 0 c004b2c4 00000000 S events/0……省略,其他各个内核线程各个由init的启动守护进程root 27 1 248 152 c009b74c 0000875c S /sbin/ueventdroot 29 1 3916 476 ffffffff afd0bdac S /system/bin/vold……省略,各个由init的启动守护进程 各个应用程序进程system 64 33 125924 29216 ffffffff afd0b6fc S system_server……省略,各个应用程序进程
使用ps -t <进程id>则表示查看某一个进程中的线程。
kill命令可以指定进程的id来杀死进程。
proc文件系统
/proc/<进程id>/为某一个进程的目录。
cat /proc/34/cmdline
/system/bin/mediaserver
cat /proc/34/status #进程状态
Name: mediaserver # 进程名称State: S (sleeping) # 进程状态Tgid: 34 # 线程组IDPid: 34 # 进程IDPPid: 1 # 父进程IDTracerPid: 0Uid: 1013 1013 1013 1013Gid: 1000 1000 1000 1000FDSize: 32Groups: 1003 1005 1006 3001 3002 3003 3004Threads: 8 # 所包含的线程数
环境变量
printenv命令用于查看系统中的各个环境变量
printenv
文件系统
moun命令用于查看系统的挂接的文件系统分区。
mount
rootfs / rootfs ro 0 0tmpfs /dev tmpfs rw,mode=755 0 0devpts /dev/pts devpts rw,mode=600 0 0proc /proc proc rw 0 0sysfs /sys sysfs rw 0 0none /acct cgroup rw,cpuacct 0 0tmpfs /mnt/asec tmpfs rw,mode=755,gid=1000 0 0tmpfs /mnt/obb tmpfs rw,mode=755,gid=1000 0 0none /dev/cpuctl cgroup rw,cpu 0 0/dev/block/mtdblock0 /system yaffs2 ro 0 0/dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0/dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0/dev/block/vold/179:0 /mnt/sdcard vfat
mount -t vfat /dev/block/mmcblk0p1 /sdcard
mount -o rw,remount -t yaffs /dev/block/mtdblock0 /system
网络配置和信息
ifconfig用于配置网络
ifconfig eth0 192.168.0.1 netmask 255.255.255.0
ifconfig eth0
eth0: ip 192.168.0.1 mask 255.255.255.0 flags [up broadcast running multicast]
route命令用于网络路由
route add default dev eth0
route add default gw 192.168.1.1 dev eth0
第一行表示增加了网卡eth0,第二行表示为这个网络设备设置网关(gw)。
iftop工具用于统计网络流量,按照网络设备列出接收数据(Rx)和发送数据(Tx)的情况:
iftop实时流量监控工具
Rx Txname MTU bytes packets errs drpd bytes packets errs drpd eth0 1500 0 0 0 0 0 0 0 0
netstat网络状态的信息获取工具
netstat
Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:5037 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:5555 0.0.0.0:* LISTEN tcp 0 0 10.0.2.15:5555 10.0.2.2:45610 ESTABLISHED
vmstat
vmstat在运行过程中,会定期打出一行的内容,表示系统当前的运行
- r:在运行队列中等待的进程数;
- b:在等待io的进程数;
- w:可以进入运行队列但被替换的进程;
- free:空闲的内存(单位k);
- mapped:影射的内存(单位k);
- in:每秒的中断数,包括时钟中断;
- cs:每秒的环境(上下文)切换次数;
- us:CPU使用时间;
- sy:CPU系统使用时间;
- id:闲置时间。
- VSS(Virtual Set Size):进程使用的虚拟内存
- RSS(Resident Set Size):进程使用的物理内存mstat
procs memory system cpu r b free mapped anon slab in cs flt us ni sy id wa ir 0 0 348688 33004 58068 4264 18 13 0 1 0 0 99 0 0 0 0 348688 33008 58068 4264 27 39 0 1 0 1 99 0 0 0 0 348688 33008 58068 4264 22 21 0 0 0 1 99 0 0 0 0 348688 33008 58068 4264 27 59 0 3 0 4 94 0 0 0 0 348688 33008 58068 4264 19 19 0 0 0 1 99 0 0 2 0 348068 33012 58592 4240 70 138 0 27 0 4 69 0 0 0 0 348068 33012 58592 4240 84 188 0 42 0 8 51 0 0 2 0 345632 33756 60124 4248 119 416 5 36 0 13 51 0 0 0 0 344392 32660 62044 4248 96 396 0 46 0 8 46 0 0 0 0 344020 32664 62392 4248 103 548 0 42 0 6 52 0 0 0 0 344020 33264 62372 4248 45 80 0 2 0 5 93 0 0 0 0 344020 33264 62372 4248 37 87 0 3 0 1 97 0 0 0 0 343896 33264 62372 4248 23 28 0 1 0 1 98 0 0 0 0 343896 33264 62372 4248 24 26 0 1 0 0 99 0 0 0 0 343896 33264 61992 4248 30 41 0 4 0 3 93 0 0
top
top命令表示列出系统最耗资源的进程,主要可以检测各个进程对CPU的消耗情况,信息将一屏一屏的阶段性地打印到终端上。
top
tcpdump
tcpdump命令是对网络上的数据包进行截获的工具(抓包工具),可以根据不同的协议、设备、端口等获取信息,得到的数据可供进一步的分析。
tcpdump -i any -p -s 0
tcpdump -i any -p -s 0 -w
00:20:52.011779 IP 10.0.2.2.33338 > 10.0.2.15.rplay: P 88033:88057(24) ack 878157 win 876000:20:52.012146 IP 10.0.2.15.rplay > 10.0.2.2.33338: P 878157:878367(210) ack 88057 win 584000:20:52.012421 IP 10.0.2.2.33338 > 10.0.2.15.rplay: P 88057:88081(24) ack 878367 win 876000:20:52.012840 IP 10.0.2.15.rplay > 10.0.2.2.33338: P 878367:878559(192) ack 88081 win 584000:20:52.013365 IP 10.0.2.2.33338 > 10.0.2.15.rplay: . ack 878559 win 876000:20:52.013369 IP 10.0.2.2.33338 > 10.0.2.15.rplay: P 88081:88105(24) ack 878559 win 876000:20:52.013757 IP 10.0.2.15.rplay > 10.0.2.2.33338: P 878559:878863(304) ack 88105 win 584000:20:52.014262 IP 10.0.2.2.33338 > 10.0.2.15.rplay: P 88105:88129(24) ack 878863 win 876000:20:52.014679 IP 10.0.2.15.rplay > 10.0.2.2.33338: P 878863:879149(286) ack 88129 win 584000:20:52.015087 IP 10.0.2.2.33338 > 10.0.2.15.rplay: P 88129:88153(24) ack 879149 win 876000:20:52.015486 IP 10.0.2.15.rplay > 10.0.2.2.33338: P 879149:879359(210) ack 88153 win 5840
/*
* @author zhoushengtao(周圣韬)
* @since 2015年7月3日 11:04:22
* @weixin stchou_zst
* @blog http://blog.csdn.net/yzzst
* @交流学习QQ群:341989536
* @私人QQ:445914891
/
版权声明:本文为博主原创文章,未经博主允许不得转载。