ADB,全名Android Debug Bridge,是Android提供的一个通用的调试工具,是一个C/S架构的命令行工具,通过这个工具,使得我们的PC能够和Android设备来进行通信。
adb包含三个部分:
a. Client端:运行在开发机器中,用来发送adb命令,比如电脑
b. Daemon守护进程:运行在调试设备,比如手机、模拟器中,用来接收并执行adb命令
c. Server端:运行在开发机器中,用来管理Client端和手机端Daemon之间的通信。
当在电脑命令行窗口中输入adb 命令时,会先执行adb客户端,客户端拿到命令之后,会发送给adb服务端,server再将命令传给Daemon,最后在手机上执行。假如在手机上安装一个应用,会有一个返回信息,会将信息传递给adb服务器,adb 在给客户端,最后显示在命令行。
更详细的ADB命令可以看另一篇文章。
今天在码云上看到一个用go实现scrcpy的代码:gitee.com\morphyguo\go-scrcpy,虽然代码运行起来有很多问题,不过关键是学习方法嘛。
代码调用了一个ADB的go库:github.com/electricbubble/gadb,这才是本文的重点。
PS: 不知道与这个goadb有什么区别。
看看此库的示例代码,本人已作修改
package main
import (
"fmt"
"log"
"os"
"strings"
"github.com/electricbubble/gadb"
)
func main() {
adbClient, err := gadb.NewClient()
checkErr(err, "fail to connect adb server")
devices, err := adbClient.DeviceList()
checkErr(err)
if len(devices) == 0 {
log.Fatalln("list of devices is empty")
}
dev := devices[0]
fmt.Println(dev.Model(), dev.DeviceInfo())
// 获取屏幕截图,返回的应该是图形的byte。
// 利用它其实已能实现基本的屏幕映射
cmdOutput, err := dev.RunShellCommandWithBytes("screencap -p")
fmt.Println(cmdOutput)
userHomeDir, _ := os.UserHomeDir()
apk, err := os.Open(userHomeDir + "/Desktop/xuexi_android_10002068.apk")
checkErr(err)
log.Println("starting to push apk")
remotePath := "/data/local/tmp/xuexi_android_10002068.apk"
err = dev.PushFile(apk, remotePath)
checkErr(err, "adb push")
log.Println("push completed")
log.Println("starting to install apk")
shellOutput, err := dev.RunShellCommand("pm install", remotePath)
checkErr(err, "pm install")
if !strings.Contains(shellOutput, "Success") {
log.Fatalln("fail to install: ", shellOutput)
}
log.Println("install completed")
}
func checkErr(err error, msg ...string) {
if err == nil {
return
}
var output string
if len(msg) != 0 {
output = msg[0] + " "
}
output += err.Error()
log.Fatalln(output)
}