分类目录归档:Android

Android

在Android-x86虚拟机中使用4G无线路由器的步骤(图形化操作)

一、环境描述

宿主机型号:Dell 3020MT
宿主机OS:CentOS 6.6 x86_64
宿主机IP:192.168.100.1
虚拟机OS:Android-x86 4.4-r2
虚拟机IP(Private Network):192.168.100.146
虚拟机IP(USB Passthrough):192.168.1.113
网络方式:Private Network + USB Passthrough
Android SDK版本:android-sdk_r24.2-linux
KVM版本:QEMU PC emulator version 0.12.1 (qemu-kvm-0.12.1.2-2.448.el6_6.3)
4G无线路由器:TP-LINK TL-TR961 5200L 4G无线路由器 全网全制式(移动/联通/电信)

二、设置KVM的Private Network虚拟网桥

1. 打开virt-manager

在CentOS的桌面菜单中点击:Applications → System Tools → Virtual Machine Manager

2. 打开KVM的网络设置窗口

在virt-manager的图形界面中,点击:Edit → Connection Details,如下图所示:

上述操作会打开“localhost Connection Details”窗口,如下图所示:

3. 添加虚拟网络

切换至上述窗口的“Virtual Networks”标签页,点击“Add Network”按钮,如下图所示:

点击“Add Network”按钮之后,弹出“Create a new virtual network”窗口,点击“Forward”按钮,如下图所示:

在接下来界面中,输入网络名称,例如hostonly,然后点击“Forward”按钮,如下图所示:

在接下来的界面中,输入网段IP和掩码长度,例如192.168.100.0/24,然后点击“Forward”按钮,如下图所示:

在接下来的界面中,勾选“Enable DHCP”,然后设置DHCP的起止地址,例如192.168.100.128和192.168.100.254,然后点击“Forward”按钮,如下图所示:

在接下来的界面中,选择“Isolated virtual network”,然后点击“Forward”按钮,如下图所示:

在最后的界面中,确认新建的虚拟网络信息,然后点击“Finish”按钮,如下图所示:

上述几个步骤操作完毕之后,便能在“localhost Connection Details”窗口中看到新建的虚拟网络,如下图所示:

通过这种方式新建的虚拟网络和VMware、Virtual Box中的Host-Only网络类似,宿主机具有一个192.168.100.1的IP地址,KVM在启动虚拟机时会通过DHCP服务为虚拟机分配192.168.100.0/24网段的IP地址,虚拟机通过这个IP地址只能与宿主机通信,不能够访问其他网络资源。

三、配置虚拟机的Private Network网卡

在virt-manager的窗口中,双击虚拟机,如下图所示:

上述操作会打开这个虚拟机的详情窗口,点击“Show virtual hardware details”按钮,如下图所示:

上述操作会打开虚拟机的虚拟硬件配置窗口,在其中选中虚拟机的虚拟网卡,然后在“Source Device”下拉框中选择之前创建的虚拟机网络,例如hostonly,如下图所示:

最后,点击“Apply”按钮,完成Private Network虚拟网卡的设置。

四、配置虚拟机的USB Passthrough网卡

将尚未开机的4G无线路由器插入宿主机,请务必确保此时这个4G无线路由器尚未开机,否则后面在虚拟机中为这块网卡DHCP时将找不到其中的DHCP Server,导致DHCP Discover尝试失败。

在shell中运行 lsusb 命令,找到4G无线路由器的USB设备信息,如下图所示:

其中,总线ID为002,设备ID为007,厂商ID为2357,产品ID为000b。总线ID和设备ID会随着插入宿主机不同的USB接口而改变,厂商ID和产品ID是烧写在4G无线路由器的固件中的,只要不修改固件,一般不会改变。

在shell中运行 ifconfig -a 命令,若找到一个名为usb0的网卡,则表明宿主机系统已经识别出4G无线路由器中的USB网卡,如下图所示:

在虚拟机的虚拟硬件配置窗口中,点击“Add Hardware”按钮,如下图所示:

上述操作会弹出“Add New Virtual Hardware”窗口,在其中选择“USB Host Device”,然后再根据上述lsusb命令所取得的信息,选择4G无线路由器的总线ID和设备ID(例如,002:007),然后点击“Finish”按钮,如下图所示:

五、在虚拟机中设置网络环境

在virt-manager的窗口中,点击“Show the graphical console”按钮,切换至虚拟机的显示控制台,然后点击“Power on the virtual machine”按钮,启动虚拟机,如下图所示:

虚拟机启动完毕之后,打开Android-x86自带的终端模拟器工具,如下图所示:

在虚拟机的终端中,运行su命令,切换至root账户,如下图所示:

在虚拟机的终端中,运行netcfg命令,可以看到虚拟机中的两块网卡,如下图所示:

其中,eth0就是上面配置的Private Network网卡,KVM为其分配的IP地址为192.168.100.146;eth1就是上面配置的USB Passthrough网卡,是将4G无线路由器中的USB网卡映射至虚拟机,由这个虚拟机独占使用的。Android-x86默认不会启动第二块网卡(eth1),所以看到的状态是Down。

在宿主机的shell中运行adb connect 192.168.100.146命令,通过adb连接至虚拟机,如下图所示:

在宿主机的shell中运行adb logcat DHCP:D *:S命令,这样便能在宿主机中查看虚拟机的日志,这个命令只会输出虚拟机的标签为DHCP,且优先级为Debug或以上的日志,除此之外都不输出,如下图所示:

打开4G无线路由器的电源,待4G无线路由器的小屏幕上出现运营商名称和上下行网络速度等信息时,表示设备启动完成。

在虚拟机的终端模拟器中,运行netcfg eth1 dhcp命令,4G无线路由器会为虚拟机的eth1网卡(实际上就是4G无线路由器内置的USB网卡)分配IP地址,如下图所示:

此时,应当能在宿主机上看到相应的DHCP日志信息,若输出结果和下图相似,则表明DHCP分配IP地址成功:

若日志中出现超时相关的信息,则表明在DHCP discover广播阶段没有找到4G无线路由器中的DHCP Server,很有可能是上面的操作失误或者步骤不正确。

在虚拟机的终端模拟器中,运行netcfg命令,此时能看到eth1网卡已经有IP地址了,如下图所示:

给eth1网卡分配的IP地址为192.168.1.113,但此时还是不能访问外网,因为默认的网络流量还是从eth0走。

在虚拟机的终端模拟器中,运行下图中的命令:

此时,虚拟机便能通过映射的USB网卡访问外网资源了,如下图所示:

六、总结

  1. 本文目的仅仅是验证系统框架是否可行,所以全部采用图形化的配置方式,本文中的所有操作都可以转化为命令行操作,以便于未来的自动化配置。

  2. 3G/4G无线路由器绝大多数都内置若干种USB设备,例如,USB Modem、USB网卡、USB无线路由器,USB读卡器等等,所以单一设备可能会有多种工作模式,今后若能在虚拟机中实现使用usb_modeswitch工具切换设备模式,使其工作在USB Modem模式下,再使用wvdial等PPP拨号工具进行拨号上网,那么虚拟机的上网环境就和真实手机更加相似了。

  3. 若能够找广州或深圳的嵌入式厂家定制我们自己的3G/4G无线路由器,那么还可以要求将设备设计成能够通过命令来控制设备的开关机,以及获得设备各项状态信息等等,这样能够更进一步地提高底层系统的自动化配置和管理。

在Ubuntu上安装Android-SDK的方法

一、安装和配置Ubuntu系统

1. 安装Ubuntu Desktop 14.04 x86_64

2. 启用root账户

Ubuntu 14.04默认是不允许root账户登录的,在登录窗口只能看到普通用户和访客登录。在shell中运行以下命令即可启用root账户登录:

Step-1. 切换至root账户权限模式,需要输入当前普通用户的登录密码

  1. sudo -s

Step-2. 启用root账户登录

  1. vi /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf

在上述文件中添加如下配置:

  1. greeter-show-manual-login=true

Step-3. 设置root账户的登录密码,根据提示输入密码,我此处将密码指定为password

  1. passwd root

step-4. 设置stdin

  1. vi /root/.profile

在上述文件中找到:

  1. mesg n

将其修改为:

  1. tty -s && mesg n

Step-5. 重启系统,然后以root账户登录

  1. reboot

3. 关闭系统防火墙

  1. ufw disable

4. 为root账户启用ssh登录

Step-1. 安装ssh服务端

  1. apt-get update
  2. apt-get install openssh-server

Step-2. 配置ssh服务

  1. vi /etc/ssh/sshd_config

在上述文件中找到:

  1. PermitRootLogin without-password

将其修改为:

  1. # PermitRootLogin without-password

然后,在上述文件添加如下配置:

  1. PermitRootLogin yes

Step-3 重启系统,然后以root账户登录
reboot

5. 配置静态IP地址

  1. vi /etc/network/interfaces

将这个文件的内容修改为:

  1. auto lo
  2. iface lo inet loopback
  3. # The primary network interface
  4. auto eth0
  5. iface eth0 inet static
  6. address 192.168.1.119
  7. netmask 255.255.255.0
  8. gateway 192.168.1.1

6. 配置DNS

  1. vi /etc/resolvconf/resolv.conf.d/base

将这个文件的内容修改为:

  1. nameserver 114.114.114.114
  2. nameserver 221.6.4.66
  3. nameserver 221.6.4.67

7. 重启系统

  1. reboot

二、安装VNC

1. 安装gnome相关组件

  1. apt-get install gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal

2. 安装VNC服务端

  1. apt-get install vnc4server

3. 设置VNC密码

  1. vncserver

运行上述命令之后,系统会提示输入VNC登录密码,此处我指定的密码为password

4. 修改vncserver脚本

  1. cp /usr/bin/vncserver /usr/bin/vncserver.bak
  2. vi /usr/bin/vncserver

在上述文件中找到:

  1. "# exec /etc/X11/xinit/xinitrcnn".

在这一行下面添加以下配置:

  1. "gnome-panel &n".
  2. "gnome-settings-daemon &n".
  3. "metacity &n".
  4. "nautilus &n".
  5. "gnome-terminal &n".

5. 修改配置文件

  1. cp /root/.vnc/xstartup /root/.vnc/xstartup.bak
  2. vi /root/.vnc/xstartup

将上述文件的内容修改为:

  1. #!/bin/sh
  2. export XKL_XMODMAP_DISABLE=1
  3. unset SESSION_MANAGER
  4. unset DBUS_SESSION_BUS_ADDRESS
  5. [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
  6. [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
  7. xsetroot -solid grey
  8. vncconfig -iconic &
  9. gnome-panel &
  10. gnome-settings-daemon &
  11. metacity &
  12. nautilus &
  13. gnome-terminal &

6. 建立vncserver服务

  1. vi /etc/init.d/vncserver

上述文件的内容为:

  1. #!/bin/bash
  2. ### BEGIN INIT INFO
  3. # Provides: VNCSERVER
  4. # Required-Start: $remote_fs $syslog
  5. # Required-Stop: $remote_fs $syslog
  6. # Default-Start: 2 3 4 5
  7. # Default-Stop: 0 1 6
  8. # Short-Description: Start daemon at boot time
  9. # Description: Enable service provided by daemon.
  10. ### END INIT INFO
  11. unset VNCSERVERARGS
  12. VNCSERVERS=""
  13. [ -f /etc/vncservers.conf ] && . /etc/vncservers.conf
  14. prog=$"VNC server"
  15. start() {
  16.     . /lib/lsb/init-functions
  17.     REQ_USER=$2
  18.     echo -n $"Starting $prog: "
  19.     ulimit --0 >/dev/null 2>&1
  20.     RETVAL=0
  21.     for display in $VNCSERVERS
  22.     do
  23.         export USER="${display##*:}"
  24.         if test -"$REQ_USER" -"$REQ_USER" == $USER ; then
  25.             echo -"$display "
  26.             unset BASH_ENV ENV
  27.             DISP="${display%%:*}"
  28.             export VNCUSERARGS="${VNCSERVERARGS[$DISP]}"
  29.             su $USER -"cd ~$USER && [ -f .vnc/passwd ] && vncserver :$DISP $VNCUSERARGS"
  30.         fi
  31.     done
  32. }
  33. stop() {
  34.     . /lib/lsb/init-functions
  35.     REQ_USER=$2
  36.     echo -n $"Shutting down VNCServer: "
  37.     for display in $VNCSERVERS
  38.     do
  39.         export USER="${display##*:}"
  40.         if test -"$REQ_USER" -"$REQ_USER" == $USER ; then
  41.             echo -"$display "
  42.             unset BASH_ENV ENV
  43.             export USER="${display##*:}"
  44.             su $USER -"vncserver -kill :${display%%:*}" >/dev/null 2>&1
  45.         fi
  46.     done
  47.     echo -"n"
  48.     echo "VNCServer Stopped"
  49. }
  50. case "$1" in
  51. start)
  52. start $@
  53. ;;
  54. stop)
  55. stop $@
  56. ;;
  57. restart|reload)
  58. stop $@
  59. sleep 3
  60. start $@
  61. ;;
  62. condrestart)
  63. if [ -f /var/lock/subsys/vncserver ]; then
  64. stop $@
  65. sleep 3
  66. start $@
  67. fi
  68. ;;
  69. status)
  70. status Xvnc
  71. ;;
  72. *)
  73. echo $"Usage: $0 {start|stop|restart|condrestart|status}"
  74. exit 1
  75. esac

7. 修改服务脚本的访问权限

  1. chmod +x /etc/init.d/vncserver

8. 创建vncservers.conf配置文件

  1. vi /etc/vncservers.conf

上述文件的内容为:

  1. VNCSERVERS="1:root"
  2. VNCSERVERARGS[1]="-geometry 1024x768"

9. 将vncserver服务设置为开机启动

  1. update-rc.d vncserver defaults

三、安装虚拟化环境

1. 检查服务器是否支持硬件虚拟化

  1. egrep -c '(vmx|svm)' /proc/cpuinfo

若返回的结果为0,则表明服务器不支持硬件虚拟化;若返回的结果为大于等于1,则表明服务器支持硬件虚拟化。即使服务器支持硬件虚拟化,也需要进入BIOS中查看是否开启这项功能。

若服务器不支持硬件虚拟化,或者没有开启硬件虚拟化,那么运行虚拟机的速度会非常慢。

2. 检查宿主机系统内核

  1. egrep -c 'lm' /proc/cpuinfo

若返回结果为0,则表明宿主机系统内核不是64位的,虚拟机内存最多只能使用2 GB,只能运行32位的客户机系统。

若返回结果为大于等于1,则表明宿主机系统内核是64位的,虚拟机内存可以大于2 GB,并且可以运行64位的客户机系统。

3. 安装KVM相关组件

  1. apt-get install qemu-system qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils virt-manager

其中:

  • libvirt-bin 可以提供libvirtd服务,用于管理qemu和kvm的虚拟机实例;
  • qemu-kvm 是后端程序;
  • ubuntu-vm-builder 是用于构建虚拟机的强大的命令行工具;
  • bridge-utils 可用于向虚拟机提供网络桥接;
  • virt-manager 是KVM的图形用户界面。

4. 添加用户

  1. adduser `id -un` libvirtd

若上述命令的输出如下所示,则表明用户添加成功:

5. 重启系统

  1. reboot

重启之后,以root账户登录。

必须重新启动或重新登录系统,否则root用户就不能成为libvirtd用户组的有效成员,只有这个用户组的成员才能够运行虚拟机。

6. 验证安装

  1. virsh -c qemu:///system list

若上述命令的输出如下所示,则表明安装成功:

使用root账户登录系统时,选择使用GNOME图形界面,这时便可以通过 ApplicationsSystem ToolsVirtual Machine Manager来访问KVM的图形界面。

四、安装JDK

1. 下载JDK 8u45

下载页面:

  1. http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

下载目录:

  1. /root/Downloads

2. 解压缩安装包

  1. cd /root/Downloads
  2. tar xvzf jdk-8u45-linux-x64.tar.gz
  3. mv jdk1.8.0_45 /usr/local/Java

3. 设置环境变量

  1. vi /etc/bash.bashrc

在上述文件末尾添加以下内容:

  1. JAVA_HOME=/usr/local/Java
  2. PATH=${JAVA_HOME}/bin:$PATH
  3. CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
  4. export JAVA_HOME
  5. export PATH
  6. export CLASSPATH

4. 重新启动

  1. reboot

五、安装Android SDK

1. 下载Android-SDK

  1. cd /root/Downloads
  2. wget https://dl.google.com/android/android-sdk_r24.2-linux.tgz

2. 解压缩安装包

  1. dpkg --add-architecture i386
  2. apt-get install lib32bz2-1.0 lib32stdc++6 lib32z1
  3. tar xvzf android-sdk_r24.2-linux.tgz
  4. mv android-sdk-linux /usr/local/Android-SDK

3. 配置环境变量

  1. vi /etc/bash.bashrc

在上述文件中找到PATH环境变量,将其修改为:

  1. PATH=${JAVA_HOME}/bin:/usr/local/Android-SDK/tools:/usr/local/Android-SDK/platform-tools:$PATH

4. 重新启动

  1. reboot

5. 配置Android-SDK

  1. android avd

运行上述命令之后,便会打开AVD Manager,如下图所示:

点击菜单ToolsManage SDK,打开Android SDK Manager,如下图所示:

在Tools目录中选择 Android SDK Platform-toolsAndroid SDK Build-tools,选择Android 5.1.1 (API 22)目录,选择Android 4.4.2 (API 19)目录,选择Extras目录,最后点击 Install 32 packages... 按钮,打开 Choose Packages to Install 窗口,如下图所示:

在上述窗口中选择 Accept License,然后点击 Install 按钮,开始下载上面选择的组件,此时会弹出 Android SDK Manager Log 窗口,如下图所示:

注意:需要保证服务器和谷歌的网站通信正常,否则将无法下载必须的组件。若不能翻墙,则可以使用以下镜像网站:
http://www.androiddevtools.cn/

在CentOS上安装Android-SDK的方法

一、环境描述

宿主机OS:CentOS 6.6 x86_64
JDK版本:java version “1.8.0_45”
Android-SDK版本:android-sdk_r24.2
KVM版本:QEMU PC emulator version 0.12.1
防火墙:关闭iptables服务,并将SELinux设置为permissive

二、安装VNC Server

1. 安装VNC Server

  1. yum install -y tigervnc-server

2. 修改配置文件

  1. vi /etc/sysconfig/vncservers

在上述文件中作出以下修改:
① 将# VNCSERVERS="2:myusername"修改为VNCSERVERS="1:root"
② 将# VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -localhost"修改为VNCSERVERARGS[1]="-geometry 1024x768 -nolisten tcp"

上述配置会为远程用户root提供一个分辨率为800x600的远程桌面,连接端口号为5901

3. 设置密码

  1. vncserver

运行上述命令之后会提示输入密码,此处设置密码为password。

4. 重启服务

  1. chkconfig vncserver on
  2. service vncserver restart

三、安装JDK

1. 卸载系统自带的OpenJDK

  1. rpm -qa | grep java
  2. rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-11.1.13.4.el6.x86_64
  3. rpm -e --nodeps java-1.7.0-openjdk-1.7.0.65-2.5.1.2.el6_5.x86_64
  4. rpm -e --nodeps tzdata-java-2014g-1.el6.noarch

2. 下载JDK 8u45

下载页面:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

下载目录:
/root/Downloads

3. 解压缩安装包

  1. cd /root/Downloads
  2. tar xvzf jdk-8u45-linux-x64.tar.gz
  3. mv jdk1.8.0_45 /usr/local/Java

4. 设置环境变量

  1. vi /etc/profile

在上述文件末尾添加以下内容:

  1. JAVA_HOME=/usr/local/Java
  2. PATH=$JAVA_HOME/bin:$PATH
  3. CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  4. export JAVA_HOME
  5. export PATH
  6. export CLASSPATH

5. 重新启动

  1. reboot

四、安装虚拟化组件

1. 安装虚拟化组件

  1. yum groupinstall -y "Virtualization" "Virtualization Client" "Virtualization Tools" "Virtualization Platform"

2. 配置Host-Only网桥

  1. vi /etc/sysconfig/network-scripts/ifcfg-br1

在这个文件中输入以下内容后保存:

  1. DEVICE="br1"
  2. # BOOTPROTO is your preference. It can be “dhcp” or “static”.
  3. # If “static”, be sure to specify the IP address, netmask and gateway.
  4. BOOTPROTO="static"
  5. IPADDR=192.168.92.1
  6. PREFIX=24
  7. IPV6INIT="no"
  8. IPV6_AUTOCONF="no"
  9. NM_CONTROLLED="no"
  10. ONBOOT="yes"
  11. TYPE="Bridge"
  12. DELAY="0"

3. 配置普通网桥

  1. vi /etc/sysconfig/network-scripts/ifcfg-br0

在这个文件中输入以下内容后保存:

  1. DEVICE="br0"
  2. # BOOTPROTO is your preference. It can be “dhcp” or “static”.
  3. # If “static”, be sure to specify the IP address, netmask and gateway.
  4. TYPE="Bridge"
  5. BOOTPROTO="static"
  6. BROADCAST=192.168.1.255
  7. IPADDR=192.168.1.119
  8. NETMASK=255.255.255.0
  9. GATEWAY=192.168.1.1
  10. ONBOOT="yes"
  11. DNS1=114.114.114.114
  12. DNS2=221.6.4.66
  13. DNS3=221.6.4.67
  1. vi /etc/sysconfig/network-scripts/ifcfg-p1p1

将这个文件的内容替换为:

  1. DEVICE=p1p1
  2. HWADDR=C8:1F:66:44:9A:F3
  3. ONBOOT=yes
  4. BRIDGE=br0

其中,HWADDR填写的是服务器的网卡MAC地址,请根据自身情况填写。

4. 关闭NetworkManager服务

  1. chkconfig NetworkManager off
  2. service NetworkManager stop
  3. service network restart

5. 设置开机启动服务

  1. chkconfig libvirtd on
  2. service libvirtd start

五、安装Android-SDK

1. 下载Android-SDK

  1. cd /root/Downloads
  2. wget https://dl.google.com/android/android-sdk_r24.2-linux.tgz

2. 解压缩安装包

  1. yum install -y glibc.i686 libstdc++.i686
  2. tar xvzf android-sdk_r24.2-linux.tgz
  3. mv android-sdk-linux /usr/local/Android-SDK

3. 配置环境变量

  1. vi /etc/profile

在上述文件中找到PATH环境变量,将其修改为:

  1. PATH=$JAVA_HOME/bin:/usr/local/Android-SDK/tools:/usr/local/Android-SDK/platform-tools:$PATH

4. 重新启动

  1. reboot

5. 配置Android-SDK

  1. android avd

运行上述命令之后,便会打开AVD Manager,如下图所示:

点击菜单Tools → Manage SDK,打开Android SDK Manager,如下图所示:

Tools目录中选择Android SDK Platform-toolsAndroid SDK Build-tools,选择Android 5.1.1 (API 22)目录,选择Android 4.4.2 (API 19)目录,选择Extras目录,最后点击 Install 32 packages... 按钮,打开Choose Packages to Install窗口,如下图所示:

在上述窗口中选择Accept License,然后点击Install按钮,开始下载上面选择的组件,此时会弹出 Android SDK Manager Log 窗口,如下图所示:

注意:需要保证服务器和谷歌的网站通信正常,否则将无法下载必须的组件。若不能翻墙,则可以使用以下镜像网站:
http://www.androiddevtools.cn/

解决Android-x86中微信闪退的问题

主要是由Android-x86的ARM Translator不可用导致的。当Android-x86安装时,若不能通过网络访问谷歌网站,那么就不会启用ARM Translator,这是一个ARM指令翻译器,用于将APP底层的ARM指令转换为宿主机CPU的指令,如果宿主机是32位的,则需要安装32位的ARM Translator,若宿主机是64位的,则需要安装64位的。解决步骤如下:

  1. 宿主机翻墙,确保宿主机能够访问谷歌网站

  2. 虚拟机采用NAT连接方式,确保虚拟机能够访问谷歌网站

  3. 在虚拟机的终端中运行enable_houdini命令,这个命令会从谷歌下载相应架构的ARM Translator

  4. 此时便能正常打开微信,系统日志中就不会出现以下错误日志了:

使用adb命令停止APP后台进程的方法

0. 环境描述

① 宿主机系统:Ubuntu 14.04 Desktop
② 客户机系统:Android-x86 4.4 R2
③ SDK版本:android-sdk_r24.2-linux
④ 虚拟化方案:KVM QEMU
⑤ 联网方式:NAT
⑥ 宿主机IP:192.168.1.109
⑦ 客户机IP:192.168.122.131
⑧ 示例APP:搜狐视频

1. 启动客户机

① 通过VNC连接至宿主机;
② 在宿主机中找到并运行:Applications → System Tools → Virtual Machine Manager
③ 在KVM的图形界面中运行先前创建好的Android-x86虚拟机。

2. ADB连接至客户机

在宿主机的shell中运行以下命令:

  1. adb connect 192.168.122.131:5555

若上述命令的输出如下所示,则表示连接成功:

3. 检查搜狐视频是否在运行

在宿主机的shell中运行以下命令:

  1. adb shell ps | grep sohu

若上述命令的输出如下所示,则表明当前没有运行搜狐视频:

4. 运行搜狐视频APP

① 查找运行入口

使用APKTool工具反编译搜狐视频的APK安装文件(SohuVideo_Android_Phone.apk),得到如下文件列表:

其中的AndroidManifest.xml文件包含APP的启动信息,几乎每个APP的APK文件反编译之后都具有这个文件。

使用Notepad++打开AndroidManifest.xml文件,查找关键字“android.intent.category.LAUNCHER”或“android.intent.action.MAIN”,此时可以找到APP的入口动作:

其中的“.FirstNavigationActivityGroup”便是便是搜狐视频的入口动作,下面通过adb启动APP时需要用到。

② 在宿主机的shell中运行以下命令:

  1. adb shell am start -a android.intent.action.MAIN -n com.sohu.sohuvideo/.FirstNavigationActivityGroup

若上述命令的输出如下所示,则表明运行搜狐视频成功:

此时观察客户机,可以发现搜狐视频已经成功运行:

5. 关闭搜狐视频APP

① 找到搜狐视频的系统进程

在宿主机的shell中运行以下命令:

  1. adb shell ps | grep sohu

若上述命令的输出如下所示,则表示找到搜狐视频的进程:

搜狐视频的进程名为“com.sohu.sohuvideo”。

② 此处有两种方法关闭搜狐视频的进程,如下所示:

  • Method-A:

在宿主机的shell中运行以下命令:

  1. adb shell am force-stop com.sohu.sohuvideo

若上述命令的输出如下所示,则表示成功杀死进程:

注意:
这种方法会强制停止APP进程,不会清除APP进程在系统中产生的数据。

  • Method-B:

在宿主机的shell中运行以下命令:

  1. adb shell pm clear com.sohu.sohuvideo

若上述命令的输出如下所示,则表示成功杀死进程:

注意:
这种方法不仅会停止APP进程,而且会清除这个APP进程产生的所有数据。

③ 检查搜狐视频是否正在运行

在宿主机的shell中运行以下命令:

  1. adb shell ps | grep sohu

若上述命令的输入如下所示,则表示已经成功停止搜狐视频的后台进程:

Android的logcat日志工具使用详解

logcat是Android中一个命令行工具,可以用于得到程序的log信息。Android日志系统提供了记录和查看系统调试信息的功能。日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命令来查看和使用。

一、环境描述

宿主机OS:CentOS 6.6 x86_64
宿主机IP:192.168.1.119
虚拟机OS:Android-x86 4.4-r2
虚拟机IP:192.168.1.126
网络方式:Bridge
Android SDK版本:android-sdk_r24.2-linux
KVM版本:QEMU PC emulator version 0.12.1 (qemu-kvm-0.12.1.2-2.448.el6_6.3)

二、logcat命令的基本用法

1. logcat命令使用格式

  1. [adb] logcat [<option>] ... [<filter-spec>] ...

2. 两种使用方式

在宿主机上使用:

  1. $ adb logcat

在虚拟机或手机上使用:

  1. # logcat

三、过滤日志输出

每一条输出的Android日志信息都有一个标签和优先级。

1. 日志标签

日志的标签是系统部件原始信息的一个简要的标志。(比如:“View”就 是查看系统的标签)。

2. 日志优先级

日志优先级有下列几种,按照从低到高顺序排列:

  • V — Verbose(最详细的日志,最低优先级)
  • D — Debug(调试)
  • I — Info(信息)
  • W — Warning(警告)
  • E — Error(错误)
  • F — Fatal(致命错误)
  • S — Silent(静默,最高优先级,不会输出任何信息)

3. 日志过滤器

在运行logcat的时候在前两列的信息中你就可以看到 logcat 的标签列表和优先级别,它是这样标出的:<priority>/<tag>

下面是一个logcat输出的例子,它的优先级是I,标签是ActivityManage

  1. I/ActivityManager (585): Starting activity: Intent { action=android.intent.action...}

为了让日志输出能够体现管理的级别,你还可以用过滤器来控制日志输出,过滤器可以帮助你描述系统的标签等级。

过滤器语句按照下面的格式描述:

  1. tag:priority ...

其中,tag表示标签,priority表示相应标签日志的最低优先级。

从上面的tag的中可以得到日志的标签和优先级。你可以在过滤器中多次描述tag:priority

4. 使用实例

请查看以下使用实例:

  1. adb logcat ActivityManager:I MyApp:D *:S

上述实例表示支持所有的日志信息,除了标签为“ActivityManager”和优先级为“Info”以上的日志,以及标签为“MyApp”和优先级为“Debug”以上的日志。上述实例中的最后的元素*:S,意味着将所有其他标签的优先级设置为“Silent”,所有日志只显示有“ActivityManager”“MyApp”标签的。*:S的另一个用处是能够确保日志输出的时候是按照过滤器的说明限制的,也让过滤器作为一项输出到日志中。

下面的过滤语句只显示优先级为“Warning”或更高优先级的日志信息:

  1. adb logcat *:W

如果你在宿主机上运行logcat,相比起在远程adb shell端,你还可以为环境变量ANDROID_LOG_TAGS指定一个参数来设置默认的过滤器:

  1. export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"

注意,如果通过远程shell运行logcat命令,或者运行adb shell logcat命令,那么将不能使用ANDROID_LOG_TAGS中设置的过滤器。

四、指定日志输出格式

日志信息包括很多元数据域,例如标签和优先级。可以修改日志的输出格式,指定显示特定的元数据域。可以通过-v 选项得到格式化输出日志的相关信息:

  • brief — 显示源进程的优先级/标签和PID(默认格式)。
  • process — 只显示PID。
  • tag — 只显示优先级/标签。
  • thread — 只显示进程 : 线程和优先级/标签。
  • raw — 显示原始的日志消息,没有其他的元数据域。
  • time — 显示源进程的日期、调用时间、优先级/标签和PID。
  • long — 显示所有的元数据域和单独的消息,带有一个空行。

启动logcat时,你可以通过-v选项来指定日志输出格式:

  1. [adb] logcat [-v <format>]

以下实例使用thread来指定日志输出格式:

  1. adb logcat -v thread

注意,你只能使用-v选项来指定日志输出格式的选项。

五、查看可用的日志缓冲区

我们在使用logcat抓取日志的时候,可以指定buffer,来请求不同的环形缓冲区 (‘main’, ‘system’, ‘radio’, ‘events’,默认为”-b main -b system“),因为Android日志系统为日志消息保持了多个循环缓冲区,而且不是所有的消息都被发送到默认缓冲区,要想查看这些附加的缓冲区,可以使用-b选项,以下是可以指定的缓冲区:

  • radio — 查看包含在无线/电话相关的缓冲区消息。
  • events — 查看事件相关的日志消息。
  • main — 查看主缓冲区(默认缓冲区)。
  • system — 查看系统相关的日志消息。

-b选项的使用方法如下所示:

  1. [adb] logcat [-b <buffer>]

以下实例表示如何查看包含无线和电话的日志消息:

  1. adb logcat -b radio

六、查看标准输出和标准错误

在默认状态下,Android系统会将标准输出和标准错误(System.outSystem.err)输出到/dev/null,在运行Dalvik VM的进程中,有一个系统可以备份日志文件。在这种情况下,系统会用标准输出和标准错误,以及优先级 I 来记录日志消息。

通过以下方法可以指定日志输出的路径,停止运行的模拟器/设备,然后使用setprop命令远程输入日志:

  1. $ adb shell stop
  2. $ adb shell setprop log.redirect-stdio true
  3. $ adb shell start

七、logcat命令选项

选项 描述
-b <buffer> 请求可选择的环形缓冲区,main、system、radio或events。可以使用多个-b参数,输出的结果是交错的。默认值为-b main -b system。
-c 清除全部日志,然后退出。
-d 转储日志,然后退出(不会阻塞)。
-f <filename> 将日志输出至文件。默认为标准输出(stdout)。
-g 获取日志环形缓冲区的大小,然后退出。
-n <count> 通过指定轮转日志的最大数量,默认为4。
-r <kbytes> 每千字节就轮转一次日志。若没有指定,则默认值为16。需要使用-f选项。
-s “将默认的过滤器设置为静默。
就像是指定过滤器描述符“*:S”。
-v <format> “设置日志的输出格式,其中<format>是下面其中之一:
brief、process、tag、thread、raw、time、threadtime、long”
-t <count> 只输出最近几行的日志,行数由<count>指定(隐含-d选项)。
-B 以二进制方式输出日志。

八、在kvm环境中使用logcat

1. 启动Android-x86虚拟机

在virt-manager的图形界面中启动Android-x86虚拟机,如下图所示:

在shell中运行ps aux | grep kvm命令,可以看到这个虚拟机的进程详情,如下图所示:

2. 从宿主机连接至虚拟机

在shell中运行以下命令:

  1. adb connect 192.168.1.126

若命令返回如下图所示,则表示连接成功:

3. 运行logcat命令

在shell中运行以下命令:

  1. adb logcat

若命令返回和下图中类似,则表明已经看到Android虚拟机中的日志消息:

【翻译】usb_modeswitch使用详解

原文链接:http://www.draisberghof.de/usb_modeswitch/

一、介绍

USB_ModeSwitch是一种模式切换工具,用于控制具有“多种模式”的USB设备。

越来越多的USB设备(特别是高速WAN上网卡,它基于一些手机芯片,能够改变它们的USB连接模式)都会板载它们自己的MS Windows驱动程序,当首次插入电脑时,它们会被识别为一个闪存设备,然后开始安装存储于其中的驱动程序。在安装完驱动程序之后(后面还需要再插拔一次),驱动程序就会再内部切换USB设备的连接模式,存储设备会消失(大多数情况下),然后会出现一个新的设备(例如,一个USB调制解调器)。调制解调器制造商会“可选地”调用“ZeroCD (TM)”特性,因为它会消除对用于承载一个独立驱动程序载体的需求。

起初,这方面的东西没有任何形式的文档记录,而且也几乎没有任何Linux支持可用。

从好的方面来看,大多数已知的设备在两种模式下都可以工作,使用诸如“usb-storage”或“option”(一种经过优化的串行驱动程序,高速3G调制解调器的Linux标准)的Linux驱动程序。

那么唯一的问题便是如何从存储设备切换至调制解调器设备,或者其他应该做的事情。

幸运的是,我们还有人类的理性、USB嗅探程序和“libusb”。MS Windows的驱动程序存在通信被窃听的可能性,但是,在Linux或BSD变种系统的规则之下,可以隔离触发模式切换的命令或动作,并且可以复制相同的东西。

在“libusb”的有力帮助之下,USB_ModeSwitch可以从一个配置文件中获取重要的参数,然后完成全部的初始化和通信工作,这样便使得用户可以轻松地处理这个过程。

它主要是自动使用的 — 通过udev事件和规则 — 不需要任何用户操作便能完成模式切换。但是它还可以作为一个命令行工具来运行,通常会在尝试使用某种未知设备时使用这种方式。

这个工具是大多数主流发型版的部件之一,你应当不用从源码包进行编译安装,除非运行时遇到问题,或者想要使用最新的版本。

你在提交任何问题之前,请首先仔细阅读本页面上的所有信息! 如果你使用一个新的设备,那么它会帮助你理解这个工具内部的工作原理,它也会反过来更加轻松地找到相关的切换命令,并且可以添加一条新的配置条目。

如果想要了解关于如何实现自己的USB嗅探,请查看下面的“ 贡献” 章节。

二、下载

重要: 想要完成一次高效的安装,你需要同时拥有程序和数据包!

对配置文件的修改和更新的频率可能会比发布新程序版本的频率高得多,这些配置文件包含已知USB设备的大多数信息。这也是为什么会单独提供这些配置文件。

请下载 usb-modeswitch-2.2.1.tar.bz2,源代码的发布日期为2015-01-15,Debian的软件仓库中很快也会有相应的Debian软件包。它支持很多种架构(诸如amd64或ia64)。

请下载 usb-modeswitch-data 数据包(2015-01-15)。它包含设备数据库和规则文件,包括完整的路径。你需要2.2.0版本以上的程序,因为引入了新的参数。

可选的 device_reference.txt文件(2013-11-13),它是较早设备的配置集合,分别由相应的贡献者添加;如果你想要使用某个新设备,那么你也可以将这个文件作为首选资源。

如果你的系统上没有安装 libusb-1.x,请不要忘记安装这个软件包。在大多数发行版本中,很可能有一个名为“libusb1-dev”或“libusb1-devel”的软件包(或类似的)。

较老的版本基于 libusb-0.1.12,但是自从2.0.0版本以来,只会支持libusb1.x。

有一点复杂的是,libusb1有一段时间还有一个兼容分支,叫做“libusbx”。更多信息可阅读:
http://www.draisberghof.de/usb_modeswitch/bb/viewtopic.php?p=12912#p12912

如果你有一个带有USB主机端口的Android平板,并且Android版本至少为2.2,你可以尝试使用“ PPP Widget”,可以从Google Play下载使用。它包括USB_ModeSwitch和PPPD,使得你能够相对轻松地通过3G上网卡或手机连上网络,即使是在仅支持WiFi的设备上。

如果你是一个系统集成者(包维护者),你可以使用这个XML文件来检查新的版本:usb-modeswitch-versions.xml

USB_ModeSwitch的Debian软件包的维护者已经建立起一个PPA,提供大多数最近发布的版本,请查看论坛中的这个帖子:
http://www.draisberghof.de/usb_modeswitch/bb/viewtopic.php?p=12609#p12609

三、如何安装

如果你已经安装了一个较早的版本,推荐卸载掉已安装的版本(运行 make uninstall 命令)。1.1.0版本中修改了若干文件的位置,如果不管旧版本的话,那么旧版本的文件就可能会被孤立。如果你以前安装的是1.1.0或更新的版本,那么你仅仅需要更新和覆盖所有已有的文件。

解压缩程序的源码文件(谁会想到!)。在新创建的目录中,以root或超级用户的身份运行以下命令:

  1. # make install

这样会安装一个用于udev的小型shell脚本、较大的包装器脚本、一个配置文件、man(使用说明)页面,以及全新编译的二进制文件。重要:如果你以这种方式安装,那么你将需要“tcl”软件包,用于处理大型的分配器脚本。还有很多种不依赖于“tcl”软件包的安装方式。请参考包含在源码包中的README文件,以便于了解更多的安装选项吧!

现在,请对数据包进行相同的操作。它将会在“/usr/share/usb_modeswitch”目录中安装配置文件,在“/lib/udev/rules.d”目录中安装udev规则文件。较早的“/etc/usb_modeswitch.d”目录被用于保存自定义配置文件(新的或修改的)。

你已经设置成功了,如果你的设备是已知的,那么你应当能够将其插入并使用。如果它不能立即使用,那么我们将会找出原因。

想要手动使用,只需要安装程序即可。在命令行界面中使用或者使用一个自定义的配置文件。如果你想要创建自己的配置,那么“device_reference”文件(请参考“下载”章节)会是一个很好的切入点。这个文件中有很多注释,会告诉你如何进行操作。

你的自定义配置文件可以用任何文件名,也可以放在任何地方;只需要用 -c 参数告诉 usb_modeswitch 如何找到这个配置文件即可。

手动使用的主要目的是测试和分析。请参考下一章。

四、如何使用

在大多数情况下,你可以不用进行任何操作(除了将设备插入)就能够使用你的设备。

如果你认为你的设备是受支持的,但是设备并没有按照预期正常工作,那么你可以首先打开日志,正如在“故障排查”章节中所述的。

若想要测试、调试你的新设备,你可以在手动模式下使用USB_ModeSwitch的二进制部分。

有两种方法:使用一个配置文件或使用命令行。

运行“usb-modeswitch -h”命令,便可列出命令行参数。如果使用了除 -W-D-I-q 之外的命令行参数,那么通过 -c 命令行参数指定的配置文件就会被忽略,你必须在命令行上提供所有的必须参数。你还可以参考内藏的使用手册页面。

想要使用某个配置文件,你可以使用“/usr/share/usb_modeswitch”目录中的小文件,或者自己创建一个文件。然后使用 -c 选项,为 usb_modeswitch 命令指定这个文件的文件名和路径。你还可以在 device_reference.txt 文档中找到一些关于型号系列的提示,以及命令行参数的解释。

重要:
USB_ModeSwitch — 就像使用 libusb 的所有程序那样 — 当手动调用这个命令时,必须以 root 身份运行(或者使用“sudo”命令)。否则,会出现奇怪的错误消息,并且设备和程序不会正常工作。当试验切换命令和策略时,可能在具有root权限的shell中进行操作会更加便利(“sudo bash”或“su -”)。

自动化方法由若干种协同工作的组件构成,以用途的逻辑顺序列出:

/lib/udev/rules.d/40-usb_modeswitch.rules — 如果识别出一个已知的设备ID(制造商/产品),那么udev规则便会启动包装器。若想要为一个新的调制解调器添加一个触发器(具有有效的配置文件),你可以新加一行,内容为它的USB ID,就像在已有条目中看到的那样。如果被切换的设备提供标准的串行端口,那么一个二级规则会再次调用包装器,然后添加一条指向正确连接端口的符号链接(见下文)。

/lib/udev/usb_modeswitch — 一个shell脚本,分叉至真实的包装器脚本。从1.1.6版本以来,脚本是和在Ubuntu中使用的“dash”shell完全兼容的,除此之外还兼容于较老的“bash”变种。为了将usb_modeswitch和udev进程分开运行,最近的版本会利用upstart或systemd特性。

/usr/sbin/usb_modeswitch_dispatcher — 这样会进行额外的设备检查,然后使用二进制文件,根据选中的设备配置文件来切换设备状态。
如果在模式切换之后,没有任何驱动程序来处理这个设备,那么分配器将会试图加载和绑定“可选的”串行驱动程序,以便于使得设备可用。

/etc/usb_modeswitch.conf — 当排查故障时,用于启用扩展日志的一个全局配置文件,或者用于禁用切换功能(主要是为了访问设备的安装部件)。

/usr/share/usb_modeswitch — 一个包含每个设备个体设置信息文件的目录,根据设备ID和可能更深入的身份标识来命名(为了解决已知的二义性)。如果你的设备ID在某个文件的文件名中出现了,那么表明你的设备是受支持的,即使它的型号或品牌并不匹配。

/etc/usb_modeswitch.d — 一个存放自定义配置文件的目录。你可以将新建的或修改的配置文件放在这儿,它们将会比 /usr/share/usb_modeswitch 目录中的配置文件被优先使用。

/usr/sbin/usb_modeswitch — 实现切换功能的二进制程序。它被设计为独立于内核或系统细节,应当可以移植到非Linux平台上,只要libusb可用即可。

在模式切换和驱动程序加载之后,系统需要负责发现新的(主要是串行的)设备。

当前的NetworkManager版本(或者它的ModemManager组件)通常非常适合于使用无线调制解调器。甚至一些已经不再使用PPP接口的新型号也能够被识别,并且能被无缝地整合。

当试图自动侦测USB调制解调器和使用它们时,使用较老版本的这些程序就很有可能发生问题。

如果你坚持使用一个较老的系统,那么请禁用NM和MM。你将能够顺利使用wvdial、UMTSmon和若干种提供PPP用户界面的工具(诸如kppp),虽然这些程序中的某些可能需要有一点基本知识。

从1.1.2版本开始,如果设备提供标准的串行端口,usb_modeswitch将会添加一条指向使用中断传输的正确端口的符号链接。这条链接的名称为 /dev/gsmmodem,如果连接了多个设备,那么在名称之后会紧跟一个编号。

你可以在连接帮助程序(诸如wvdial)中使用这个名称。注意,在很多情况下,你可能需要手动编辑配置文件。

如果你设法得到一个新型的或支持很差的设备,并且想要以手动模式正确地进行切换,那么你可以自己添加一条udev规则和一个配置文件。但是也请将其报告给我们,分享你的成果!

请查看“ 贡献 ”章节。

五、已知的适用硬件

非常重要的提示:
就个人来说,我不可能测试绝大多数的受支持设备。此处的列表 — 除了必需的数据之外 — 还要依赖于第三方团体(或用户)的报告。因此,即使你的设备在此列出,你也很有可能遇到一些问题。
也就是说,这个小工具的用户基数有着非常可观的增加,因此任何数据相关的问题通常会很快地显现出来。

迄今为止,初始化切换进程有三种已知的方法:

  1. 向存储设备发送一条很少使用或看起来怪异的标准存储命令(相当于SCSI)(例如“eject”)。

  2. 向设备发送一条或多条制造商特定的控制消息。

  3. 主动地从设备中移除(断开连接)存储驱动程序(仅适用于某些早期的设备)。

再次,如果你没有在列表中找到你设备的名称,它仍然是可能受支持的。

当然,最好能够在配置文件目录中找到你的设备的USB ID。请仔细地浏览最新的数据包(请参考“下载”章节)。

下面是受支持的设备列表,同时还有相应贡献者的信息:device_reference.txt

六、故障排查

注意:如果在遵循本页面的建议之后,你仍然需要技术支持,那么请使用论坛!

电子邮箱智能用于投稿设备/配置文件 — 不能处理技术支持问题!

已知的问题

只有版本为2.6.27以及更新版本内核的自动串口驱动程序分配才能和针对3G优化过的驱动程序协同工作。如果你的内核版本较老,并且在模式切换之后,你的调制解调器没有被任何驱动程序识别出来,那么就会使用通用的“usbserial”驱动程序作为一种备用方案。

在版本为2.6.26至2.6.28的内核中,处理ID为 19d2:2000 的设备时会遇到一些问题。这通常会影响到大多数的ZTE设备,并且会使得“usb-storage”驱动程序忽略这个ID。而这将会妨碍正确的初始化,可能会导致切换失败。你没有其他办法,只能对内核代码进行少许修改,然后重新编译你自己的内核。请参考下面内核相关的问题,以了解详细的信息。

针对于自动化系统整合的调试,请在文本编辑器中将(以root身份或者使用su命令)/etc/usb_modeswitch.conf 文件中的以下行:

  1. EnableLogging=0

修改为:

  1. EnableLogging=1

这样便使得你可以在/var/log/usb_modeswitch_<device>日志文件中看到非常详细的设备热插拔活动日志。

如果你接下来确定你的设备具有合适的取值,并且你已经遵循所有的提示(请参考“已知的适用硬件”章节)进行操作,并且USB_ModeSwitch看起来每次运行时都在做一些事情,但是却毫无效果,那么你就很有可能遇到系统相关的问题。

首先怀疑的应当是已有的用于调制解调器的系统规则,这些规则可能没有正确地处理一些东西。

如果你拥有的设备的未切换ID为 05c6:1000 ,那么它可能会在较老的系统中调用切换命令出错。有四种不同类型的切换设备,它们都具有相同的ID;在大型的发行版中,在尝试过四五次失败之后,它们都会被看做是“可选”(制造商)的型号。甚至有些手机也具有这样的ID,将这些手机连接至USB端口时,它们可能会被错误地处理。

若想要解决这样的问题,你可以尝试从 “ /lib/udev/rules.d ”目录中删除相应的规则文件,这些文件中包含对“modem-modeswitch”命令的调用。

除了USB ID之外,USB_ModeSwitch将会进行额外的检查,并且会以正确的方式处理所有已知的不明确的设备。例如,它将会对ID为 05c6:1000 的未知设备置之不理。

另一个众所周知的设备ID是 19d2:2000 。它可能会在一个已有的规则控制之下切换正常,但如果你的设备型号是新型的,这个设备的ID还尚未添加至“可选”模块中,那么系统就不会为这个设备加载驱动程序。

禁用运行“弹出”的规则,这个设备的ID将会由usb_modeswitch进行处理。

内核相关的问题

在某些较新的内核中,某些设备(上述的设备,有些是可选厂商,有些是华为的,有些是ZTE的)会在USB存储设备的代码中得到特殊处理,会立即启用切换功能。对于这些特殊的设备来说,你可能不再需要USB_ModeSwitch,从另一方面来说,你必须访问你的设备的“CD-ROM”部件。另外,特殊处理没有产生任何效果,而且被妨碍的USB_ModeSwitch后来又工作正常的情况也是存在的(ZTE设备产生错误“-2”时可能会出现这种情况)。

当发生问题时,请查看你的内核源码的“ drivers/usb/storage ”目录中的“unusual_devs.h”文件。如果你的默认设备ID(存储部件的厂商和产品ID)可以在上述文件中找到,并且当运行USB_ModeSwitch时会出现错误消息,那么首先尝试将“usb-storage”加入黑名单。

如果这么做有用,那么你应当考虑重新构建你的内核,停用“unusual_devs.h”文件中的相应条目。唯一会发生的是,以后USB存储会以默认的方式工作。

我在Gentoo的俄语版维基中找到一条提示,这条提示完全按照我刚刚的建议进行操作,使用的设备为ZTE MF626。

顺便说一下,USB开发者之间一度达成共识,如果必要的步骤可以在“用户空间”中完成,那么就会将所有未来的模式切换代码独立于内核驱动程序之外。

另一种能够影响内核行为的方法是“usb-storage”的“delay_use”参数,这个参数会设置存储设备插入系统到实际使用(可能会自动挂载)之间的延迟时间,以秒为单位。默认值为5,这个参数可能会影响某些条件下的切换结果。

若想要修改默认值,则在/etc/modeprobe.conf文件中添加以下内容:
options usb-storage delay_use=1 (or 10, or other)

老系统(例如,CentOS 5 或 Xandros 6)

如果你使用的系统比不是非常的新(内核版本低于2.6.27),那么你可能偶尔会遇到“udev”版本之间的不兼容性,它是设备管理器。如果你没有任何迹象表明usb_modeswitch正在做任何事情(没有日志文件),那么请遵循以下步骤:

检查“ /lib/udev/rules.d ”目录中,除了“40-usb_modeswitch.rules”文件之外,还有没有其他文件。
如果并非如此,那么请将文件移入“/etc/udev/rules.d”目录中。
如果仍然没有任何动作,请查看“/etc/udev/rules.d”目录中是否有其他文件包含字符串“ATTRS”。

如果并非如此,那么请编辑“40-usb_modeswitch.rules”文件,将文件中所有的“ATTR”和“ATTRS”替换为“SYSFS”。保存修改,检查当你再次插入设备时,是否有些事情发生。

在特别难解决的“没有动作”的情况下,很有可能需要分析udev的动作;你可以编辑“/etc/udev/udev.conf”文件,将日志等级修改为“debug”即可。

七、贡献

即使USB_ModeSwitch还尚未支持你自己的硬件设备,它也可以非常方便地进行实验。

第一个普遍尝试的步骤就是使用已知设备的切换方法,例如,在BandLuxe的配置“1a8d:1000”中找到的“弹出”动作序列。如果你的设备原本是由华为制造的,那么你可以尝试使用“12d1:1446”的动作序列。

不用担心,使用可能错误的动作序列几乎不可能损坏任何东西。只需要确保在每次尝试之后,重新插拔你的设备。

如果所有的这些方法都没有用,你可以尝试这种方法:

注意,设备的厂商ID和产品ID可以在“/proc/bus/usb/devices”文件中查看(也可以查看“ lsusb ”命令的输出),被分配的驱动程序通常是“usb-device”。然后,在MS Windows中监听具有相同ID的设备的USB通信,监听之前需要安装设备板载的驱动程序。设备一定会在那时切换模式,你需要将那个时刻的日志记录下来。

我推荐这个工具:“SniffUSB”

这是一个较短的版本。Mark A. Ziesemer编写过一个非常好的应用示例,如下所示:
Alltel UM175AL USB EVDO under Ubuntu Hardy Heron

请向 Mode Switch Forum 论坛提交任何改进建议、新设备信息和/或缺陷报告。
如果你不需要技术支持,你可以使用一种更加古老,更加保密的通信方式 — 电子邮件。

编译适用于Android-x86架构的tcpdump工具

在谷歌和必应上搜索的Android-x86专用的tcpdump工具多半不能使用,它们基本上都是在ARM架构的安卓手机上使用的,而且版本都较为老旧。由于Android-x86的Linux内核是通用的32位Linux,那么能否在常用的32位Linux发行版上直接使用32位的gcc编译tcpdump,然后拷贝至Android-x86的模拟器中使用呢?答案是可以的!

一、环境说明

Linux虚拟主机:CentOS 6.6 i686
宿主机OS:Windows 7 SP1
宿主机IP:192.168.92.1
虚拟机软件:VMware Workstation 11.0
虚拟机系统:Android-x86 4.4 r2
虚拟机CPU:单核
虚拟机内存:1 GB
虚拟机硬盘:8 GB
虚拟机联网方式:Host-Only
虚拟机IP:192.168.92.128
虚拟机SSHD软件:SSHDroid
虚拟机SSH链接:root@192.168.92.128:2222
tcpdump版本:4.7.4
libpcap版本:1.7.3

注意:
本文使用三台主机,配置如上文所述:
1、承载虚拟机的Windows 7宿主机,代号为Host-1;
2、用于编译的CentOS虚拟机,代号为Host-2;
3、用于验证使用的Android-x86虚拟机,代号为Host-3。

二、编译TCPDUMP

本章节中的操作都是在Host-2上完成的,详细步骤如下所示:

1. 安装编译环境:

  1. yum groupinstall -y "Development Tools"
  2. yum install -y glibc-static

2. 下载源码包:

  1. cd /root/Downloads
  2. wget http://www.tcpdump.org/release/tcpdump-4.7.4.tar.gz
  3. wget http://www.tcpdump.org/release/libpcap-1.7.3.tar.gz

3. 解压缩:

  1. tar xvzf libpcap-1.7.3.tar.gz
  2. tar xvzf tcpdump-4.7.4.tar.gz

4. 编译libpcap:

  1. cd libpcap-1.7.3
  2. export CC=gcc
  3. ./configure --host=i686-pc-linux-gnu --with-pcap=linux
  4. make
  5. cd ..

5. 编译tcpdump:

  1. cd tcpdump-4.7.4
  2. export ac_cv_linux_vers=2
  3. export CFLAGS=-static
  4. export CPPFLAGS=-static
  5. export LDFLAGS=-static
  6. ./configure --host=i686-pc-linux-gnu --disable-ipv6
  7. make

6. 查看编译结果:

  1. file tcpdump

如果看到下图中的结果输出,则表明编译成功:

三、安装和验证

在Host-1上,通过Xshell和Xftp连接至Host-3(Android-x86虚拟机),然后:

1. 上传tcpdump:

从Host-2中,将前文编译好的tcpdump可执行文件拷贝至Host-1中,然后通过Xftp将tcpdump拷贝至Host-3的/data/local目录中,并且将tcpdump文件的权限修改为777。

2. 运行tcpdump:

Host-1的Xshell已经链接至Host-3,则在Xshell中运行以下命令:

  1. ./tcpdump -i eth0 -n icmp and src host 192.168.92.1

在Host-1的命令行窗口中运行以下命令:

  1. ping 192.168.92.128

如果在Xshell中能够看到下图中的输出,则表明安装成功:

四、后续

如果想要自行为基于ARM的安卓手机或开发板编译tcpdump工具,则可以参考以下文章:

  1. Monitoring Android Network Traffic Part I: Installing The Toolchain | Symantec Connect Community http://www.symantec.com/connect/blogs/monitoring-android-network-traffic-part-i-installing-toolchain

  2. Monitoring Android Network Traffic Part II: Cross Compiling TCPDUMP | Symantec Connect Community
    http://www.symantec.com/connect/blogs/monitoring-android-network-traffic-part-ii-cross-compiling-tcpdump

  3. Monitoring Android Network Traffic Part III: Installing & Executing TCPDUMP | Symantec Connect Community
    http://www.symantec.com/connect/blogs/monitoring-android-network-traffic-part-iii-installing-executing-tcpdump

编译适用于Android-ARM架构的tcpdump工具

零、准备工作

  1. 安装 Debian 7.8 X86_64
  2. 准备一台有root权限的Android手机
  3. 用root账户登录Debian系统

一、安装交叉编译工具链

1. 安装Emdebian软件仓库的GPG密钥

  1. apt-get install emdebian-archive-keyring

2. 安装Emdebian需要的Squeeze依赖

  1. apt-get install flex
  2. apt-get install byacc
  3. apt-get install make
  4. vi /etc/apt/sources.list

在上述文件最后添加如下内容:

  1. deb http://ftp.us.debian.org/debian/ squeeze main
  2. deb http://security.debian.org/ squeeze/updates main
  3. deb http://www.emdebian.org/debian/ squeeze main

注意:

第一行启用Debian Squeeze的软件仓库,以便于满足Emdebian工具链的依赖;
第二行启用Debian Squeeze的安全更新仓库;
第三行启用Emdebian的软件仓库。

3. 同步Debian软件包的索引文件

  1. apt-get update

4. 安装ARM GNU C++编译器

  1. apt-get install g++-4.4-arm-linux-gnueabi

5. 检查交叉编译器是否安装成功

  1. arm-linux-gnueabi-gcc --version

若上述命令的返回如下所示,则表示安装成功:

二、交叉编译TCPDUMP

1. 下载libpcap和tcpdump的源码包

  1. cd /root/Downloads
  2. wget http://www.tcpdump.org/release/tcpdump-4.7.4.tar.gz
  3. wget http://www.tcpdump.org/release/libpcap-1.7.3.tar.gz

2. 解压缩源码包

  1. tar xvzf libpcap-1.7.3.tar.gz
  2. tar xvzf tcpdump-4.7.4.tar.gz

3. 编译libpcap

  1. cd libpcap-1.7.3
  2. export CC=arm-linux-gnueabi-gcc
  3. ./configure --host=arm-linux --with-pcap=linux
  4. make
  5. cd ..

4. 编译tcpdump

  1. cd tcpdump-4.7.4
  2. export ac_cv_linux_vers=3
  3. export CFLAGS=-static
  4. export CPPFLAGS=-static
  5. export LDFLAGS=-static
  6. ./configure --host=arm-linux --disable-ipv6
  7. make

5. 检查编译是否成功

  1. file tcpdump

若上述命令的输出如下图所示,则表明编译成功:

6. 压缩可执行文件

  1. arm-linux-gnueabi-strip tcpdump

这一步可以将可执行文件的体积减少将近40%

三、安装和执行tcpdump

1. 安装ADB(Android Debug Bridge)软件包

  1. apt-get install android-tools-adb

2. 打开手机的USB调试功能

这个步骤每种手机可能各不相同,请参考对应型号手机的帮助文档
若手机没有完全root,则需要安装adbd.apk应用。

3. 检查手机是否连接成功

  1. adb devices

若上述命令的输出如下图所示,则表明手机已经成功连接:

4. 重新启动ADB后台

  1. adb root
  2. adb remount

注意:

第一条命令会以root账户重新启动ADB后台程序;
第二条命令会将/system分区以/read/write模式重新挂载

5. 检查ADB后台是否成功重新启动

  1. adb shell id

若上述命令的输出如下图所示,则表示ADB后台程序重新启动成功:

6. 上传tcpdump可执行文件

  1. cd /root/Downloads/tcpdump-4.7.4
  2. adb push tcpdump /system/xbin/

7. 检查tcpdump是否安装成功

  1. adb shell tcpdump -h

若上述命令的输出如下图所示,则表示tcpdump已经在手机上安装成功: