1.Android Debug Bridge -
adb常用命令
1.1简介
Android Debug Bridge,我们一般简称为adb,主要存放在sdk安装目录下的platform-tools文件夹中,它是一个非常强大的命令行工具,通过这个工具你能够与你的android设备进行交互。同时这是一个包含了以下三部分的cs模式的程序:
1) adb client
从图中,我们知道client是运行在PC端的,每当我们发起一个adb命令的时候,就会开启一个client程序。当然,当我们开启DDMS或者ADT的时候,也会自动创建client。
当我们开启一个client的时候,它首先会去检测后台是否已经有一个server程序在运行着,否则会开启一个adb-server进程。
所有的client都是通过5037端口与adb-server进行通信的。
2)adb daemon(adbd)
从图中,我们知道daemon是作为一个后台进程运行在模拟器/真实Android设备中的。
daemon使用端口的范围是5554-5585,每个模拟器/设备连接到PC端时,总会开启这么一个后台进程,并且为其分配了两个连续的端口,比如:
Emulator 1, console: 5554
Emulator 1, adb: 5555
也正因为每个设备都分一组两个端口,也已adb连接手机的最大数量为16。
说回端口的作用,在这两个端口中,其中偶数端口是用于server 与设备进行交互的,可以让server直接从设备中读取数据,而奇数端口是用来与设备的adbd进行连接通信的。
2) adb server
从图中,我们同样可以知道,server也是作为一个后台的程序运行在PC端的,他负责管理client进程以及adb daemon之间的通信。
当一个server开启的时候,他会自动绑定并且监听5037端口,接收client通过该端口发送过来的命令。同时server还会对5555-5585间的奇数端口进行扫描,进行对已连接设备的定位。
1.2 常用的adb命令
首先我们先来介绍一下,adb命令的使用格式吧:
adb是必须的,接下来方括号[]里面的内容不是必须的,最后才是我们需要执行的命令操作,例如 adb -s emulator-5554 install UCBrowser.apk (这是安装UC浏览器的意思)
下面先介绍下,前面几个参数的含义吧:
-d: 让唯一连接到该PC端的真实安卓设备执行命令,如果发现USB中连接有多部设备,将会报错
-e: 让唯一连接到该PC端的模拟器执行命令,如果发现开启了多个模拟器,将会报错
-s:通过设备的序列号进行指定设备执行命令
如果设备只连接有一个设备或者一个模拟器的时候,可以不用声明这三个参数,adb默认会让这部唯一连接到的设备进行命令执行。
ok,下面开始讲解常用的命令吧:
1) 查看当前PC端连接有多少设备:
终端中的执行结果为:
从上图中,我们看到了设备有的两种状态,其实执行该命令,可能返回的状态有三种:
I. device 设备已经成功连接到了adb-server
II. offline 设备并没有连接到adb或者没有响应
III. no device 并没有设备/模拟器连接
2) 查看adb的版本
终端中的执行结果为:
3) 给设备进行软件的安装
终端中的执行结果为:
除了上面这种方法,我们还有另外一个命令:
其中[options]中最常用的选项是-r,代表着本次安装是重新安装,会保留用户数据。
4) 卸载设备中已经安装的软件
终端中的执行结果为:
除了上面这种方法,我们还有另外一个命令:
这里的options是-k,加上该参数表明卸载软件后依旧保留用户数据
5) 将数据从设备复制到PC中
终端的执行结果:
在D://盘中我们也可以发现stericson-ls文件
6) 讲数据从PC端复制到设备中
终端的执行结果:
7) 获取连接到的手机的序列号
终端的执行结果:
8)获取设备的连接状态
终端的执行结果:
9) 等待设备连接成功
该命令将会阻塞一直到默认连接的那部机器状态变为device,也就是连接成功。
10) adb-server 的开启与关闭
终端的执行结果:
有时候我们开启server会失败,这是因为我们装了的手机助手,豌豆荚或者其他软件自带有自己的adb,导致端口冲突开启失败。主要关掉那些软件并且杀掉那些软件自带的adb进程重来即可。
1.2 手机执行Shell命令
众所周知,Android的内核本身就是Linux,所以Android本身也支持Linux命令,但是因为是手机系统,所以进行了一定的删减,部分命令不支持,而不支持的部分,我们可以通过安装busybox这个软件进行
填补。
下面我们讲解下如何在手机中执行Shell命令:
1) 每次都加上adb shell来进行命令的发送与执行
2) 先通过adb shell进入手机Shell执行状态,然后直接输入Linux命令,如图:
1.3 Activity Manager 常用命令与参数说明
一般情况下,我们最常用它来进行app的开启,并且传递一定的参数过去,比如:
详情的可以参考:http://developer.android.com/tools/help/adb.html#IntentSpec
在这里就不做太过详细和重复的说明了
1.4 Package Manager 常用命令与参数说明
1) 使一个apk处于禁用状态,相当于卸载了:
终端执行结果:
同时我们在手机上发现,UC浏览器的图标不见了
2) 让一个apk从禁用状态恢复过来
终端执行结果:
同时我们从手机上发现,UC浏览器的图标又回来啦。
3) 查看一个apk所在的路径
终端执行结果:
4) 查看手机中装的所有的包
具体更多的详情,可以参考:http://developer.android.com/tools/help/adb.html#IntentSpec
再次不做过多的说明
1.5其他常用的adb命令
1) 屏幕录像
例如,屏幕开始录像并且储存到/sdcard中,同时名字为demo.mp4
2) 关闭设备请求,开启设备
3)设备关机以及重启
2 android -
android常用命令
2.1 查看机器上所有已经安装的Android版本和AVD设备
2.1.1查看机器上已经安装的AVD(Android Virtual Device)设备
通过下面的命令我们可以查看机器上安装了的所有的AVD:
终端执行结果:
从图中我们可以看到,在我的机器上总共建立了两个avd,其中一个是2.3.3版本的 ,另一个是4.0版本的
2.1.2 查看机器上所有已经安装的Android版本
通过下面这个命令,我们可以查看到机器上已经安装了的Android版本:
终端执行结果:
上图中显示的只是其中的 一部分。
2.2 AVD设备管理
2.2.1创建AVD设备
首先,通过上面的命令我们可以查询到我们机器上所安装又的android版本,接下来,我们就可以根据我们的需求以及已安装的版本进行avd设备的创建。具体命令格式如下:
举个例子:
这样子我们就可以创建一个最简单的avd了,通过android list avd我们可以查看到这个avd:
2.2.2 升级AVD设备使之符合新的SDK环境
举个例子:
2.2.3 重命名AVD设备或者修改路径
2.2.4 删除AVD设备
2.3 Android项目管理
2.3.1创建一个新的Android项目
举个例子,我要在当前路径下的xiaoxuetu文件夹中创建一个名字为xiaoxuetu,包名是com.xiaoxuetu,activity名字为MainActivity的项目:
终端的执行结果为:
从结果中,我们就可以看到,执行命令后他为我们生成了一系列的文件,关于一个项目的具体架构,我们后面讲到。
2.3.2 更新一个Android项目
所谓的更新是什么呢?意思就是可以为一个已经存在的Android项目,添加库,修该项目名字,设置项目的针对的Android版本,同时还可以更新他的子项目,如测试项目。
我们先来给个简单的使用例子,后来再来介绍 -l 和 -s参数吧:
终端的执行结果:
2.3.3 创建库项目(lib project)
上面的属性 -l 其实指的就是库项目,而库项目(lib project)本身也是一个标准的android 项目。我们可以像之前那样创建一个库项目,也可以直接利用android工具本身自带的工具进行创建:
下面我们来举一个例子吧:
终端的执行结果为:
看起来,他本身和标准的Android 项目没有什么区别,差别主要在于project.properties文件中多了这么一个属性:
如果你想吧其他已经存在的项目更改成库项目,只要在它的project.properties文件中加入上面那一句即可。
2.3.4 更新库项目
更新库项目,比如说更新库项目针对的Android版本:
具体使用方法,跟前面 2.3.2 更新一个Android项目 一样,在此不做过多的说明
2.3.5 库项目的引入
其实这个在前面 Android项目创建和更新 的时候已经讲解过,使用的就是 -l (或者--library)这个参数:
当引入成功后,我们就会发现在project.properties文件中多了这么一行:
如果你引入的是多个库项目,那么将会使用.n来决定各个库项目的优先权:
当然我们也可以给library_projectC较高的优先权:
注意:.n一定是从1开始的
2.3.6 创建测试项目(test-project)
创建一个测试用的项目,可以用来测试安卓应用的Activity,Service等等,具体后面的博客会讲,在此不做详细的讲解,如果现在就想了解的话,可以先参考:http://developer.android.com/tools/testing/testing_android.html
下面主要讲解下-m这个参数,如果有这么一个项目/source/projectA,我们要建立一个测试项目/source/projectATest用于测试/source/projectA,那么,我们的m必须是../projectA,下面给出一个简单的例子,测试的是同一目录下之前创建的xiaoxuetu项目:
终端中的执行结果是:
2.3.7 更新测试项目(test-project)
更新该测试项目要测试的Android项目:
具体注意事项和执行结果跟前面的差不多,在此就不做多说明了。
3. emulator -
打包常用命令
一般情况下,我们使用这个命令进行模拟器的开启比较多
模拟器的开启方式如下:
一般情况下我们都是直接打开即可,具体的options可以参考http://developer.android.com/tools/help/emulator.html,在此不做重复说明
4. Android Asset Packaging Tool
Android Asset Packaging Tool,简称aapt,通过aapt,我们可以对打包的资源进行管理,包括查看,增加,删除。
4.1 查看资源包内的内容
终端的执行结果是:
4.2 查看APK内的指定内容
例如,我要查看这个包所使用到的权限:
终端的执行结果:
因为该项目并没有使用到权限,所以也就显示为空了。
4.3 打包生成资源压缩包
上面的参数有点多,下面给出一些常用参数的简单说明吧:
-f 如果编译出来的文件已经存在,强制覆盖
-m 使生成的包的目录存放在-J参数指定的目录
-J 指定生成的R.Java 的输出目录
-S res文件夹路径
-A assert文件夹路径
-I 某个版本平台的android.jar的路径
-F 具体指定APK文件的输出
-J R.java文件的生成目录
在AAPT中常用的命令格式是:
-I 额外添加的包必须包含android.jar这个jar包
下面举一个例子:
终端执行结果:
当然,这里打出来的apk并不是完整可用的,真正的apk打包还需要经过dex的编译等流程。
4.4 从压缩包中删除指定文件
首先,我们查看下前面打包的xiaoxuetu.apk里面的内容
下面如果我们要删除里面的AnroidManifest.xml文件,执行下面命令:
终端的执行结果:
什么都没有输出表示已经删除成功了,我们再来查看下该apk中的AnroidManifest.xml是不是真的已经被删除了:
是的,我们再也看不到AndroidManifest.xml。说明已经删除成功了。
4.5 往压缩包中添加指定文件
假设我们要往xiaoxuetu.apk中加回AndroidManifest.xml文件,我们继续执行:
终端的执行结果是:
我们再来查看xiaoxuetu.apk中的内容发现AndroidManifest.xml又回来啦:
4.6查看aapt的版本号
终端的执行结果:
5. javac编译java文件
首先我们来讲解下javac的用法:
通过上面的选项可以知道在编译过程中:
1) 由于我们的Android编码使用的是UTF-8,所以需要指定 -encoding UTF-8
2) 由于我们还需要指定生成特定VM版本的类文件,所以我们需要制定 -target 为1.7
3) 由于我们编译的是Android项目,所以需要另外Android的jar包,才能在编译过程中,避免引入错误,因此需要用到 -bootclasspath选项,引入响应android版本的jar包。
4) 由于我们需要制定编译后的class文件的输出位置,所以我们还需要用到 -d这个选项
因此,一般情况下我们编译一个安卓项目中的class文件的命令格式为:
下面举一个例子,直接编译xiaoxuetu这个Android项目的java文件:
终端的执行结果是:
我们在来看看xbin目录下,编译好的class文件都存在了:
6.使用dex编译Android应用
6.1 使用方法
相信大家都知道,在Android平台中,使用的是并没有遵循JVM规范的Dalvik虚拟机,他并不直接运行java二进制文件,而是运行它特有的*.dex文件,因此我们需要通过DX工具将Android应用的*.class文件转换为*.dexwenjian .
dex工具的常用命令格式如下
注意:<需要编译到的路径> 和 <需要编译的java文件所在的路径> 必须是全路径,否则他是以dx.bat所在的路径为相对路径进行查找和编译的
下面举一个例子,假设我要把前面编译的class文件转换成*.dex文件,需要执行命令:
终端的执行结果:
再到E:\Workspaces\android\xiaoxuetu\xbin目录下我们就会找到classes.dex这个文件出来了。
6.2 常见的问题
问题1 : 在编译过程中,总是出现以下问题:
原因:这是因为我们写了相对路径,假设dx.bat所在的路径是D:\android_dev_tools/platform_tools下,那么在编译的时候,它将会到 D:\android_dev_tools/platform_tools 目录去寻找xbin文件夹,所以找不到xbin文件夹
解决方法:像示例中那样使用绝对路径
问题2:在编译过程中,总是出现以下问题:
原因:经过谷歌,在Stackflow的解释为:
解决方法:在javac编译的时候,通过source和target指定版本为1.6,详情见示例。
7.apkbuilder
这个工具用于将各种资源打包成一个Android应用。它的使用方法是:
下面讲解下常用的命令吧:
-rf 参照源文件的目录的结构
-u 创建一个没有签名的包
-z 将某个压缩文件添加到包中
-f 将某个文件添加到保重
那么常用的apkbuilder命令格式就是:
注意:<需要编译到的路径> 和 <需要编译的java文件所在的路径> 必须是全路径
下面举个例子吧:
终端的执行结果是:
同时在E:\Workspaces\android\xiaoxuetu\xbin\我们可以打包好的apk文件了。
8.keytool -
签名常用命令
这是我们JDK自带的密钥和证书管理工具
一般情况下,我们都是直接通过以下格式的命令进行证书生成:
比如生成一个别名为 tbb 证书名字为tbb.keystore的证书:
执行该命令后,按照提示进行密码等情况的输入即可。
9.jarsigner
使用这个工具我们可以给apk进行签名:
一般情况下,对apk文件进行签名的命令格式为:
-verbose : 指定生成详细输出
下面举一个例子,为我们前面博文中建立的xiaoxuetu.apk进行签名:
终端的执行结果为:
10 zipalign
zipalign是Android自带的一个档案整理工具,可用于优化APK安装包,从而提升Android应用与系统之间的交互效率,提升应用程序的运行速度。
一般情况下,我们直接使用该命令的基本格式为:
下面就针对我们的xiaoxuetu.apk进行一次优化做为例子: