Android adb命令使用总结

来源:互联网 发布:程序员鄙视链图 编辑:程序博客网 时间:2024/05/18 22:43

一,写在前面

1,自己现在属于一个小菜鸟,每次遇到问题,或者出现bug,我都是打开android studio然后运行一下代码,再然后开始找到那个activity或者fragment的最后加断点或者打log去调试,这样的话定位问题慢,耗时长。

2,看着那些大牛,直接打了终端,啪啪几个命令就立刻,定位出问题,速度快,定位问题准

3,一点点积累,每学习一个命令,记录下来。

二,基础命令学习

1,adb devices获取设备列表及设备状态

2,adb get-state:获取设备的状态

说明:

  • device:设置正常连接
  • offline:设备出现异常,设备无响应
  • unknown:没有设备

3,adb kill-server , adb start-server : 结束 adb 服务, 启动 adb 服务,通常两个命令一起用。

4,adb install:安装应用,覆盖安装是使用 -r 选项。

     adb uninstall:卸载应用,后面跟的参数是应用的包名,请区别于 apk 文件名。

     adb -s <serialNumber> install <path-to-apk>:指定android设备安装apk文件。(既有模拟器,又有手机,较为常用)。

     adb -s <serialNumber> uninstall <pkg_name>:同上,意为卸载软件。

补充:

1)adb 安装软件,如果既有模拟器又有真机。

参数
含义
-d指定当前唯一通过 USB 连接的 Android 设备为命令目标-e指定当前唯一运行的模拟器为命令目标-s <serialNumber>指定相应 serialNumber 号的设备/模拟器为命令目标

 2)控制安装 APK 的行为。adb install -r/-s/-d

参数
含义
-r允许覆盖安装。-s将应用安装到 sdcard。-d允许降级覆盖安装。


5,adb pull :将 Android 设备上的文件或者文件夹复制到本地。

1
adb pull sdcard/pull.txt ~/Downloads/  #复制 Sdcard下的pull.txt文件到~/Downloads目录下。

      adb push:将本地文件推送到android设备中。

6,adb reboot :重启 Android 设备。原来有这个命令啊,我之前每一次都是把模拟器关了,再打开的,这以后就方便了,可以直接用命令。

三,高级命令学习

1,adb shell命令

adb 命令是 adb 这个程序自带的一些命令,而 adb shell 则是调用的 Android 系统中的命令,这些 Android 特有的命令都放在了 Android 设备的 system/bin 目录下,例如我再命令行中敲这样一个命令:

从上面的显示发现,很明显,在 bin 目录下并不存在这个命令。那么上面的提示已经告诉你了我们的adb shell命令在哪放着,于是就启动模拟器,将整个 system/bin 目录复制了出来,然后一个一个的去试。

那么上面提到的adb pull命令是不是就用上了啊。操作如下:
 

打开bin文件如下:

 

然后,我们在打开am文件,看下里面是什么:

#!/system/bin/sh## Script to start "am" on the device, which has a very rudimentary# shell.#base=/systemexport CLASSPATH=$base/framework/am.jarexec app_process $base/bin com.android.commands.am.Am "$@"
再诸如pm文件看一下:
# Script to start "pm" on the device, which has a very rudimentary# shell.#base=/systemexport CLASSPATH=$base/framework/pm.jarexec app_process $base/bin com.android.commands.pm.Pm "$@" 


下面就看一下比较常用的adb shell命令吧。

2,pm命令:Package Manager , 可以用获取到一些安装在 Android 设备上得应用信息。pm 的源码 Pm.java , 直接运行 adb shell pm 可以获取到该命令的帮助信息。

1)pm list package:列出安装在设备上的应用。(不带任何选项:列出所有的应用的包名

xdhywj@xdhywjdeMBP ~ » adb shell                                          root@vbox86p:/ # pm list packagepackage:com.example.firstapplicationpackage:com.awesomeprojectpackage:com.example.alertdialogcancelpackage:com.example.android.livecubespackage:com.example.xdhywj.my_listactivitypackage:com.android.providers.telephonypackage:com.example.xdhywj.observertestpackage:com.android.providers.calendarpackage:com.android.providers.mediapackage:com.example.xdhywj.myapplication_test1package:com.android.wallpapercropper......

2)adb shell pm list package -s:列出系统应用。

xdhywj@xdhywjdeMBP ~ » adb shell pm list packages -spackage:com.example.android.livecubespackage:com.android.providers.telephonypackage:com.android.providers.calendarpackage:com.android.providers.mediapackage:com.android.wallpapercropperpackage:com.android.voicedialerpackage:com.android.documentsuipackage:com.android.galaxy4package:com.android.externalstoragepackage:com.android.htmlviewerpackage:com.android.quicksearchbox......

 3)adb shell pm list package -3:列出第三方应用,发现没全都是我们自己的应用程序。
xdhywj@xdhywjdeMBP ~ » adb shell pm list packages -3package:com.example.firstapplicationpackage:com.awesomeprojectpackage:com.example.alertdialogcancelpackage:com.example.xdhywj.my_listactivitypackage:com.example.xdhywj.observertestpackage:com.example.xdhywj.myapplication_test1package:com.sankuai.meituanpackage:com.xdhywj.eventbusdemopackage:com.example.xdhywj.myspawnpackage:com.xdhywj.myspawnpackage:com.example.layoutinflatertestpackage:com.example.xdhywj.servicetestpackage:com.example.xdhywj.myviewpackage:com.example.spannabletext......

4)adb shell pm list package -f列出应用包名及对应的apk名及存放位置。

xdhywj@xdhywjdeMBP ~ » adb shell pm list packages -f  package:/data/app/com.example.firstapplication-2/base.apk=com.example.firstapplicationpackage:/data/app/com.awesomeproject-1/base.apk=com.awesomeprojectpackage:/data/app/com.example.alertdialogcancel-2/base.apk=com.example.alertdialogcancelpackage:/system/app/CubeLiveWallpapers/CubeLiveWallpapers.apk=com.example.android.livecubespackage:/data/app/com.example.xdhywj.my_listactivity-2/base.apk=com.example.xdhywj.my_listactivitypackage:/system/priv-app/TelephonyProvider/TelephonyProvider.apk=com.android.providers.telephonypackage:/data/app/com.example.xdhywj.observertest-1/base.apk=com.example.xdhywj.observertestpackage:/system/priv-app/CalendarProvider/CalendarProvider.apk=com.android.providers.calendar......
那么我们是不是可以列出第三方应用对应的apk名以及存放的位置。参数为:-3 -f。

xdhywj@xdhywjdeMBP ~ » adb shell pm list packages -3 -fpackage:/data/app/com.example.firstapplication-2/base.apk=com.example.firstapplicationpackage:/data/app/com.awesomeproject-1/base.apk=com.awesomeprojectpackage:/data/app/com.example.alertdialogcancel-2/base.apk=com.example.alertdialogcancelpackage:/data/app/com.example.xdhywj.my_listactivity-2/base.apk=com.example.xdhywj.my_listactivitypackage:/data/app/com.example.xdhywj.observertest-1/base.apk=com.example.xdhywj.observertestpackage:/data/app/com.example.xdhywj.myapplication_test1-1/base.apk=com.example.xdhywj.myapplication_test1package:/data/app/com.sankuai.meituan-2/base.apk=com.sankuai.meituan......
5)adb shell pm list package -i列出应用包名及其安装来源,结果显示例子(命令最后增加 FILTER:过滤关键字,可以很方便地查找自己想要的应用

xdhywj@xdhywjdeMBP ~ » adb shell pm list packages -i  package:com.example.firstapplication  installer=nullpackage:com.awesomeproject  installer=nullpackage:com.example.alertdialogcancel  installer=nullpackage:com.example.android.livecubes  installer=nullpackage:com.example.xdhywj.my_listactivity  installer=nullpackage:com.android.providers.telephony  installer=nullpackage:com.example.xdhywj.observertest  installer=null......

 6)adb shell pm list package -f -3 -i meituan:查找三方应用中美团的包名、apk存放位置、安装来源。查到了有两个:一个是美团,一个是秦皇。

xdhywj@xdhywjdeMBP ~ » adb shell pm list package -f -3 meituanpackage:/data/app/com.sankuai.meituan-2/base.apk=com.sankuai.meituanpackage:/data/app/com.meituan.spawn-1/base.apk=com.meituan.spawn


7)pm path:列出对应包名的 .apk 位置。例如:

xdhywj@xdhywjdeMBP ~ » adb shell pm path com.sankuai.meituanpackage:/data/app/com.sankuai.meituan-2/base.apk

 8)pm dump:列出指定应用的 dump 信息,里面有各种信息。例如:
xdhywj@xdhywjdeMBP ~ » adb shell pm dump com.sankuai.meituanDUMP OF SERVICE package:  Activity Resolver Table:    Schemes:        imeituan:          26ac82 com.sankuai.meituan/com.meituan.android.travel.poi.TravelPoiListActivity          57b03b com.sankuai.meituan/.topic.TopicActivity          71af37 com.sankuai.meituan/.survey.SurveyActivity          8112f9 com.sankuai.meituan/.review.KtvReviewActivity          a90794 com.sankuai.meituan/com.meituan.android.travel.dealdetail.schedule.ScheduleDetailActivity          e77dc4 com.sankuai.meituan/com.meituan.android.hotel.prepay.PrePayOrderCreateActivity......
9)pm install/pm uninstall:安装应用/卸载应用,此时apk文件存放于Android设备上,与adb install/uninstall不用。
3,am命令又是一个庞大的命令,am 源码 Am.java。这个命令一定要学好了,我们会经常用到,使用此命令可以从cmd控制台启动 activity, services;发送 broadcast等等。

重点:adb shell am start -n 包名/包名+类名(-n 类名,-a action,-d date,-m MIME-TYPE,-c category,-e 扩展数据,等)

    1)am start -nam start -n {包(package)名}/{包名}.{活动(activity)名称}。例如启动系统自带的计算器。

xdhywj@xdhywjdeMBP ~ » adb shell am start -n com.android.calculator2/com.android.calculator2.CalculatorStarting: Intent { cmp=com.android.calculator2/.Calculator }#或者可以这样xdhywj@xdhywjdeMBP ~ » adb shell am start -n com.android.calculator2/.CalculatorStarting: Intent { cmp=com.android.calculator2/.Calculator }#启动系统日历xdhywj@xdhywjdeMBP ~ » adb shell am start -n com.android.calendar/.LaunchActivityStarting: Intent { cmp=com.android.calendar/.LaunchActivity }#启动浏览器xdhywj@xdhywjdeMBP ~ » adb shell am start -n com.android.browser/com.android.browser.BrowserActivityStarting: Intent { cmp=com.android.browser/.BrowserActivity }......#打开秦皇xdhywj@xdhywjdeMBP ~ » adb shell am start -n com.meituan.spawn/.MainActivityStarting: Intent { cmp=com.meituan.spawn/.MainActivity }#打开美团欢迎界面xdhywj@xdhywjdeMBP ~ » adb shell am start -n com.package.name/.activity.WelcomeStarting: Intent { cmp=com.com.package.name/.activity.Welcome }#打开美团主页xdhywj@xdhywjdeMBP ~ » adb shell am start -n com.package.name/.activity.MainActivityStarting: Intent { cmp=com.com.package.name/.activity.MainActivity }
2)am start -a:-a 表示action (android.intent.action.MAIN)。下面举一个例子:
#通过-a指定action,打开美团中附近的地图界面xdhywj@xdhywjdeMBP ~ » adb shell am start -a com.meituan.android.intent.action.near_poi_map -n com.sankuai.meituan/.common.map.NearPoiMapStarting: Intent { act=com.meituan.android.intent.action.near_poi_map cmp=com.sankuai.meituan/.common.map.NearPoiMap }

3)am start -d:-d表示data (android.intent.data)。下面举几个例子:

     首先看一下在Manifest.xml文件中找几个有data属性的Activity,如下所示: 

//登陆界面:<activity    android:name="com.meituan.passport.LoginActivity"    android:configChanges="orientation|keyboardHidden"    android:screenOrientation="portrait"    android:theme="@style/App.Passport">    <intent-filter>        <action android:name="android.intent.action.VIEW" />        <category android:name="android.intent.category.DEFAULT" />        <category android:name="android.intent.category.BROWSABLE" />        <data            android:host="www.meituan.com"            android:path="/signin"            android:scheme="imeituan" />    </intent-filter>    <intent-filter>    <action android:name="com.meituan.android.intent.action.login" />    <category android:name="android.intent.category.DEFAULT" />    </intent-filter></activity>  //城市选择界面<activity    android:name=".city.CityActivity"    android:configChanges="orientation|keyboardHidden"    android:screenOrientation="portrait"    android:windowSoftInputMode="adjustPan|stateHidden">    <intent-filter>        <action android:name="android.intent.action.VIEW" />        <category android:name="android.intent.category.DEFAULT" />        <category android:name="android.intent.category.BROWSABLE" />        <data            android:host="www.meituan.com"            android:path="/city/list"            android:scheme="imeituan" />    </intent-filter></activity>

登陆界面的启动方式:
#通过data打开登陆界面xdhywj@xdhywjdeMBP ~ » adb shell am start -d imeituan://com.package.name/signinStarting: Intent { dat=imeituan://www.meituan.com/signin }  #通过data开店城市选择界面xdhywj@xdhywjdeMBP ~ » adb shell am start -d imeituan://www.meituan.com/city/listStarting: Intent { dat=imeituan://www.meituan.com/city/list }
 4)am start -e:在打开activity的时候,带上扩展参数。类似于extra:key–value。 
#相当于带extra的intent。其中key和value分别对应于intent中的key value,是不是非常的方便啊。赞一个xdhywj@xdhywjdeMBP ~ » adb shell am start -d imeituan://www.meituan.com/city/list -e key value                  Starting: Intent { dat=imeituan://www.meituan.com/city/list (has extras) }  #跳转到支付结果页面xdhywj@xdhywjdeMBP ~ » adb shell am start -n "com.com.package.name/.pay.PayResultActivity" -e bigOrderId 6782909Starting: Intent { cmp=com.com.package.name/.pay.PayResultActivity (has extras) }
那么我们在传intent的时候,是不是经常用到putStringExtra(), putIntExtra,那么这样传指定类型的extra应该怎么处理呢,其实adb也已经给我们设计好了,是不是很赞啊。
putStringExtra():[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]putIntExtra():[-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]putBooleanExtra():[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]......#例子:调用putIntExtra():其中key为bigOrderId,value为int类型。am start -n "com.sankuai.meituan/.pay.PayResultActivity" --ei "bigOrderId" 6782909

4,启动Services

单独拉出来说了,上面全都是启动activity,为了不混淆,单独说下启动services。

1)启动一个service,service在后台运行,所以可以去应用程序列表看。参数:-n表示组件。-a表示action。

#其中-a即就是对应的action,-ei:putIntExtra("level",3),-ei:putIntExtra("scale",100).adb shell am startservice -n com.android.music/com.android.music.MediaPlaybackServiceadb shell am startservice -a com.meituan.myservice#结果Starting service: Intent { cmp=com.android.music/.MediaPlaybackService }
2)停止service。以AndroidManifest文件中的配置为例子:
<service android:name="com.some.package.name.YourServiceSubClassName" android:permission="com.some.package.name.YourServiceSubClassName">    <intent-filter>        <action android:name="com.some.package.name.YourServiceSubClassName"/>    </intent-filter></service>
启动service和停止service:
#启动serviceadb shell am startservice com.some.package.name/.YourServiceSubClassName#停止serviceadb shell am force-stop com.some.package.name

5,启动Broadcast

也同样单独拉出来说。

发送一个系统广播,模拟手机低电量环境

#其中-a即就是对应的action,-ei:putIntExtra("level",3),-ei:putIntExtra("scale",100).adb shell am broadcast -a android.intent.action.BATTERY_CHANGED --ei "level" 3 --ei "scale" 100

四,查看手机尺寸和密度

1,使用adb查看手机尺寸 

2,使用adb查看手机的密度

五、清除应用数据与缓存

六、强制停止应用 

七、查看前台 Activity



0 0