作者归档:贺 利华

关于贺 利华

正在学习编程,享受编程 热爱文学,闲来读读《读库》 有思想,没理想 正在学会专注

CentOS 64位机器配置Android SDK和NDK环境

做个小备忘。

因为工作上的一些需要,需要在CentOS 64位机器上搭建一个编译Android项目的环境,Android SDK的环境还比较好搭建,直接下载android-sdk包即可,下载页面链接在这里http://developer.android.com/sdk/index.html,我下载的是sdk only包,体积比较小不包含ADT包(在服务器上用不着这些东西),因为是在服务器上,所以是木有任何桌面环境的,也就木有桌面浏览器啦。用wget或者curl下载即可。下载成功后,解压,可是目前目录下面只有tools目录,没有platform-tools目录,这个目录下的东西可不少哦,神马aapt、dx等等非常重要的工具都可是在这个里头哦,通常我们都是直接通过android命令就可以启动Android SDK Manager的界面管理工具,通过勾选不同平台就可以选择性地更新哪个版本的sdk了。服务器上木有swt环境啊(Android SDK Manager是基于SWT实现的),肿么办捏?程序员做的东西肯定是有命令行界面的嘛。come你的on,google一下吧,结果在这里,万能的google,程序员的福音stackoverflow上已经有人解决了该问题。大体就是通过

android list sdk

这个命令来查看有哪些sdk可以更新,你可以可以通过

android --help list sdk

来查看其他的一些选项,例如通过

android  list sdk --extended --all

来查看所有的可用的(包括Android认为已经过时的,例如2.3.3之类的各个android版本的SDK,而且会将名字给你写出来哦),例如:

id: 61 or “extra-android-support”
Type: Extra
Desc: Android Support Library, revision 11
By Android
Install path: extras/android/support

这个指的是就是Android的suppor-library,其他的各个名称也很直观啦,这些名字可以用的地方呢就是我们在使用
android update -u
命令进行SDK更新的时候可以通过设置filter来选择我们需要安装哪些包,例如下面这个命令:
android update sdk -u –filter extra-google-google_play_services
执行之后,就会选择Google Play Service这个包来下载更新,同理其他的都素一样的啦。例如通过
android update sdk -u –filter platform-tool
会自动下载platform-tools目录,你要是加上platform,使用
android update sdk -u –filter platform-tool,platform
就会下载所有版本的platform文件,其他的命令自己一个个尝试就好了。等下载完成之后,配置PATH变量吧
export ANDROID_SDK_HOME=/root/android-sdk-linux
export PATH=$ANDROID_SDK_HOME/tools:$ANDROID_SDK_HOME/platform-tools:$PATH
配置完SDK,那么开始配置NDK吧,毕竟很多时候我们在开发的过程中还是很有可能会使用到NDK的,那么开始吧,先下载NDK包吧,下载页面在这里,选择对应平台下载链接下载吧,下载成功后解压缩之后,配置环境变量吧:
export ANDROID_NDK_HOME=/root/android-ndk-r8c
export PATH=$ANDROID_NDK_HOME:$PATH
配置好环境变量,加载一下环境变量,然后开始测试一下能否编译吧,cd到samples/hello-jni/jni目录下,直接执行ndk-build命令,提示错误
./../../ndk-build: /root/android-ndk-r8c/prebuilt/linux-x86/bin/make: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
提示缺少某个依赖文件,Google之后得知,通过命令
yum install glibc.i686
装上glibc库即可,再次尝试ndk-build,依然提示错误
/root/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/as: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory
提示缺少zlib库文件依赖文件,Google之后得知,通过命令
yum install zlib.i686
装上zlib库文件之后,继续ndk-build,这次能顺利编译出so文件了,也成功将文件拷贝到对应的libs/armeabi目录下了,可以有这么一个警告信息:
/root/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-strip: /lib/libz.so.1: no version information available (required by /root/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-strip)
大体的意思就时因为/lib目录下的libz.so.1版本信息不对,导致arm-linux-androideabi-strip命令无法正常执行,这个会带来神马问题捏?我们来看看吧。其实就是/root/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/下的arm-linux-androideabi-strip命令没有办法执行呗,那么这个命令是用来干嘛的,直接运行一下看看usage:
Usage: /root/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-strip <option(s)> in-file(s)
Removes symbols and sections from files
大体的意思就是通过这个命令可以将我们编译出来的so文件中的一些不必要的符号和片段给移除掉,可以让这个二进制文件更紧凑一些,运行效率会高一些?这个我真不知道,因为自己对于编译和链接这一块儿懂得真是太少了所以也就没有什么发言权啦。闲话少说,既然看到有问题,当然这个so肯定是可以用的(因为ndk-build并没有出错,而且还将so文件install到libs下对应的armeabi目录下了,我想Android开发团队肯定不会坑爹地将一个可能出错的编译输出文件install到该目录下的,所以说这个问题应该不大,肯定可以正常运行),只是看到这个警告信息让我非常的不爽,或者移除了这些符号和片段会让你的二进制文件运行起来更爽,或者可以让别人无法通过反编你的so来查看你调用了什么函数之类的,具体原因不明,反正我就是不爽,我要让这个警告信息给我消失。怎么办呢?

肯定先google啦,google了很多,看了一些文档,大体得出结论是这个libz.so.1的版本比较低,而android这个命令可能比较新,依赖的库的版本比当前我的机器上/lib目录下的libz.so.1的版本要高,好吧,那就去下载源码自己编译吧。可以到这个zlib的官方页面上的这个下载地址(WTF,竟然需要翻墙)。下载后解压之后,cd到zlib目录下,三步走
./configure
make
make install
整个过程很顺利,编译后的文件都被放到/usr/local/lib下了,这个可以通过编译安装输出看出来
[root@helihua zlib-1.2.7]# make install
cp libz.a /usr/local/lib
chmod 644 /usr/local/lib/libz.a
cp libz.so.1.2.7 /usr/local/lib
chmod 755 /usr/local/lib/libz.so.1.2.7
cp zlib.3 /usr/local/share/man/man3
chmod 644 /usr/local/share/man/man3/zlib.3
cp zlib.pc /usr/local/lib/pkgconfig
chmod 644 /usr/local/lib/pkgconfig/zlib.pc
cp zlib.h zconf.h /usr/local/include
chmod 644 /usr/local/include/zlib.h /usr/local/include/zconf.h
然后将/lib/libz.so.1文件先备份一下,将/usr/local/lib目录下的libz.so.1链接到/lib目录下,因为arm-linux-androideabi-strip这个命令链接的路径中依赖的/lib目录下的libz.so.1,当然我们也可以通过修改LD_CLASSPATH的方式来让arm-linux-androideabi-strip这个命令加载/usr/local/lib目录下的libz.so.1文件,可惜我现在不想这么麻烦,因为我现在也不知道具体做法,我懒得去Google了,我的方法是直接将该文件链接到/lib目录下,替换系统原有的libz.so.1
mv /lib/libz.so.1 /lib/libz.so.1_backup
ln -s /usr/local/lib/libz.so.1 /lib/libz.so.1
但是童鞋们啊,这还是不够滴,因为现在的系统捏是尼玛64位滴,而该死的Android都是基于32开发的,它依赖的是32位的libz,你现在执行ndk-build不出意外的话,你会碰到这个错误信息:
[root@helihua jni]# ../../../ndk-build
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
/root/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-strip: error while loading shared libraries: libz.so.1: wrong ELF class: ELFCLASS64
make: *** [/root/android-ndk-r8c/samples/hello-jni/libs/armeabi/libhello-jni.so] Error 127
make: *** Deleting file `/root/android-ndk-r8c/samples/hello-jni/libs/armeabi/libhello-jni.so’
唉,那么就只好开始编译32位的咯,怎么编呢,还是Google吧,程序员福音stackoverflow上又有对应的问题,在这里,通过
export CFLAGS=-m32
指定当前编译目标平台位32位滴,直接在bash下使用该命令只会在当前bash会话期间有效,不会影响到其他bash会话和下次你重新登录bash时的编译环境设置,非常有用,我们只需要在这次编译libz时才需要如此,正中下怀啊。果断重复上面的三步走啊:
./configure
make
make install
这次执行./configure就不会那么顺利了,会出现这样一个错误:
./configure
Checking for gcc…
.
.
.
Looking for a four-byte integer type… Not found.
如果这个时候你选择继续make的话,显然会出错滴,错误如下:
/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory
通过该命令:
yum install glibc-devel.i386
安装对应的开发环境,重新执行上面的三步,
成功后再重复设置/lib目录的操作:
mv /lib/libz.so.1 /lib/libz.so.1_backup
ln -s /usr/local/lib/libz.so.1 /lib/libz.so.1
然后再尝试执行ndk-build命令,这次就不再提示任何警告和信息了,输出干净多了:
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
回过头来再想想,为什么会出现这些问题呢?
前两个问题是因为Android NDK中的某些命令依赖于系统的一些库,没有直接安装就好了,这个没有过多讨论的余地,后面那个出现版本不一致导致的警告信息,我个人的理解是这样的,因为我们直接使用的都是Android NDK prebuild的命令,而这些命令可能在Google的编译服务器上依赖的是更高版本的库,所以导致在我们的环境中会出现版本不一致的问题。因为NDK中带着源码,我倒是觉得可以通过在自己的机器上编译一个NDK出来,应该就可以解决这个问题,当然前提是NDK的源码中没有引用到更高版本的一些头文件,另外编译源码可能需要我们安装很多的开发环境(就是很多的库和头文件),点到为止,有机会可以一试。

中行ATM机吞卡记

早上坐公车到华堂商场,看着商场还没开门,旁边的肯德基已经营业了,进去吃了顿早餐,吃完之后商场开门营业了,从肯德基开门直接进到商场,找到中行的ATM机,猛然一看ATM机上显示了一个Visual C++ Runtime Library Error的对话框,习惯性的点击屏幕上对话框的确定按钮,未遂。

直接将银行卡插入ATM机,又弹出一个同样的错误对话框,这是我才想起原来这个机器是需要使用物理按键的,连续按了两次确定按键,对话框消失了,整个机器重启了。

重启的过程中,我看到了无比熟悉亲切的Windows XP启动画面,三个启动选项中分别是Windows XP Professional, Windows XP Professional (安全模式), Ghost一键还原。我勒个去啊,直接按确定选择第一个选项进入(如果我的卡不在里面的话,我想我可能会选择其他的选项来看看具体会是什么情况)系统,一顿加载Windows之后,启动了100个Task,然后的启动了SNTP服务和ATMS服务,在这个过程中我看到了无比熟悉的Windows XP蓝天白云的桌面,随后自动启动了ATM常见的服务程序,整个界面就是一个ATM操作的界面了。

启动ATM界面之后,先是提示系统维护无法正常使用,然后过了一会儿系统可以正常服务了。可惜我的卡已经杯具的被吞了,致电中国银行之后,告知三个工作日后可以去指定银行网点取卡,我擦啊。

以后大家碰到类似的情况,一定不要先插卡啊,先让这个该死的Windows重启再说吧。

说到这个Windows的事情,想起来了地铁上的那些移动展示牌是用Windows做的,现在发现银行的ATM机也是用Windows做的,这些授权费用得多高啊?以后可能还能发现很多系统都是基于Windows做的,因为VC++ Runtime Library Error可见到的地方真的不少啊。

Android手机真的那么难用吗?

首先声明一下,写这篇文章,我力求能客观的描述一下我自己在使用Android手机过程中遇到的各种问题,不爽以及比较爽的事情,只从手机正常用户的角度来说一说。

假期前,跟同事一起吃饭,同事跟我聊起来关于这个iPhone手机的各种优势(Android手机没有),因为这位同事之前一直使用的是Android手机(HTC Desire 欧版水货,搭配MIUI),在将近两年的时间里他的手机每次刷机都是我帮他完成的(此处做下说明,我自己使用的手机从未刷过机,我目前自己拥有两部Android手机,一部是HTC Legend,一部是Google Galaxy Nexus),在这两年的过程中我见过他的手机不断自己死机重启,抠电池(我们称这个为绝大部分Android手机的杀手锏,如同PC电脑的重启Reset,屡试不爽),因为手机存储空间的问题装不上应用而烦恼。

 

  1. 内存问题,在我使用HTC Legend的一年多时间里,我的手机死机过,抠过电池,因为内存空间太小我的手机目前只能装7个应用,不过目前我已经不再使用这款手机了,为何现在只能安装7个应用了,这个原因很简单,随着系统的进化升级,首先系统所占的空间会变大一些,其次整个系统生态的进化,开发者对应用使用的各种图素越来越多越来越精致,而且设备的多样性,让应用适配各种设备的需求也越来越多了,为了让应用能在所有设备上很好的得到适配,应用中会有多个分辨率的图素资源,也就让应用越来越大了。这样就会弄得用户最后只会在手机留下最需要的应用,一些平时不怎么用又占地方的无用软件就会被丢弃。当然随着整个时间的推移,你的手机会退役,会有新的机器来替代你之前的机器,目前我使用的Google Galaxy Nexus手机内置存储,也就意味着你能将所有的应用都直接安装到内置存储中,16G乃至32G的空间,足够你装一阵子的了,不过很多的朋友可能使用的手机还不是内置存储的,不过目前新的手机大部分ROM空间大小也都在512M左右了,对于正常使用来说肯定是没有任何问题了。
  2. 软件经常崩溃的问题,甚至系统自己都会崩溃(其实很多时候我们认为是系统崩溃了,实际上我们只是看到了手机的桌面程序崩溃重启了)。在我使用Android手机并且作为Android开发者的两年时间里,我碰到过无数软件崩溃的问题,QQ,微博,Google Earth, Google Maps等等都曾出现过,难道他们都应该被钉到耻辱柱上?软件崩溃很多时候都是因为程序员小的失误而造成的简单的NullPointer异常,在软件进化的过程中这些都是会变得越来越少,至少我的感觉是这样的。因为开发者在这个平台上开发的经验丰富了,做事情的时候能更多地为这个平台上的特性作出改变,最终提供一个更为流畅体验的软件。
  3. 软件体验差的问题,Android有成千上万的Rom,各自宣称自己是最人性化的Rom,拥有无与伦比的操作体验感,我作为开发者接触过的手机较多,也见识过不少的Rom,体验各有所长,甚至有些真的是非常贴心的设计,同样因为Android市场的开放性(开放到你在Play市场中都能下载安装百度应用这种类似于Play市场的应用程序),Android的应用程序在软件交互设计上各自发挥自己的想象,很多的东西不统一,不过作为一个用户,我倒是并不认为这有什么问题,因为每个软件解决的都是特定的问题,播放器就应该能全屏,拨号器就应该默认打开9宫格键盘,我在日常生活中常用的软件不超过10个,对于每个软件的操作方式我还是能轻松的应付的(当然这又可能又涉及到“还有很多的非专业用户”这样的问题,这关我屁事啊,我只是一个用户恰好同时是个专业人员而且,我只能保证我自己做的东西不让大家用起来费解)。
  4. 关于系统和硬件的一些问题,例如Android手机在通话过程中无法使用移动网络(貌似可以使用WIFI,没有求证过),例如插入耳机之后,如果耳机根本没有话筒那么在通电话的时候你只能听,系统不会判断这个耳机是否能输入语音,而是直接阻塞了话筒的语音输入,例如手机的系统各种落后,Google每次高调宣布新系统发布,一大群Android用户要么集体唏嘘,要么就是开始混迹各大论坛等适合自己手机的Rom出现,赶紧刷上感受一把,尼玛确实坑爹啊。不过我作为一个开发者我每天正常使用的手机从未刷过机,不是因为担心保修的问题(因为我买的手机都是水货,保修根本就没有任何保证),但是我担心的问题是Rom给我带来的问题远超过能带给我的便利,我只能相信我买的手机的生产厂家才能完美适配他们自己手机的硬件驱动等等一系列的东西,根本不是某些大牛改改资源删删文本就能做到的。
  5. 价格的问题,我不只一次听到很多的人说“我也想买个iPhone”这样的话,可是最终出手的人委实不多,为何?价格摆在那里,我们可以称Android是为屌丝们意淫白富美的利器,但是现实确实是很多人还无法承担一部手机价格超过4000这样的消费。这些人如何来满足自己想通过手机来达成自己娱乐和通信的双重需求呢?厂家们很清楚这个市场的潜力,他们推出众多的低端机,中低端机,中端机,中高端机,高端机,原本就是为了不同的人群而设定的,Android中的高端机价格远超一部iPhone 4S 32G版本的价格,依然能在市场上有所作为,这不是那些人傻,也不是那些人没有用过iPhone不了解iPhone的优点,而是因为他们有某些需求被这些机器满足了,而iPhone没法做到。
  6. 电池的问题,我非常痛恨我的手机总得让我带着移动电源出门,我不是一个手机控,我不会在地铁上和公车上不断地把玩自己的手机,我不会周末在家躺在沙发上刷微博,可是我的手机从未正常在一天24小时内保持坚挺,我每天到了公司就必须把手机接上充电器(当然因为我是开发者,即便不充电也是需要调试的),每天晚上手机都是满电回到家中,第二天早上回到公司,手机又必须赶紧开始续上电,智能手机的屏越来越大,用起来越来越爽(当然小手的同鞋会因为抓不住手机,导致手机经常摔到地上,我就是其中之一),可是你的电肿么办?目前无解,要么多带电板,否则携带移动电源。
  7. 信号的问题,常常听到人说“买个iPhone用移动的2G卡,网络好慢”,我倒是觉得这个跟什么手机什么系统关系不大,主要还是运营商网络的问题,不过就我自己使用的情况来看,Android手机的信号真的不算出众,相对于之前使用的非智能机,我依然认为我的非智能机在使用同一张卡的时候表现良好,而目前的机器稍显欠佳,手机我依然最信赖诺基亚制造。
  8. 格调问题,很多人都曾说过“果粉很在意他身边的人是否也在使用苹果设备,如果使用的话,希望知道对方使用的是哪款设备”,其实我想很多人都会有这样的潜意识,希望自己的选择能够得到认可,如果因为你买了一部手机,公司其他的同事都买了同一部手机,我想大部分人都会感觉良好(我也会)。不过关于屌丝和白富美这样的对比,我倒是觉得大可不必,手机如今确实不只是工具,更像是手表这般的物件(能体现自己的品味和格调),那么Android代表的是什么呢?我确实不知道,因为我自己确实可以被归到屌丝之中,但是我并不希望Android成为一个屌丝代名词,可能也没有多少人这么想(我自己也没有这么想),我对于Android没有过多的热爱之情,他只是手机的操作系统而已,我喜欢它是因为我了解它,因为它的开源让我作为一个开发者能一窥它那庞大的代码组织是如何造就了这么一个成功的生态,让我能拜读到很多成功而美丽的代码。我想我的格调还是会因为Android手机的存在产生一些变化,不过我倒是更相信我个人的格调能改变我身边的人对Android的看法。
  9. 应用的问题,很多时候我们会听到“Android没有那么好用的应用啊”类似的说法,确实如此,Android整个生态中确实少见到非常精品的应用和游戏,原因是什么呢?这个显然还是取决于众多企业在移动平台上布局的策略,跟某个系统的关系实在太小了。国内有不少的团队声称他们只做iOS市场,说iOS投资回报率高,在Android生态中,你无法赚到钱,所以只能选择iOS,所以还是利益驱使的原因,现在Android用户越来越多,我想这些曾经这么说的人,除非他们真可以只依赖iOS就能生存下来,否则他们早晚还是会重新认识Android整个生态带来的一些改变的。就我个人而言,我还真没有发现有什么应用程序是某个平台独享,然后缺了这个应用会对我造成什么障碍,或者说有某个平台独享应用能提升效率,而在Android上我会因为没有这个工具效率就较低(当然,这只适用于我个人)。
  10. 用户自由度的问题,我想这个问题就不说了,因为说也等于没说,有人觉得不需要给用户很多的选择(我就是这么想的),有人觉得用户有权利选择管理自己的手机(通过各种方法),虽然我很喜欢Android的自由管理方式,因为我是开发者我能完全理解Android的存储(我保证有一大堆人其实是不太明白的,但是他们可能也能使用得挺好的),而像iTunes这样的产品会让诸多普通用户用得非常之爽。所以这个还是回到习惯的问题,很多人都有使用U盘的经验,所以大部分人在使用Android进行存储的时候没有任何困难,而使用iTunes确实需要学习,我身边的同事就有很多用iTunes会碰到很多问题不知道怎么折腾(请注意不是某些困难问题,而只是简单需求,需要学习)。
  11. Google的问题,因为我自己是Google控,Android天生的优势在这个方面还是存在的,虽然Google总是会兼顾绝大部分的用户,会在推出新版本的时候保证多平台同步更新,在Android平台使用Google的产品全然没有障碍,特别是有了Chrome之后,生活更加美好了。

以上是我作为一个用户(同时因为我是开发者,也许我的高度会稍微高一些)对Android的一些看法,对于我个人而言,Android不算难用,但是他好用吗?不好用,因为我很多时候都会因为电量的问题而无法使用,这简直就是坑爹。至于Android能给你带来什么,我想说的是,你会期望一个工具给你带来什么的话,那么恐怕你还需要很多很多工具来给你带来存在感,因为能给你提供存在感的东西实在太多了,数不胜数,手机绝对不是最合适给你带来存在感的。但是因为我是开发者,我的手机能给我带来存在感,但是我依然没有觉得选择一部多么高端或者精美的手机能给我带来什么强烈的感觉,于我而言,如果能拥有一部速度不让我恶心等待,电量不让我无法使用,网络信号不让我难以顺畅通话,屏幕可以用来看电子书的手机,已经是非常好的一款设备了。

Ubuntu下让ADB识别所有设备的两个方法

方法一,完全参考谷歌的文档,内容如下
在/etc/udev/rules.d目录下新建一个51-android.rules文件,将下面所有内容拷贝到该文件中:

SUBSYSTEM=="usb", ATTR{idVender}=="0502", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="0b05", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="413c", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="0489", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="04c5", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="091e", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="18d1", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="109b", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="0bb4", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="12d1", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="24e3", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="2116", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="0482", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="17ef", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="1004", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="22b8", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="0409", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="2080", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="0955", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="2257", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="10a9", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="1d4d", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="0471", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="04da", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="05c6", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="1f53", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="04e8", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="04dd", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="054c", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="0fce", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="2340", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="0930", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVender}=="19d2", MODE="0666", GROUP="plugdev"

方法二,有点Hack的味道,参考“孔雀的小屋”滴,就是将下面这行内容拷贝至/etc/udev/rules.d/51-android.rules文件中,
通杀所有Android设备,上面的那些都可作为浮云

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666", GROUP="plugdev"