本文主要讲如下两个内容。

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所示。这可是梦寐 以求的功能。

 

                                                       图2

        选择“网络ADB调试”选项。然后记住下面的ip和端口号。在一台机器上用USB线连接手机,Eclipse的devices列表就会显示该手机已连接成功。如果仍然用当前PC通过网络连接ADB,需要执行下面的命令(PC与手机在同一网段)。

   adb kill-server

   adb connect 192.168.17.103:5555

   如果一切正常,就已经连上了,打开Eclipse,会在devices列表看到如图2的设备。

                                                         图2

         其实这两个设备是一个,只是上边那个通过网络连接的手机,下边那个通过USB线连接的手机。现在运行程序,仍然会看到要求选择运行设备,如图3所示。

                                                                                图3

其实现在选哪个都行,因为这两个设备只是通过不同方式与PC连接。

      如果在不同的PC上(或PC和虚拟机),一个通过USB线,一个通过网络。两台机器中的eclipse就可以在同一部手机上调试程序了,是不是很爽呢!

     如果要断开网络adb连接,执行adb disconnect命令。

    要注意,这一操作比较危险,一旦选择“网络adb调试”,只要同一网段的其他用户获知IP和端口号,就可以任意操作你的手机,而且不会有任何提示。甚至是在地球的另一端(只要你们在同一个网段,包括×××)。

      现在进入第二个主题,如果完美获取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。

 

更多相关文章

  1. android之命令行创建AVD
  2. 安卓的历史
  3. Android(安卓)生成keystore,两种方式 【包括Mac下制作】
  4. Android(安卓)SDCard Filesystem
  5. android应用程序的安装位置
  6. Android(安卓)生成keystore,两种方式 【包括Mac下制作】
  7. 【OSC手机App技术解析】- Android完全退出程序
  8. Android(安卓)生成keystore,两种方式 【包括Mac下制作】
  9. Android(安卓)生成keystore,两种方式 【包括Mac下制作】

随机推荐

  1. 在android中用代码触发一个按钮的点击事
  2. Android(安卓)JSON解析示例代码
  3. Android(安卓)应用程序开发
  4. android命令行模拟输入事件(文字、按键、
  5. How to install Google Apps (GApps) on
  6. Notification
  7. android 使用post方式进行网络连接
  8. android获取SD卡状态
  9. Android(安卓)最简单的仿支付宝数字滚动
  10. Android调用系统的发邮件方法