• (OK) Android调试命令小结



    http://blog.csdn.net/yzzst/article/details/47128581


    http://www.myexception.cn/android/1976365.html


    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://blank
    echo "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
    0


    setprop 设置属性值

    usage: setprop

    watchprops检测属性值变化
    watchprops用于监测属性的变化,直接运行这个命令,将形成循环,将把系统每一个属性的变化列出。

    watchprops

    <时间> 属性 = ‘属性值’ ……
    <时间> 属性 = ‘属性值’


    start和stop命令,用于开始和停止init进程中的service。

    start {service_name}
    stop {service_name}

    解决Android系统的daemon被kill之后重新启动的问题

    系统信息查看小工具

    Android中还提供了dumpstate、dumpsys、bugreport等几个工具,用于查看系统各个方面的信息。

    1. dumpstate
      工具用于将系统设备的状态导出,通过访问sys文件系统和调用其他工具来完成。

    2. dumpsys
      用于查看应用的状态。
      由于dumpstate和dumpsys两个工具导出的内容都较多,最好在主机端配合adb来使用。

    3. 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         NAME
    root      1     0     268    180   c009b74c 0000875c S /init
    root      2     0     0      0     c004e72c 00000000 S kthreadd
    各个内核线程
    root      3     2     0      0     c003fdc8 00000000 S ksoftirqd/0
    root      4     2     0      0     c004b2c4 00000000 S events/0
    ……省略,其他各个内核线程
    各个由init的启动守护进程
    root      27    1     248    152   c009b74c 0000875c S /sbin/ueventd
    root      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                                    # 线程组ID
    Pid:    34                                    # 进程ID
    PPid:   1                                     # 父进程ID
    TracerPid:      0
    Uid:    1013    1013    1013    1013
    Gid:    1000    1000    1000    1000
    FDSize: 32
    Groups: 1003 1005 1006 3001 3002 3003 3004
    
    Threads:        8                             # 所包含的线程数

    环境变量

    printenv命令用于查看系统中的各个环境变量

    printenv


    文件系统

    moun命令用于查看系统的挂接的文件系统分区。

    mount

    rootfs / rootfs ro 0 0
    tmpfs /dev tmpfs rw,mode=755 0 0
    devpts /dev/pts devpts rw,mode=600 0 0
    proc /proc proc rw 0 0
    sysfs /sys sysfs rw 0 0
    none /acct cgroup rw,cpuacct 0 0
    tmpfs /mnt/asec tmpfs rw,mode=755,gid=1000 0 0
    tmpfs /mnt/obb tmpfs rw,mode=755,gid=1000 0 0
    none /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                              Tx
    name     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 8760
    00:20:52.012146 IP 10.0.2.15.rplay > 10.0.2.2.33338: P 878157:878367(210) ack 88057 win 5840
    00:20:52.012421 IP 10.0.2.2.33338 > 10.0.2.15.rplay: P 88057:88081(24) ack 878367 win 8760
    00:20:52.012840 IP 10.0.2.15.rplay > 10.0.2.2.33338: P 878367:878559(192) ack 88081 win 5840
    00:20:52.013365 IP 10.0.2.2.33338 > 10.0.2.15.rplay: . ack 878559 win 8760
    00:20:52.013369 IP 10.0.2.2.33338 > 10.0.2.15.rplay: P 88081:88105(24) ack 878559 win 8760
    00:20:52.013757 IP 10.0.2.15.rplay > 10.0.2.2.33338: P 878559:878863(304) ack 88105 win 5840
    00:20:52.014262 IP 10.0.2.2.33338 > 10.0.2.15.rplay: P 88105:88129(24) ack 878863 win 8760
    00:20:52.014679 IP 10.0.2.15.rplay > 10.0.2.2.33338: P 878863:879149(286) ack 88129 win 5840
    00:20:52.015087 IP 10.0.2.2.33338 > 10.0.2.15.rplay: P 88129:88153(24) ack 879149 win 8760
    00: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
    /
  • 相关阅读:
    extJs学习基础4 Ext.each的用法
    extJs学习基础3 ajax与php交互
    extJs学习基础2
    extJs学习基础
    model 的验证
    创建模型,设置id
    inheritableStatics 与statics类
    关于在jeecms中css,图片,html,模板是如何组装成——part2
    FreeMarker的实例通俗理解
    eclipse启动了tomcat,但是浏览器打不开欢迎页
  • 原文地址:https://www.cnblogs.com/ztguang/p/12646138.html
Copyright © 2020-2023  润新知