企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
本文主要讲如下两个内容。 1.  如何让一部Android手机带两台PC进行调试。 2.  如何完美Root Android手机。     我曾经遇到过这样的问题,Mac OS X上测试Android的系统程序,大家都知道,Android源代码的编译通常需要Ubuntu Linux,所以在Mac OS X上安装了Vmware ubuntu。这样本没什么问题。将Android手机与MBP相连,系统会提示连接Mac OS X,还是Ubuntu。不过这有一个问题,就是ubuntu和mac os x同时只能连接一个。由于某些需要,要用到Mac OS X上的Eclipse编写Android应用,也能安装在同一部Android手机上,这就很郁闷,单单通过USB线只能连接一台PC(包括虚拟机)。    从技术上说,adb完全有这个能力使一部Android手机连接到两台PC上,不过可能大多数读者用的ROM是官方,为了安全起见,将该功能关了。如果读者使用了最新的CM ROM(cm10.1,可能老的版本也有该功能,这个还没测试),就会发现在设置的“开发者选项”中多了一个“网络ADB调试”。如图1所示。这可是梦寐以求的功能。 ![](https://box.kancloud.cn/2016-01-18_569cb8ac4a708.jpg)                                                           图1       选择“网络ADB调试”选项。然后记住下面的ip和端口号。在一台机器上用USB线连接手机,Eclipse的devices列表就会显示该手机已连接成功。如果仍然用当前PC通过网络连接ADB,需要执行下面的命令(PC与手机在同一网段)。    adb kill-server    adb connect 192.168.17.103:5555    如果一切正常,就已经连上了,打开Eclipse,会在devices列表看到如图2的设备。 ![](https://box.kancloud.cn/2016-01-18_569cb8ac5efcd.jpg)                                                           图2       其实这两个设备是一个,只是上边那个通过网络连接的手机,下边那个通过USB线连接的手机。现在运行程序,仍然会看到要求选择运行设备,如图3所示。 ![](https://box.kancloud.cn/2016-01-18_569cb8ac70975.jpg)                                                                                              图3       其实现在选哪个都行,因为这两个设备只是通过不同方式与PC连接。       如果在不同的PC上(或PC和虚拟机),一个通过USB线,一个通过网络。两台机器中的eclipse就可以在同一部手机上调试程序了,是不是很爽呢!      如果要断开网络adb连接,执行adb disconnect命令。     要注意,这一操作比较危险,一旦选择“网络adb调试”,只要同一网段的其他用户获知IP和端口号,就可以任意操作你的手机,而且不会有任何提示。甚至是在地球的另一端(只要你们在同一个网段,包括VPN)。 现在进入第二个主题,如果完美获取Android手机的ROM。由于前面使用的是CMROM(不知道CM ROM是什么的上网自己查),所以这里仍然讨论CM ROM的root过程。      可能刚一接触Android手机的读者会感觉root一部手机很复杂,其实再简单不过了。Root的基本原理就是在Android系统的/system/xbin目录放一个su命令。用过su的linux用户都知道su是什么东西,一个提取root权限的命令。如果读者用的是CM ROM,在/system/xbin目录已经有了su命令。而且在设置里可以打开root权限(cm的低版本直接就打开了root权限),所以使用CM ROM,这一步可以省了。当然,如果使用的不是CM ROM,也好吧。下一个CM ROM压缩包,将里面的杂七杂八的东西都删掉(包括内核镜像boot.img),只保留system/xbin目录中的su文件(该文件也可以上网找一个现成的,或直接编译android源代码中的su也可以,默认是不带这个命令的)和META-INF目录,然后重新打包成update.zip。然后最好刷一个clockworkmod recovery,这个比较好,update.zip不需要签名验证就可以刷。之后就可以在recovery模式下刷update.zip了。这个update.zip并不是完整的ROM,只是一个升级包,目的是将su文件放到/system/xbin目录中(该目录没有root权限是只读的)。刷完后,进入手机的shell(adb shell),然后执行su,发现原来的$变成了#,表明已经是root了,当然,有些目录还是不可写,例如,为了使system及其子目录可写,需要再次执行下面的命令。 mount –o rw,remount /system       现在还有一个问题,就是通过adb shell进入Shell,默认仍然是$,这就有些麻烦,因为对于程序员来说,需要调试系统程序,要用adbremount命令使/system/app目录变成可写的,然后可用adb push命令直接将apk文件上传到该目录。但如果默认不是root,是不能执行该命令的(权限不允许)。所以我们还需要做另外一件事,就是修改Android系统根目录的default.prop的内容,通常可以改成如下内容。 ro.adb.secure=0 ro.secure=0 ro.allow.mock.location=1 ro.debuggable=1 persist.sys.usb.config=mass_storage,adb persist.service.adb.enable=1        最大的问题就是default.prop是内存文件,改了也没用,一重启就会恢复原样,而且只有重启才能生效(好像进入了二难推理)。所以修改default.prop文件的方法是直接修改boot.img文件。该文件由两部分组成:zImage和ramdisk.img。其中zImage就是linux内核的二进制文件。ramdisk.img是内存磁盘镜像。该镜像中就包含了被称为Android第一个运行的程序init。default.prop文件也包含在该镜像中。下面就需要android源代码和linux内核源代码了。强烈建议使用CM提供的源代码,因为CM团队已经为我们进行了完美的适配,所以只需要修改与业务相关的内容即可。现在让我们向CM团队致敬。 Android源代码编译后,在out目录的相关子目录录生成了一个root目录,该目录中的内容就是ramdisk.img文件解压后的内容。现在找到default.prop文件,并安着上面的内容修改该文件。然后使用下面的命令重新生成ramdisk.img文件。 mkbootfs root | minigzip > /ramdisk.img 接下来使用下面的命令重新生成boot.img文件。 mkbootimg --kernel kernel  --ramdisk ramdisk.img -o boot.img 其中kernel是内核二进制文件,与zImage完全一样。只是编译android源代码时将其命名为 ok,现在可以进入bootloader模式,然后重新执行fastboot flash bootboot.img刷内核镜像,然后再重启手机,现在进入shell,ok,默认就是#了。退出shell,执行adb remount。就可以用adb push上传文件到/system的其他目录了,如/system/app。