原文地址:http://www.it165.net/pro/html/201407/17696.html
bootstrap结构
如图所示为bootstrap的项目结构
bootstrap作用
bootstrap在appium中是以jar包的形式存在的,它实际上是一个uiautomator写的case包,通过PC端的命令可以在手机端执行。
bootstrap源码分析
首先程序的入口为Bootstrap类。所以从该类开始一步一步解释这个项目
Bootstrap.java
01.
package
io.appium.android.bootstrap;
02.
03.
import io.appium.android.bootstrap.exceptions.socketServerException;
04.
05.
com.android.uiautomator.testrunner.UiAutomatorTestCase;
06.
07.
/**
08.
* The Bootstrap class runs the socket server. uiautomator开发的脚本,可以直接在pc端启动
09.
*/
10.
public
class
Bootstrap
extends
UiAutomatorTestCase {
11.
12.
void
testRunServer() {
13.
SocketServer server;
14.
try
{
15.
// 启动socket服务器,监听4724端口。
16.
server =
new
SocketServer(
4724
);
17.
server.listenForever();
18.
}
catch
(
final
SocketServerException e) {
19.
Logger.error(e.getError());
20.
System.exit(1
21.
}
22.
23.
24.
}
该类继承自UiAutomatorTestCase。所以它才能通过adb shell uiautomator runtest AppiumBootstrap.jar -c io.appium.android.bootstrap.Bootstrap被执行。
该类很简单,就是启动线程,监听4724端口,该端口与appium通信。
然后走server.listenForever()方法。
SocketServer.java
* Listens on the socket for data,and calls {@link #handleClientData()} when
* it's available.
*
* @throws SocketServerException
*/
listenForever()
throws
SocketServerException {
UpdateStrings.loadStringsJson();
// 注册两种监听器:AND和Crash
dismissCrashAlerts();
TimerTask updateWatchers =
TimerTask() {
@Override
run() {
// 检查系统是否有异常
watchers.check();
Exception e) {
}
};
// 计时器,0.1秒后开始,每隔0.1秒执行一次。
28.
"Client connected"29.
in = BufferedReader(
InputStreamReader(client.getInputStream(),
30.
"UTF-8"
));
31.
out = BufferedWriter(
OutputStreamWriter(client.getoutputStream(),92)">32.
33.
while (keepListening) {
34.
// 获取客户端数据
35.
handleClientData();
36.
37.
in.close();
38.
out.close();
39.
client.close();
40.
"Closed client connection"41.
IOException e) {
42.
throw
SocketServerException(
"Error when client was trying to connect"
43.
44.
}