注意,当多个模拟器/设备在运行时,如果你没有为adb命令指定一个目标实例,adb将摄报错。
如果你有多个设备可用(硬件的或是模拟的),但只有一个模拟器,只需要简单地使用-e选项将命令输送到模拟器上。同样地,如果多个可用设备中只且个是硬件设备,则可以使用-d选项将命令输送到硬件设备上。
安装一个应用程序-Installing an Application
你可以使用adb将一个应用程序从你的开发电脑上复制并安装到一个模拟器/设备上。使用install命令可以完成这个功能。在这个命令中,你必须指明这个.apk文件的路径:
1 |
adb install <path_to_apk>
|
更多关于如果创建一个你可以用来在模拟器或设备实例上安装的.apk文件的信息,请见 创建并运行-Building and Running。
注意,如果你使用的时Eclipse开发环境,并且安装了ADT插件,你并不需要使用直接adb(或是aapt)来为你的模拟器/设备实例安装应用程序。取而代之的是,ADT为你处理了打包并安装的所有操作。
代理端口-Forwarding Ports
你可以使用forward命令来建立任意端口的代理-将一个任意的主机端口上的请求转发到另一个在不同端口上的模拟器/设备实例上。以下是一个建立代理的范例,其将主机端口号为6100上的请求转发到了在7100端口上的模拟器/设备上:
1 |
adb forward tcp:6100 tcp:7100
|
你也可以使用adb为指定的抽象地UNIX域套接字建立代理,如:
1 |
adb forward tcp:6100 local:logd
|
将文件复制到模拟器/设备实例上,或是从模拟器/设备实例上复制文件-Copying Files to or from an Emulator/Device Instance
你可以使用adb命令pull和push来将文件复制到模拟器/设备实例上,或是从模拟器/设备上复制出文件。不同于install命令(将APK文件复制到指定的路径),pull和push命令可以让你复制任意路径的文件,或是复制文件到模拟器/设备上的任务位置。
从模拟器或设备上复制一个文件或目录(及其子目录),使用:
1 |
adb pull <remote> <local>
|
复件一个文件或目录(及其子目录)到模拟器或设备上,使用:
1 |
adb push <local> <remote>
|
在这些命令中和分别代表了目标文件/目录在你的开发机器(local)和模拟器/设备实例(remote)上的路径。例如:
1 |
adb push foo.txt /sdcard/foo.txt
|
调用Shell命令-Issuing Shell Commands
Adb提供了一个Unix shell,它允许你在模拟器或是连接地设备上运行各种命令。这些命令的二进制文件存在于模拟器或设备的文件系统中,在/system/bin/…目录下。
两个最常用的工具是activity manager 和 [package manager] (pm)。
你可以adb命令加入shell 命令来决定是否进入模拟器/设备的adb远程shell中。调用一条命令,且不进入远程shell,其shell命令格式如下:
1 |
adb[-d|-e|-s <serialNumber>] shell <shell_command>
|
进入模拟器/设备上的远程shell,其格式为:
1 |
adb[-d|-e|-s <serialNumber>] shell
|
当你准备好退出远程shell时,可以按CTRL+D或是输入exit.
使用窗口管理器-Using activity manager(am)
在adb shell中,你可以通过窗口管理器(am)工具调用命令,它可以让你执行各种系统动作,如,启动一个窗口,强制停止一个进程,广播一个Intent,修改设备屏幕属性等等。在一个shell中,其语法为:
1 |
adm <command>
|
你也可以在adb中直接调用窗口管理命令而不进入远程shell,例如:
1 |
adb shell am start -a android.intent.action.VIEW
|
**表 2.**可用的窗口管理命令
参数详解
对于使用了参数的窗口管理命令,你可以其intent为以下选项之一:
-
-a < ACTION >
指定intent动作,例如“android.intent.action.VIEW”。这个参数只能申明一次。
-
-d < DATA_URI >
指定intent数据URI,例如:“content://contacts/pelple/1”。这个参数只能申明一次。
-
-t < MIME_TYPE >
指定intent MIME类型,例如:“image/png”。这个参数只能申明一次
-
-c < CATEGORY >
指定一个intent分类,例如:“android.intent.category.APP_CONTACTS”。
-
-n < COMPONENT >
指定组件名称及包名前缀,用来构建一个显性的intent,例如:“com.example.app/.ExampleActivity”。
-
-f < FLAGS 〉
为intent添加标志位,同setFlags())。
-
–esn < EXTRA_KEY >
附加一个空值,这个选项不支持URI intents。
-
-e|–es < EXTRA_KEY > < EXTRA_STRING_VALUE >
添加一个字符串类型的键-值对数据。
-
–ez < EXTRA_KEY > < EXTRA_BOOLEAN_VALUE>
添加一个布尔类型的键-值对数据。
-
–ei < EXTRA_KEY > < EXTRA_INT_VALUE>
添加一个数值类型的键-值对数据。
-
–el < EXTRA_KEY > < EXTRA_LONG_VALUE>
添加一个长整形型的键-值对数据。
-
–ef < EXTRA_KEY > < EXTRA_FLOAT_VALUE>
添加一个浮点型的键-值对数据。
-
–eu < EXTRA_KEY > < EXTRA_URI_VALUE>
添加一个URI类型的键-值对数据。
-
–ecn < EXTRA_KEY > < EXTRA_COMPONENT_NAME_VALUE >
添加一个组件名称,其已转化,并作为ComponentName对象传递。
-
–eia < EXTRA_KEY > < EXTRA_INT_VALUE >[,<EXTRA_INT_VALUE…]
添加一个整型数组。
-
–ela < EXTRA_KEY > < EXTRA_LONG_VALUE >[,<EXTRA_LONG_VALUE…]
添加一个长整型数组。
-
–efa < EXTRA_KEY > < EXTRA_FLOAT_VALUE >[,<EXTRA_FLOAT_VALUE…]
添加一个浮点型数组。
-
–grant-read-uri-permission
-
–grant-write-uri-permission
-
–debug-log-resolution
-
–exclude-stopped-packages
-
–include-stopped-packages
-
–activity-brought-to-front
-
–activity-clear-top
包含FLAG_ACTIVITY_CLEAR_TOP标志位。
-
–activity-clear-when-task-reset
-
–activity-exclude-from-recents
-
–activity-launched-from-history
-
–activity-multiple-task
-
–activity-no-animation
-
–activity-no-history
包含FLAG_ACTIVITY_NO_HISTORY标志位。
-
–activity-no-user-action
-
–activity-previous-is-top
-
–activity-reorder-to-front
-
–activity-reset-task-if-needed
-
–activity-single-top
包含FLAG_ACTIVITY_SINGLE_TOP标志位。
-
–activity-clear-task
包含FLAG_ACTIVITY_CLEAR_TASK标志位。
-
–activity-task-on-home
-
–receiver-registered-only
-
–receiver-replace-pending
-
–selector
要求使用-d和-t选项来设置intent数据及类型。
-
< URI > < COMPONENT > < PACKAGE >
当你没有使用以上的选项时,你也可以直接指定一个URI,包名,和组件名。当一个参数没有修饰限制时,如果它包含了“:”(冒号),则系统将假设其参数为URI,包含“/”(前向斜杆)时,假设参数为组件名,其它情况则假设为包名。
使用包管理-Using Package manager(pm)
在adb shell中,你可以使用包管理来工具来调用adb命令,来执行在设备上安装应用程序包或查寻已安装包的功能。在shell中,其语法如下:
1 |
pm <command>
|
你也可以在adb中调用包管理命令而不进入远程的shell,例如:
1 |
adb shell pm uninstall com.example.MyApp
|
写在最后
对程序员来说,很多技术的学习都是“防御性”的。也就是说,我们是在为未来学习。我们学习新技术的目的,或是为了在新项目中应用,或仅仅是为了将来的面试。但不管怎样,一定不能“止步不前”,不能荒废掉。
![
文章以下内容会给出阿里与美团的面试题(答案+解析)、面试题库、Java核心知识点梳理等
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-HBGqbMK1-1714458125130)]
[外链图片转存中…(img-Non2QQ1i-1714458125131)]
[外链图片转存中…(img-FuH5PgJY-1714458125131)]
文章以下内容会给出阿里与美团的面试题(答案+解析)、面试题库、Java核心知识点梳理等
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!