我们返回来继续看ChimpChat是怎么启动的,首先我们MonkeyRunnerStarter构造函数第58行的optionsGetBackendName()是怎么获得backend的名字的,从上一节命令行参数分析我们可以知道它默认是用‘adb’的,所以它获得的就是‘adb’,或者用户指定的其他backend(其实这种情况不支持,往下继续分析我们就会清楚了).
取得backend的名字之后就会调用60行的ChimpChat.getInstance来对ChimpChat进行实例化:
46 public static ChimpChat getInstance(Map<String, String> options)
47 {
48 sAdbLocation = (String)options.get("adbLocation");
49 sNoInitAdb = Boolean.valueOf((String)options.get("noInitAdb")).booleanValue();
50
51 IChimpBackend backend = createBackendByName((String)options.get("backend"));
52 if (backend == null) {
53 return null;
54 }
55 ChimpChat chimpchat = new ChimpChat(backend);
56 return chimpchat;
57 }
代码8-3-4 ChimpChat - getInstance
ChimpChat实例化所做的事情有两点,这也就是我们这一小节的重点所在了:
- 根据backend的名字来创建一个backend,其实就是创建一个AndroidDebugBridge - ADB
- 调用构造函数把这个backend保存到ChimChat的成员变量
往下我们继续看ChimpChat中AndroidDebugBridge这个backend是怎么创建的,我们进入到51行调用的createBackendByName这个函数:
75 private static IChimpBackend createBackendByName(String backendName)
76 {
77 if ("adb".equals(backendName)) {
78 return new AdbBackend(sAdbLocation, sNoInitAdb);
79 }
80 return null;
81 }
代码8-3-5 ChimpChat - createBackendByName
这里注意第77行,这就是为什么我之前说backend其实只是支持‘adb’而已,起码暂时的代码是这样子,如果今后google决定支持其他更新的backend,就另当别论了。这还是有可能的,毕竟google留了这个接口。
56 public AdbBackend(String adbLocation, boolean noInitAdb)
57 {
58 this.initAdb = (!noInitAdb);
59
60
61 if (adbLocation == null) {
62 adbLocation = findAdb();
63 }
64
65 if (this.initAdb) {
66 AndroidDebugBridge.init(false);
67 }
68
69 this.bridge = AndroidDebugBridge.createBridge(adbLocation, true);
70 }
代码8-3-6 AdbBackend构造函数
创建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