实现了一个uiautomator玩玩

由于android sdk monitor里面uiautomator在高版本已经打不开了,然后引入了以下思考

1. PC端独立编译

在github找到了以下项目

github.com/TarCV/uiaut...

2. 自己实现一个不需要引入依赖的uiautomator

找到一个adb shell命令,可以用于生成view tree信息xml

cmd 复制代码
adb shell uiautomator dump
adb pull /sdcard/window_dump.xml /Users/zjw/IdeaProjects/untitled/src/window_dump.xml

然后就是写代码解析Node根据坐标反向生成UI

代码逻辑就交给trae ai实现了 我稍微润色一下 ai监工实锤了-。-

java 复制代码
import javax.swing.*;
import java.awt.*;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

//命令行 adb shell uiautomator dump
// adb pull /sdcard/window_dump.xml /Users/zjw/IdeaProjects/untitled/src/window_dump.xml
public class Test {
    public static void main(String[] args) {
        JFrame frame = new JFrame("手机界面布局图");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // 创建自定义面板
        JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                drawLayout(g);
            }
        };
        
        // 设置面板大小为实际内容大小
        panel.setPreferredSize(new Dimension(1080, 2400));
        
        // 创建滚动面板
        JScrollPane scrollPane = new JScrollPane(panel);
        scrollPane.setPreferredSize(new Dimension(540, 1200));
        
        // 设置滚动条策略
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        
        // 启用滚轮滚动
        scrollPane.setWheelScrollingEnabled(true);
        
        frame.add(scrollPane);
        frame.pack();
        frame.setLocationRelativeTo(null); // 窗口居中显示
        frame.setVisible(true);
    }
    
    private static void drawLayout(Graphics g) {
        try {
            File inputFile = new File("src/window_dump.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(inputFile);
            doc.getDocumentElement().normalize();
            
            // 获取所有node元素
            NodeList nodeList = doc.getElementsByTagName("node");
            
            // 遍历所有节点
            for (int i = 0; i < nodeList.getLength(); i++) {
                Element element = (Element) nodeList.item(i);
                String bounds = element.getAttribute("bounds");
                if (!bounds.isEmpty()) {
                    // 解析bounds字符串 [x1,y1][x2,y2]
                    bounds = bounds.replace("][", ",").replace("[", "").replace("]", "");
                    String[] coordinates = bounds.split(",");
                    int x1 = Integer.parseInt(coordinates[0]) / 2;
                    int y1 = Integer.parseInt(coordinates[1]) / 2;
                    int x2 = Integer.parseInt(coordinates[2]) / 2;
                    int y2 = Integer.parseInt(coordinates[3]) / 2;
                    
                    // 绘制布局占位背景
                   // g.setColor(new Color(0, 0, 255, 30));
                    //g.fillRect(x1, y1, x2 - x1, y2 - y1);
                    //绘制布局边框
                    g.setColor(new Color(255, 0, 0, 128));
                    g.drawRect(x1, y1, x2 - x1, y2 - y1);
                    
                    // 绘制文本
                    String text = element.getAttribute("text");
                    if (!text.isEmpty()) {
                        g.setColor(Color.BLACK);
                        g.drawString(text, x1 + 5, y1 + 15);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

进一步甚至可以把调用adb shell命令写进去,太懒了这一步就省略了

看看效果

是不是有系统工具那味了,hhh

相关推荐
三少爷的鞋8 小时前
Java 线程自上而下,Kotlin 协程自下而上
android
好的佩奇9 小时前
Dart 之增强枚举
android·flutter·dart
梦影_10 小时前
MySQL进阶教程(五)—— SQL调优(下)
android·大数据·数据库·后端·sql·mysql·database
好的佩奇12 小时前
蓝牙之无线电与通信距离
android·flutter·蓝牙
vilya13 小时前
我把一套完整的 Python Agent 运行时塞进手机 APK:依赖闭包、Rust 轮子和三个真机坑
android
呆呆敲代码的小Y14 小时前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题
思想觉悟16 小时前
SEAndroid实战
android·linux·c++
思想觉悟16 小时前
Aosp开发磨刀石之ADB速查
android·c++
应用市场19 小时前
用本机跑的开源音乐模型,给安卓小游戏做 20 秒无缝循环背景音乐
android·python·游戏开发·soundpool·音频处理
企业数字化笔记19 小时前
表单发布前怎么验收?版本引用、字段兼容和历史数据回归
android·数据挖掘·回归