魔云腾设备管理 Go SDK,提供设备发现、安卓云机管理、应用管理、文件管理等功能。
go get atomgit.com/mytsdk/adrctl-go
package main
import (
"context"
"fmt"
"atomgit.com/mytsdk/adrctl-go/common"
)
func main() {
ctx := context.Background()
// 搜索局域网设备(超时3秒)
devices, err := common.Search(ctx, 3)
if err != nil {
fmt.Printf("搜索失败: %v\n", err)
return
}
for _, d := range devices {
fmt.Printf("设备: IP=%s, ID=%s, Type=%s\n", d.IP, d.ID, d.Type)
}
}
package main
import (
"context"
"fmt"
"atomgit.com/mytsdk/adrctl-go/device"
)
func main() {
ctx := context.Background()
// 创建设备控制器
ctrl := device.New("192.168.1.100")
// 获取设备内的安卓云机列表
res, err := ctrl.ListAndroid(ctx)
if err != nil {
fmt.Printf("获取失败: %v\n", err)
return
}
for _, a := range res.Androids {
fmt.Printf("云机: %s, 状态: %s, IP: %s\n", a.Name, a.Status, a.Ip)
}
}
package main
import (
"context"
"fmt"
"atomgit.com/mytsdk/adrctl-go/pkg"
)
func main() {
ctx := context.Background()
// 创建客户端(设备IP + 安卓云机ID)
client := pkg.New("192.168.1.100", "your-android-id")
// 列出用户应用
res, err := client.ListPackage(ctx, &pkg.ListPackageReq{Type: pkg.PackageTypeUser})
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
for _, p := range res.Packages {
fmt.Printf("应用: %s, 启用: %v\n", p.PackageName, p.Enabled)
}
// 禁用应用
_, err = client.SetEnabled(ctx, &pkg.SetEnabledReq{
PackageName: "com.example.app",
Enabled: false,
})
if err != nil {
fmt.Printf("禁用失败: %v\n", err)
}
// 导出应用 APK
exportRes, err := client.Export(ctx, &pkg.ExportReq{
PackageName: "com.example.app",
})
if err != nil {
fmt.Printf("导出失败: %v\n", err)
return
}
fmt.Printf("APK路径: %v\n", exportRes.APKPaths)
}
package main
import (
"context"
"fmt"
"atomgit.com/mytsdk/adrctl-go/android"
)
func main() {
ctx := context.Background()
// 创建安卓云机控制器
ctrl := android.New("192.168.1.100", "device-id", 9082)
// 截图
img, err := ctrl.Snapshot(ctx, 80)
if err != nil {
fmt.Printf("截图失败: %v\n", err)
return
}
fmt.Printf("截图大小: %d bytes\n", len(img))
// 点击
err = ctrl.Tap(ctx, 500, 800)
if err != nil {
fmt.Printf("点击失败: %v\n", err)
}
// 设置剪贴板
err = ctrl.SetClipboard(ctx, "hello world")
if err != nil {
fmt.Printf("设置剪贴板失败: %v\n", err)
}
// 获取剪贴板
clipboard, err := ctrl.GetClipboard(ctx)
if err != nil {
fmt.Printf("获取剪贴板失败: %v\n", err)
return
}
fmt.Printf("剪贴板内容: %s\n", clipboard.Text)
// 设置代理
err = ctrl.SetProxy(ctx, &android.SetProxyReq{
IP: "192.168.1.100",
Port: 8080,
User: "test",
Pwd: "123456",
Type: 2,
})
if err != nil {
fmt.Printf("设置代理失败: %v\n", err)
}
// 查询代理状态
status, err := ctrl.GetProxyStatus(ctx)
if err != nil {
fmt.Printf("查询代理状态失败: %v\n", err)
return
}
fmt.Printf("代理状态: %d (%s)\n", status.Status, status.StatusText)
}
package main
import (
"context"
"fmt"
"atomgit.com/mytsdk/adrctl-go/file"
)
func main() {
ctx := context.Background()
// 创建文件管理客户端
client := file.New("192.168.1.100", "android-name")
// 列出文件
res, err := client.List(ctx, &file.ListReq{Path: "/sdcard"})
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
for _, f := range res.Files {
fmt.Printf("%s %s %s\n", f.Name, f.Size, f.Time)
}
}
# 列出应用
go run sample/pkg/main.go -ip 10.10.11.3 -id <安卓云机ID>
. ├── api/ │ ├── v1/ # API V1 接口(设备 81 端口) │ │ ├── api.go # 接口定义(DeviceV1) │ │ ├── client.go # 构造函数 │ │ ├── impl.go # 实现 │ │ └── list_test.go # 测试 │ └── v3/ # API V3 接口(设备 8000 端口) │ ├── api.go # 接口定义(DeviceV3) │ ├── client.go # 构造函数 │ ├── impl.go # 实现 │ ├── *_container.go # 容器操作 │ └── *_test.go ├── android/ # 安卓云机 API 接口(34 个接口) │ ├── api.go # 接口定义和请求/响应结构体 │ ├── controller.go # Controller 结构体、构造函数、HTTP 辅助方法 │ ├── docmd.go # DoCmd 执行命令 │ ├── download.go # Download 下载文件、GetClipboard/SetClipboard 剪贴板 │ ├── proxy.go # GetProxyStatus/SetProxy/StopProxy/SetProxyDomains 代理相关 │ ├── sms.go # ReceiveSMS 接收短信、UploadKeybox 上传证书 │ ├── adb.go # GetADBStatus/EnableADBRoot/DisableADBRoot ADB 权限 │ ├── backup.go # BackupApp/RestoreApp 应用备份恢复 │ ├── camera.go # StartCamera/StopCamera/SetCameraSource 摄像头 │ ├── background.go # GetBackgroundApps/AddBackgroundApp/RemoveBackgroundApp/UpdateBackgroundApps 后台保活 │ ├── keyshield.go # EnableKeyShield/DisableKeyShield 按键屏蔽 │ ├── install.go # InstallApks 批量安装 │ ├── version.go # QueryVersion 版本查询 │ ├── snapshot.go # Snapshot 截图 │ ├── click.go # AutoClick/Tap/TouchDown/TouchUp/TouchMove/KeyPress 自动点击 │ ├── upload.go # UploadFile/UploadFileFromURL 文件上传 │ ├── container.go # GetContainerInfo 容器信息 │ ├── calllog.go # AddCallLog 通话记录 │ ├── location.go # RefreshLocation 刷新定位 │ ├── googleid.go # SetGoogleID/GenerateGoogleID 谷歌 ID │ ├── module.go # CheckModule/InstallModule/UninstallModule 模块管理 │ ├── contact.go # AddContact 添加联系人 │ ├── root.go # GetRootApps/SetRootApp Root 授权 │ ├── bootstart.go # GetBootStartApps/SetBootStartApps 开机启动 │ └── locale.go # SetIPLocation/SetLanguageCountry 语言定位 ├── common/ # 公共工具 │ ├── search.go # 设备发现(UDP 广播) │ └── http.go # HTTP 工具 ├── device/ # 设备管理 │ ├── api.go # 接口定义(Device, Android) │ ├── device.go # 设备控制器实现 │ ├── android/ # 安卓云机控制器实现 │ └── device_test.go ├── pkg/ # 安卓应用管理 │ ├── api.go # 接口和类型定义 │ ├── controller.go # Controller 实现 │ ├── listpackage.go # 列出应用 │ ├── cleardata.go # 清除数据 │ ├── setenabled.go # 启用/禁用应用 │ ├── uninstall.go # 卸载应用 │ ├── export.go # 导出 APK │ └── *_test.go ├── file/ # 安卓文件管理 │ ├── api.go # 接口定义 │ ├── controller.go # Controller 实现 │ ├── list.go # 获取文件列表 │ ├── download.go # 下载文件 │ ├── upload.go # 上传文件 │ ├── delete.go # 删除文件 │ ├── mkdir.go # 创建目录 │ ├── utils.go # 工具函数 │ └── utils_test.go └── sample/cli/ # 交互式 CLI 示例 └── main.go
// Android 安卓云机 API 接口
type Android interface {
// 基础操作
DoCmd(ctx context.Context, cmdline string) (string, error)
Download(ctx context.Context, path string) ([]byte, error)
// 剪贴板
GetClipboard(ctx context.Context) (*ClipboardRes, error)
SetClipboard(ctx context.Context, text string) error
// 代理
GetProxyStatus(ctx context.Context) (*ProxyStatusRes, error)
SetProxy(ctx context.Context, req *SetProxyReq) error
StopProxy(ctx context.Context) error
// 截图和点击
Snapshot(ctx context.Context, quality int) ([]byte, error)
Tap(ctx context.Context, x, y int) error
KeyPress(ctx context.Context, code int) error
// 摄像头
StartCamera(ctx context.Context, path string) error
SetCameraSource(ctx context.Context, req *CameraSourceReq) error
// 更多接口...(共34个)
}
// Device 设备接口
type Device interface {
ListAndroid(ctx context.Context) (res *ListAndroidRes, err error)
DoCmd(ctx context.Context, req *DoCmdReq) (res *DoCmdRes, err error)
GetAndroid(ctx context.Context, id string) (android.Android, error)
GetAPIPort(ctx context.Context, id string) (int, error)
GetAndroidName(ctx context.Context, id string) (string, error)
}
// android.Android 安卓云机接口
type Android interface {
DoCmd(ctx context.Context, cmdline string) (string, error)
}
// Pkg 包管理接口
type Pkg interface {
ListPackage(ctx context.Context, req *ListPackageReq) (res *ListPackageRes, err error)
ClearData(ctx context.Context, req *ClearDataReq) (res *ClearDataRes, err error)
SetEnabled(ctx context.Context, req *SetEnabledReq) (res *SetEnabledRes, err error)
Uninstall(ctx context.Context, req *UninstallReq) (res *UninstallRes, err error)
Export(ctx context.Context, req *ExportReq) (res *ExportRes, err error)
}
// File 文件管理接口
type File interface {
List(ctx context.Context, req *ListReq) (res *ListRes, err error)
Download(ctx context.Context, req *DownloadReq) (data []byte, err error)
Upload(ctx context.Context, req *UploadReq) (res *UploadRes, err error)
Delete(ctx context.Context, req *DeleteReq) (res *DeleteRes, err error)
Mkdir(ctx context.Context, req *MkdirReq) (res *MkdirRes, err error)
}
项目包含一个交互式命令行工具,提供类似 Shell 的操作体验。
cd sample/cli
go run main.go
详见 sample/README.md 和 sample/cli/README.md
设备控制器会自动检测设备类型并选择合适的 API 版本。
测试文件中使用占位符代替真实设备信息:
// 请替换为实际的设备IP和ID进行测试
ctrl := device.New("192.168.1.100")
client := pkg.NewV1("192.168.1.100", "your-android-id")
运行测试:
go test ./...
MIT License