一、使用场景
在Windows中需要控制安卓设备,在命令行操作不方便,集成在一个应用程序中
二、ADB类
为了方便,写了一个ADB类,通过这个类方法来实现adb的各个命令
完整源码
adb.h
#ifndef ADB_H
#define ADB_H
#include <QObject>
#include <QProcess>
// ADB 类继承自 QObject,用于处理 ADB 相关操作
class ADB : public QObject
{
Q_OBJECT
public:
// 构造函数和析构函数
explicit ADB(QObject *parent = nullptr);
~ADB();
// 方法声明:启动 ADB shell,获取 root 权限,执行 shell 命令,
// 执行 ADB 命令,停止应用程序,退出 shell
void startShell();
void root();
void executeShellCommand(const QString &command);
void executeADBCommand();
void executeStop();
void exitShell();
signals:
// 信号:命令输出,命令错误,root 完成
void commandOutput(const QString &output);
void commandError(const QString &error);
void rootCompleted(); // root 完成信号
private slots:
// 私有槽函数:读取标准输出和标准错误
void readProcessOutput();
void readProcessError();
private:
QProcess *process; // QProcess 对象,用于处理进程
};
#endif // ADB_H
adb.c
#include "adb.h"
#include <QDebug>
// 构造函数:初始化 QProcess 对象,并连接信号和槽
ADB::ADB(QObject *parent) : QObject(parent)
{
process = new QProcess(this);
connect(process, &QProcess::readyReadStandardOutput, this, &ADB::readProcessOutput);
connect(process, &QProcess::readyReadStandardError, this, &ADB::readProcessError);
}
// 析构函数:删除 QProcess 对象
ADB::~ADB()
{
delete process;
}
// 启动 ADB shell
void ADB::startShell()
{
process->start("adb", QStringList() << "shell");
}
// 获取 root 权限
void ADB::root()
{
process->start("adb", QStringList() << "root");
}
// 退出 ADB shell
void ADB::exitShell()
{
if (process->state() == QProcess::Running) {
executeShellCommand("exit");
} else {
qDebug() << "ADB shell is not running.";
}
}
// 执行 shell 命令
void ADB::executeShellCommand(const QString &command)
{
if (process->state() == QProcess::Running) {
process->write(command.toUtf8() + "\n");
} else {
qDebug() << "ADB shell is not running.";
}
}
// 读取标准输出并发射信号
void ADB::readProcessOutput()
{
QString output = process->readAllStandardOutput();
emit commandOutput(output);
// 检查输出以确定 root 命令是否成功
if (output.contains("restarting adbd as root")) {
emit rootCompleted();
}
}
// 读取标准错误并发射信号
void ADB::readProcessError()
{
QString error = process->readAllStandardError();
emit commandError(error);
}
// 执行 ADB 命令以启动应用程序
void ADB::executeADBCommand()
{
// 设置命令和参数
process->setProgram("adb");
process->setArguments(QStringList() << "shell" << "am" << "start" << "-n" << "com.zhx.camera_zhx/.MainActivity");
// 启动进程
process->start();
}
// 停止应用程序
void ADB::executeStop()
{
if (process->state() == QProcess::Running) {
process->terminate();
process->waitForFinished();
}
QStringList arguments;
arguments << "shell" << "am force-stop" << "com.zhx.camera_zhx";
process->start("adb", arguments);
}
三、在 Qt 中使用 ADB
创建 ADB 对象:在你的主窗口或其他类中创建 ADB 对象。
ADB *adb = new ADB(this);
启动 ADB shell:调用
startShell()
方法adb->startShell();
获取 root 权限:调用
root()
方法。adb->root();
执行 shell 命令:调用
executeShellCommand()
方法。adb->executeShellCommand("ls");
执行 ADB 命令以启动应用程序:调用
executeADBCommand()
方法。adb->executeADBCommand();
停止应用程序:调用
executeStop()
方法。adb->executeStop();
退出 ADB shell:调用
exitShell()
方法。adb->exitShell();