docs: 更新包文档,匹配 ADB 隧道架构和当前 API

This commit is contained in:
zyj
2026-03-10 15:52:38 +08:00
parent 8a0b1e6e98
commit 21b0862e9f
8 changed files with 188 additions and 91 deletions

View File

@@ -1,5 +1,8 @@
// Package services 提供了 UIAutomator2 服务的安装和部署功能。
//
// 本包负责将 UIAutomator2 相关的资源文件u2.jar、APK
// 推送到 Android 设备并完成安装。
// 本包负责将 UIAutomator2 相关的资源文件推送到 Android 设备并完成安装:
// - InstallServiceJar推送 u2.jar 到设备(自动检查设备端是否已存在,避免重复推送)
// - InstallServiceApk推送并安装 UIAutomator2 APK
//
// 通常无需直接调用本包libs.NewDevice() 会自动完成服务安装和启动。
package services

View File

@@ -2,22 +2,17 @@ package services
import (
"fmt"
"os"
"path/filepath"
"strings"
"time"
"github.com/zhuy1228/go-mobile-uiautomator/adb"
"github.com/zhuy1228/go-mobile-uiautomator/assets"
)
// 默认路径常量
// 设备端路径常量
const (
// DefaultJarLocal 默认本地 JAR 路径
DefaultJarLocal = "assets/u2.jar"
// DefaultJarRemote 默认设备端 JAR 路径
DefaultJarRemote = "/data/local/tmp/u2.jar"
// DefaultApkLocal 默认本地 APK 路径
DefaultApkLocal = "assets/app-uiautomator.apk"
// DefaultApkRemote 默认设备端 APK 临时路径
DefaultApkRemote = "/data/local/tmp/app-uiautomator.apk"
)
@@ -39,63 +34,42 @@ func fileExistsOnDevice(addr, serial, remotePath string) bool {
return strings.TrimSpace(string(out)) == remotePath
}
// InstallServiceJar 将 u2.jar 推送到设备的 /data/local/tmp/ 目录
// InstallServiceJar 将内嵌的 u2.jar 推送到设备的 /data/local/tmp/ 目录
// JAR 文件通过 go:embed 编译到二进制中,使用者无需关心文件路径
//
// addr 为 ADB 服务器地址serial 为设备序列号
// localPath 为本地 JAR 路径,传空字符串则使用默认路径
// force 为 true 时跳过存在性检查,强制推送
func InstallServiceJar(addr, serial, localPath string, force bool) error {
if localPath == "" {
localPath = DefaultJarLocal
}
// 检查本地文件是否存在
if _, err := os.Stat(localPath); os.IsNotExist(err) {
return fmt.Errorf("本地 JAR 文件不存在: %s", localPath)
}
func InstallServiceJar(addr, serial string, force bool) error {
// 非强制模式下,检查设备端文件是否已存在
if !force && fileExistsOnDevice(addr, serial, DefaultJarRemote) {
return nil // 文件已存在,跳过推送
}
_, err := adb.PushFile(addr, serial, localPath, DefaultJarRemote, 0644, false)
_, err := adb.PushData(addr, serial, assets.JarData, DefaultJarRemote, 0644, false)
if err != nil {
return fmt.Errorf("推送 u2.jar 失败: %w", err)
}
return nil
}
// InstallServiceApk 将 UIAutomator2 APK 推送到设备并安装
// InstallServiceApk 将内嵌的 UIAutomator2 APK 推送到设备并安装
// APK 文件通过 go:embed 编译到二进制中,使用者无需关心文件路径
//
// addr 为 ADB 服务器地址serial 为设备序列号
// localPath 为本地 APK 路径,传空字符串则使用默认路径
// force 为 true 时跳过存在性检查,强制推送
func InstallServiceApk(addr, serial, localPath string, force bool) error {
if localPath == "" {
localPath = DefaultApkLocal
}
abs, err := filepath.Abs(localPath)
if err != nil {
return fmt.Errorf("解析 APK 路径失败: %w", err)
}
// 检查本地文件是否存在
if _, err := os.Stat(abs); os.IsNotExist(err) {
return fmt.Errorf("本地 APK 文件不存在: %s", abs)
}
func InstallServiceApk(addr, serial string, force bool) error {
// 非强制模式下,检查设备端文件是否已存在
if !force && fileExistsOnDevice(addr, serial, DefaultApkRemote) {
// 文件已存在,跳过推送,但仍需确保已安装
} else {
_, err = adb.PushFile(addr, serial, abs, DefaultApkRemote, 0644, false)
_, err := adb.PushData(addr, serial, assets.ApkData, DefaultApkRemote, 0644, false)
if err != nil {
return fmt.Errorf("推送 APK 失败: %w", err)
}
}
// 在设备上安装 APK覆盖安装
_, err = adb.InstallApkOnDevice(addr, serial, DefaultApkRemote, "-r", false)
_, err := adb.InstallApkOnDevice(addr, serial, DefaultApkRemote, "-r", false)
if err != nil {
return fmt.Errorf("安装 APK 失败: %w", err)
}