(原) golang库:Adb手机工具Go库-gadb

原创文章,请后转载,并注明出处。

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)
}

相关文章