1. 怎样在Ubuntu下安装android SDK/ADB
Ubuntu电脑安装Android SDK/ADB
第一步,你要下载linux版Android SDK的安装或文件包,然后你需要从Android SDK Manager内下载Platform Tools
Package
请从Google官方获取Android
SDK安装或文件包,通常情况,你下载的文件名为android-sdk_rxx-linux.tgz的形式,rxx代表版本,比如,r16版,即android-sdk_r16-linux.tgz,r24版,即android-sdk_r24-linux.tgz
请放置Android SDK安装或文件包在你的用户主目录
在你的Ubuntu电脑上打开终端窗口
解压Android SDK文件:
cd ~
tar -zxvf android-sdk_r16-linux.tgz
在~/android-sdk-linux/tools字目录,有一个叫做android的可执行文件,尽管名字是android,但它实际上是Android
SDK Manager
运行Android SDK Manager:
./~/android-sdk-linux/tools/android
选择Android SDK
Tools与Android SDK Platform-tools项,点Install
packages安装Platform Tools
Package工具包。包括ADB与Fastboot可执行的文件在内的工具包都会被下载,由于下载的文件较多而需要一定的时间,你能去喝点东西
你下载的Platform Tools
Package工具包文件将位于新创建的~/android-sdk-linux/platform-tools目录
第二步,修改ADB与Fastboot可执行文件的默认PATH路径环境。PATH环境变量可以是在~/.profile(或~/.bash_profile)或者~/.bashrc文件内修改,~/.profile文件是读取所有交互式Shell的登录,~/.bashrc文件读取所有非交互式Shell的登录(如sftp),在大多数默认情况下,~/.profile文件导入所有~/.bashrc文件的设置。PATH命令设定的改变必须包括/android-sdk-linux/tools与/android-sdk-linux/platform-tools目录
kevdog的PATH命令设定通过Ubuntu系统内初始的默认编辑器Gedit在~/.bashrc文件底部增加了一行:
export
PATH=${PATH}:${HOME}/android-sdk-linux/tools:${HOME}/android-sdk-linux/platform-tools
第三步,我们需要为Ubuntu创建udev设备管理规则,从而让设备在通过USB端口连接到电脑时能被正确地识别
将设备连接到电脑,然后执行命令:
lsusb
你会看到类似于下面的输出信息:
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation
2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004
Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001:
ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 063: ID 04e8:6860
Samsung Electronics Co., Ltd
由于kevdog的设备是Samsung的某款设备,因此你能看到相应的识别信息:
Bus 001 Device 063: ID
04e8:6860 Samsung Electronics Co., Ltd
我们来解释下上面的识别信息:
Bus 001 Device
063,设备端的名称是/dev/bus/usb/001/063,即这个信息可以帮助我们确定设备端的名称
04e8,vendorID,即供货商编号
6860,proctID,即产品编号
使用设备端的名称/dev/bus/usb/001/063可以让我们查询设备的属性,查询这些属性有时很有必要,因为udev设备管理匹配设备是基于特定标准的。为此,我们需要一个正确的udev设备匹配规则集,这个过程的第一步就是查询能被连接或插入到我们规则集的准则,这可以通过udevadm程序来实现,并且有两种方式现,它们生成的输出信息为我们的设备构建udev设备管理规则:
udevadm查询udev设备管理规则方法1:
udevadm info -q all -n <name of device
node>
根据原作者的实际情况,设备端名称是/dev/bus/usb/001/063,因此命令是:
udevadm info -q all -n /dev/bus/usb/001/063
你会看到类似于下面的输出信息:
$ udevadm info -q all -n /dev/bus/usb/001/063
P:
/devices/pci0000:00/0000:00:1d.7/usb1/1-8
N: bus/usb/001/063
S:
libmtp-1-8
S: GalaxyNexus
E: UDEV_LOG=3
E:
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-8
E: MAJOR=189
E:
MINOR=62
E: DEVNAME=/dev/bus/usb/001/063
E: DEVTYPE=usb_device
E:
DRIVER=usb
E: PRODUCT=4e8/6860/216
E: TYPE=0/0/0
E: BUSNUM=001
E: DEVNUM=063
E: SUBSYSTEM=usb
E: ID_MTP_DEVICE=1
E:
ID_MEDIA_PLAYER=samsung_galaxy-s2
E: ID_VENDOR=samsung
E:
ID_VENDOR_ENC=samsung
E: ID_VENDOR_ID=04e8
E: ID_MODEL=Galaxy
E:
ID_MODEL_ENC=Galaxy
E: ID_MODEL_ID=6860
E: ID_REVISION=0216
E:
ID_SERIAL=samsung_Galaxy_0146B06501005018
E:
ID_SERIAL_SHORT=0146B06501005018
E: ID_BUS=usb
E:
ID_USB_INTERFACES=:ffff00:ff4201:
E: DEVLINKS=/dev/libmtp-1-8
/dev/GalaxyNexus
E: TAGS=:udev-acl:
我们使用的规则从有E:(E=ENV=Device
Property设备属性值)的行开始
udevadm查询udev设备管理规则方法2:
udevadm info -a -p $(udevadm info -q path
-n <name of device node>)
根据原作者的实际情况,设备端名称是/dev/bus/usb/001/063,因此命令是:
udevadm info -a -p
$(udevadm info -q path -n /dev/bus/usb/001/063)
你会看到类似于下面的输出信息:
$ udevadm info -a -p $(udevadm info -q path -n /dev/bus/usb/001/063)
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found,
all possible attributes in the udev rules key format.
A rule to match, can
be composed by the attributes of the device
and the attributes from one
single parent device.
looking at device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-8':
KERNEL=="1-8"
SUBSYSTEM=="usb"
DRIVER=="usb"
ATTR{configuration}==""
ATTR{bNumInterfaces}==" 2"
ATTR{bConfigurationValue}=="1"
ATTR{bmAttributes}=="80"
ATTR{bMaxPower}=="500mA"
ATTR{urbnum}=="29"
ATTR{idVendor}=="04e8"
ATTR{idProct}=="6860"
ATTR{bcdDevice}=="0216"
ATTR{bDeviceClass}=="00"
ATTR{bDeviceSubClass}=="00"
ATTR{bDeviceProtocol}=="00"
ATTR{bNumConfigurations}=="1"
ATTR{bMaxPacketSize0}=="64"
ATTR{speed}=="480"
ATTR{busnum}=="1"
ATTR{devnum}=="63"
ATTR{devpath}=="8"
ATTR{version}==" 2.00"
ATTR{maxchild}=="0"
ATTR{quirks}=="0x0"
ATTR{avoid_reset_quirk}=="0"
ATTR{authorized}=="1"
ATTR{manufacturer}=="samsung"
ATTR{proct}=="Galaxy"
ATTR{serial}=="0146B06501005018"
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}==" 0mA"
ATTRS{urbnum}=="1403"
ATTRS{idVendor}=="1d6b"
ATTRS{idProct}=="0002"
ATTRS{bcdDevice}=="0300"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
ATTRS{devpath}=="0"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="8"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Linux 3.0.0-14-generic
ehci_hcd"
ATTRS{proct}=="EHCI Host Controller"
ATTRS{serial}=="0000:00:1d.7"
ATTRS{authorized_default}=="1"
looking at parent device '/devices/pci0000:00/0000:00:1d.7':
KERNELS=="0000:00:1d.7"
SUBSYSTEMS=="pci"
DRIVERS=="ehci_hcd"
ATTRS{vendor}=="0x8086"
ATTRS{device}=="0x27cc"
ATTRS{subsystem_vendor}=="0x103c"
ATTRS{subsystem_device}=="0x3010"
ATTRS{class}=="0x0c0320"
ATTRS{irq}=="20"
ATTRS{local_cpus}=="ff"
ATTRS{local_cpulist}=="0-7"
ATTRS{dma_mask_bits}=="32"
ATTRS{consistent_dma_mask_bits}=="32"
ATTRS{broken_parity_status}=="0"
ATTRS{msi_bus}==""
ATTRS{companion}==""
looking at
parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
我们使用的规则从有ATTRS(ATTRS=Device
Attributes设备属性)的行开始
不管是ENV,还是ATTRS,我们可以构建一个udev设备管理规则集。规则集的名称可以随意,根据原作者的意图,我们叫做51-android.rules:
你能这样建立规则集文件:
gksu gedit /etc/udev/rules.d/51-android.rules
之后,请在规则集文件中加入相关的规则,以原作者的规则来看,注意是一行一个:
SUBSYSTEM=="usb",
ENV{ID_VENDOR_ID}=="04e8", ENV{ID_MODEL}=="Galaxy", MODE="0666",
SYMLINK+="GalaxyNexus"
SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="04e8",
ENV{ID_MODEL_ID}=="6860", MODE="0666", SYMLINK+="GalaxyNexus"
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProct}=="6860",
ATTR{proct}=="Galaxy" MODE="0666", SYMLINK+="GalaxyNexus"
如上面所加的规则,这些规则匹配准则是SUBSYSTEM,
ENV,ATTR,它只会修改设备的模式MODE(0666=rw-rw-rw-)与创建链接于/dev/GalaxyNexus的GalaxyNexus标识。当然,更多的指令可以分配给设备,如插入或移除设备时的执行命令,你能这样指定指令:
ACTION=="add", RUN+="<name of action>"
ACTION==”remove”,
RUN+="<name of action>"
例如,我们要设定设备在插入或弹出时播放一个声音或MP3文件,可以如下指令设定:
ACTION=="add", RUN+="/usr/local/bin/NexusMount.sh"
ACTION==”remove”, RUN+="/usr/local/bin/NexusUnmount.sh"
需要注意的是,每个ACTION指令设定必须在它自己的命令行;目录必须正确;指令可以是多重设定
一旦规则构建完成,我们需要保存/etc/udev/rules.d/51-android.rules规则文件
在你执行规则集前,测试一下通常是一个好主意,因为那样你能很容易地找出编写规则集的错误:
你能使用udevadm工具简单地完成规则集的测试:
udevadm info -q path -n d=<device
name>
根据原作者的设备端名/dev/bus/usb/001/063,测试行为:
udevadm test --action="SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="04e8",
ENV{ID_MODEL}=="Galaxy" MODE="0666", SYMLINK+="GalaxyNexus"" $(udevadm info -q
path -n /dev/bus/usb/001/063)
虽然测试输出行相当长,两行输出信息正确地识别规则集的指令设定:
udev_rules_apply_to_event: MODE 0666
/etc/udev/rules.d/51-android.rules:1
udev_rules_apply_to_event: LINK
'GalaxyNexus' /etc/udev/rules.d/51-android.rules:1
一旦你确认了规则集正确,请重启udev设备管理服务:
sudo service udev restart
第四步,退出电脑的登录,然后重新登录回
在设备插入的情况下,执行ADB命令,如确认设备连接:
$ adb devices
你会看到设备识别号信息,根据原作者的设备,它是
0146B06501005018 device
如果你的设备已启动在Fastboot模式,许多设备不启动可能也行,你能执行Fastboot命令,如标准的Fastboot设备:
$
fastboot devices
2. ubuntu下怎么找不到android adb
最近在写一个播放rtsp的测试程式,这个需要真机上测试,结果在Ubuntu 10.04上,接上Android2.1的手机后,adb service没有找到设备,只有模拟器的。
于是上网找了写资料,以下两篇文章帮助我解决了这个问题。
No. 1
首先确认,我已经在G1的settings-applications-development-debug mode里面打勾。而且手机也有提示connected,但是adb死活不认。
最后找到了解决方法,一次成形。
以下为引用全文
SDK 上关于如何在 Ubuntu上安装 adb驱动的说明并不详细,经过搜索找到了确实的解决方法,首先按照 SDK 上的说明建立 udev 的 rules 文件,然后:
在 Ubuntu 9.04 下通过usb连接 Android设备,使用 adb 时,会返回无法找到设备,解决办法如下:
1) 在终端运行 lsusb
会发现结果有会有如下类似记录:
Bus 001 Device 008: ID 0bb4:0c02 High Tech Computer Corp.
这时键入
sudo vim /etc/udev/rules.d/50-android.rules
在打开的文件中增加以下文本:
SUBSYSTEM=="usb", SYSFS{"High Tech Computer Corp."}=="0bb4", MODE="0666"
2) 运行以下命令:
sudo chmod a+rx /etc/udev/rules.d/50-android.rules
sudo /etc/init.d/udev restart
3) 在 android sdk 的 tools 目录下运行 (这一步很重要,必须要sudo,否则没效果)
sudo ./adb kill-server
sudo ./adb devices
然后,就可以直接用 adb 来进行操作了。
No. 2
在ubuntu(9.10)下执行adb devices命令, 返回的结果是:
List of devices attached
???????????? no permissions
这意味着,USB连接的设备是能够被识别的。Google之后,得知adb server需要以root的权限启动,于是有了如下命令:
www.linuxidc.com@linuxidc-laptop:~/Dev/Java/Android/android-sdk-linux_86/tools$ ./adb kill-server
www.linuxidc.com@linuxidc-laptop:~/Dev/Java/Android/android-sdk-linux_86/tools$ sudo ./adb start-server
* daemon not running. starting it now *
* daemon started successfully *
第一条命令用来杀死当前正在运行的server, 第二条命令则以root的权限启动了新的server. 我们可以再次查看devices:
www.linuxidc.com@linuxidc-laptop:~/Dev/Java/Android/android-sdk-linux_86/tools$ ./adb devices
List of devices attached
HT848KV04386 device
这次设备就被正确识别了。自然地, 像ddms之类的工具也能派上用场了。
3. 怎样在ubuntu 下安装android驱动
首先得确保手机的[设置/开发/调试]是勾选上的。
然后使用lsusb查找到devID,以16进制写入到本地电脑隐藏目录文件[/home/用户名/.android/adb_usb.ini]中
最后打开一个命令行执行./adb devices即可
4. 解决Ubuntu下adb无法识别android手机的问题
在Ubuntu下进行Android开发的时候会遇到手机无法识别的问题,手机插上后执行 adb root 会显示没有权限:
遇到这种情况需要在Ubuntu设置下。根据以下步骤进行设置后会解决这个问题,我所使用的开发环境是Ubuntu16.04。
1. 首先插上手机,终端执行 lsusb ,这样便可以查看当前连接电脑的设备
可以发现,插入的手机的VendorID是 18d1 , ProctID是 9025 。
如果不能知道哪个是插入的手机,可以拔掉手机后再执行一次 lsusb ,这样对比两次显示的结果就可以找到插入的手机。
2. 终端执行如下命令
53-android.rules文件可能不存在,那就创建。
注意,这个53-android.rules 文件名字应该是随意命名的,好像数字50,51,52,53等等都可以,我只验证过50和53。
3. 增加如下内容到53-android.rules
注意, SUBSYSTEM=="usb", SYSFS{idVendor}=="**18d1**", MODE="0666" 这句是给 ubuntu 7.01 以后的系统识别用的.
而 SUBSYSTEM=="usb_device", SYSFS{idVendor}=="**18d1**", MODE=="0666" 是给 Ubuntu 7.01之前的系统识别用的,相当于系统兼容。
4. 接着运行如下命令
注意, sudo /etc/init.d/udev restart 也可以为 sudo service udev restart //or restart udev
5. 在android sdk的tools目录下运行(这一步很重要,必须要sudo,否则没效果)
到这一步了,正常情况下应该会有设备显示出来。但结果发现 List of devices attached 下面没有设备出现,这就意味着 adb不识别新的USB 设备,纠结了。
6. 如果跟我一样悲惨,请执行如下操作
注意,如果没有 .android 和 adb_usb.ini ,可以自己新建。
另外如果有 adb_usb.ini ,它的内容一般如下:
7. 在 adb_usb.ini 中添加前面获得的VendorID内容
注意,要加十六进制符号 0x
8. 保存,关闭,执行如下命令
此时,List of devices attached 下面会有设备出现了。
至此,结束。
5. Ubuntu下adb的使用及常见问题处理
Ubuntu下adb的使用及常见问题处理
方案一:使用ubuntu系统自带的安装包
sudo apt-get install android-tools-adb
或者
sudo apt-get install adb
方案二:使用Android源码编译生成的adb文件
Android源码编译完成之后,会在编译过的项目目录下./out/host/linux-x86/bin/生成adb文件,需要将其拷贝到系统的/usr/bin目录下,并更改权限。
sudo cp /home/apuser/code/out/host/linux-x86/bin/adb /usr/bin
sudo chmod a+x /usr/bin/adb
说明:这个adb文件也可以在android-sdk-linux下的platform-tools目录下找到。
在终端运行 adb help或者adb查看adb是否安装成功。
adb help
或者
adb
正常情况下,可看到adb的版本信息,以及adb支持的相关指令和说明。
mkdir~/.android
echo 0x1782 > ~/.android/adb_usb.ini
可以查看/home/apuser/.android/adb_usb.ini是否生成成功,且内容为0x1782
这个0x1782是设备的VID号,可以使用lsusb指令查询自己设备的VID号是多少,如果是调试多个设备,可依次将设备的VID号添加到adb_usb.ini中
备注:展讯为0x1782,MTK为0x0e8d,高通为0x056c
到:/etc/udev/rules.d/51-android.rules命令:
cd /etc/udev/rules.d
sudo gedit/etc/udev/rules.d/51-android.rules
添加
SUBSYSTEM=="usb",SYSFS{idVendor}=="1782", MODE="0666",GROUP="plugdev"
其中 1782 为展讯设备号,也可以通过lsusb 来查看所有 usb 设备。
说明:
1、展讯的设备号是1782,MTK的设备号是0e8d,高通660的设备号是056c,
其他平台的可查找确认后,填写到这里。
2、如果没有/etc/udev/rules.d/51-android.rules 文件,需要自己创建一下。
3、修改/etc/udev/rules.d/51-android.rules不需要重启Linux机器,重新插拔一下设备就可以了。再次运行adb devices就可以看到你的设备已经连接。
在命令窗口执行adb shell; adb devices
可以shell登录手机,也可以出 log, logcate 具体命令还需要学习。
使用上文的步骤操作之后,大多数系统里adb都可以使用,但在有些版本的adb或者系统中仍会报如下问题:
apuser@ubuntu2:~/adbtools$ adb devices
List of devices attached
faf80ac1 no permissions (user in plugdev group; areyour udev rules wrong?); see [http://developer.android.com/tools/device.html]
可使用一下解决方案,进行解决
解决方案:
setp 1: lsusb 找到你手机的usb 地址
apuser@ ubuntu2:~/adbtools$ lsusb
Bus 002 Device 002: ID 1f75:0621 Innostor Technology Corporation
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 006: ID 0bda:58db Realtek Semiconctor Corp.
Bus 001 Device 005: ID 8087:0a2b Intel Corp.
Bus 001 Device 004: ID 138a:0097 Validity Sensors, Inc.
Bus 001 Device 003: ID18f8:0f99
Bus 001 Device 014: ID 19d2:ffb0 ZTE WCDMA Technologies MSM
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
他会列出来所有的usb 设备。如果试下找不到,那么拔掉设备看下,哪了没有了就是哪个。
setp2: 配置规则文件
apuser@ ubuntu2:~/adbtools$ sudo gedit /etc/udev/rules.d/51-android.rules
[sudo] password for apuser:
之后把这些文本 到编辑器里面:
ATTR{idProct}=="ffb0",SYMLINK+="android_adb", MODE="0660",GROUP="plugdev", TAG+="uaccess", SYMLINK+="android"
注意:ffb0 是查找到的手机设备的usb 的地址。
Bus 001 Device 014: ID 19d2:ffb0 ZTE WCDMATechnologies MSM
改成你的地址。
如果没有/etc/udev/rules.d/51-android.rules 文件,麻烦自己创建一下。
setp3: 之后执行命令:
apuser@ ubuntu2:~/adbtools$ sudo usermod -a -G plugdev $(id -u -n)
apuser@ ubuntu2:~/adbtools$ sudo udevadm control --reload-rules
apuser@ ubuntu2:~/adbtools$ sudo service udev restart
apuser@ ubuntu2:~/adbtools$ sudo udevadm trigger
setp4: 之后重启adb
apuser@ ubuntu2:~/adbtools$ adb kill-server
apuser@ ubuntu2:~/adbtools$ adb start-server
apuser@ ubuntu2:~/adbtools$ adb devices
List of devices attached
faf80ac1 unauthorized
apuser @ ubuntu2:~$adb devices
List of devices attached
???????????? no permissions
提示很明确,就是adb权限有问题,而且
???????????? no permissions
这样的提示,说明使用的adb版本较低,最好使用高版本的adb,安装Ubuntu系统自带的adb可能会出现这种现象。如果adb版本比较高,就会出现如下提示:
faf80ac1no permissions……
使用adb shell 也会提示权限error
apuser@ ubuntu2:~$adb shell
error:insufficient permissions for device
根本原因是: adb server 需要以 root 的权限启动
临时方法 如下:
apuser@ubuntu2:~$sudo -s
[sudo]password for apuser:
root@ ubuntu2:~#adb kill-server; adb start-server
* daemon not running. starting it now *
* daemon started successfully *
apuser@ ubuntu2:~# exit
apuser @ ubuntu2:~$
再次执行adb shell就可以了。
该权限问题,可使用sudo启动adb来解决,但不是根本解决之道,因为每次都要sudo来提高权限,太麻烦,而且如果使用的eclpse,或者idle来调试时还是要面对该该问题。
最好按本文第一部分的方法安装adb。如果按本文第一部分安装了adb,但还出现改问题,可使用which adb查看,当前使用的adb那个路径下的adb.以确保使用正确的adb
3、如果需要调试多个设备,以下的添加方法可能更为合适
这个方案对于不出现user in plugdev group; are your udev rules wrong?问题的系统来说是可行,的,如果出现user in plugdev group; are your udev rules wrong?问题,就不用考虑了。
清空51-android.rules,添加如下一行,一劳永逸(需要测试好几种设备,每次都添加一个会很麻烦)。
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666", GROUP="plugdev"
我并不是很清楚具体的含义,只是模仿10-vboxdrv.rules来写的,这个是virtualbox的udev规则文件,因为名字开头数字大文件中记录的规则会覆盖名字开头数字小的文件中的规则,所以你需要尽可能设置的文件名大一些,51已经够用了(我原来想写在10-vboxdrv.rules,让他们用一个文件,但是失败了)
adb kill-server
sudo udevadmcontrol --reload-rules
sudo service udevrestart
sudo udevadmtrigger
lsusb
可将这些指令写入一个sh脚本中,配置完规则,或者要检查USB设备时,直接执行该脚本,以提高效率。