logo
1
0
WeChat Login
sky<kongyang@petalmail.com>
feat: 添加应用管理示例并更新文档

魔云腾 Go SDK

Go Version License

魔云腾设备管理 Go SDK,提供设备发现、安卓云机管理、应用管理、文件管理等功能。

功能特性

  • 🔍 设备发现 - 自动搜索局域网内的魔云腾设备
  • 📱 安卓云机管理 - 创建、启动、停止、删除安卓云机
  • 📦 应用管理 - 列出、启用/禁用、卸载、导出应用
  • 📁 文件管理 - 浏览、上传、下载文件
  • 🖥️ 交互式 CLI - 提供类 Shell 的命令行交互体验
  • 🤖 安卓 API - 34 个接口(截图、点击、剪贴板、代理、摄像头等)

安装

go get atomgit.com/mytsdk/adrctl-go

快速开始

1. 搜索设备

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

2. 管理安卓云机

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

3. 应用管理 (pkg)

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

4. 安卓云机 API (android)

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

5. 文件管理 (file)

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

示例代码

pkg 示例

# 列出应用 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

核心接口

安卓云机 API (android)

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

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

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

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

交互式 CLI

项目包含一个交互式命令行工具,提供类似 Shell 的操作体验。

cd sample/cli go run main.go

详见 sample/README.mdsample/cli/README.md

API 版本说明

  • V1 - 设备 81 端口接口(安卓云机管理、文件操作)
  • V3 - 设备 8000 端口接口(设备信息、容器列表、镜像管理等)

设备控制器会自动检测设备类型并选择合适的 API 版本。

测试

测试文件中使用占位符代替真实设备信息:

// 请替换为实际的设备IP和ID进行测试 ctrl := device.New("192.168.1.100") client := pkg.NewV1("192.168.1.100", "your-android-id")

运行测试:

go test ./...

相关链接

许可证

MIT License