创建AndroidDebugBridge之前我们先要确定我们的adb程序的位置,这就是通过62行来实现的,我们进去findAdb去看下它是怎么找到我们的sdk中的adb的:
72 private String findAdb()
73 {
74 String mrParentLocation =
System.getProperty("com.android.monkeyrunner.bindir");
75
76
77
78
79
80 if ((mrParentLocation != null) && (mrParentLocation.length() != 0))
81 {
82 File platformTools = new File(new
File(mrParentLocation).getParent(),
"platform-tools");
83
84 if (platformTools.isDirectory()) {
85 return platformTools.getAbsolutePath() + File.separator +
SdkConstants.FN_ADB;
86 }
87
88 return mrParentLocation + File.separator +
SdkConstants.FN_ADB;
89 }
90
91 return SdkConstants.FN_ADB;
92 }
代码8-3-7 AdbBackend - findAdb
首先它通过查找JVM中的System Property来找到"com.android.monkeyrunner.bindir"这个属性的值,记得前面小节运行环境初始化的时候在monkeyrunner这个shell脚本里面它是怎么通过java的-D参数把该值保存到JVM里面的吧?其实它就是你的文件系统中保存sdk的monkeyrunner这个bin(shell)文件的路径,在我的机器上是"com.android.monkeyrunner.bindir:/Users/apple/Develop/sdk/tools".
找到这个路径后通过第82行的代码再取得它的父目录,也就是sdk的目录,再加上'platform-tools'这个子目录,然后再通过85或者88这行加上adb这个名字,这里的FN_ADB就是adb的名字,在windows下会加上个'.exe'变成'adb.exe' ,类linux系统下就只是‘adb’。在本人的机器里面就是"Users/apple/Develop/sdk/platform-tools/adb"
好,找到了adb所在路经后,AdbBackend的构造函数就会根据这个参数去调用AndroidDebugBridge的createBridge这个静态方法:
265 public static AndroidDebugBridge createBridge()
...
271 try
272 {
273 sThis = new AndroidDebugBridge();
274 sThis.start();
275 } catch (InvalidParameterException e) {
276 sThis = null;
277 }
...
297 return sThis;
298 }
299 }
代码8-3-8 AndroidDebugBridge - createBridge
第273行AndroidDebugBridge的构造函数做的事情就是实例化AndroidDebugBridge,ADB真正启动起来是调用274行的start()这个成员方法:
713 boolean start()
714 {
715 if ((this.mAdbOsLocation != null) &&
(sAdbServerPort != 0) &&
((!this.mVersionCheck) || (!startAdb()))) {
716 return false;
717 }
718
719 this.mStarted = true;
720
721
722 this.mDeviceMonitor = new DeviceMonitor(this);
723 this.mDeviceMonitor.start();
724
725 return true;
726 }
代码8-3-9 AndroidDebugBridge - start