• 注册
当前位置:1313e > java >正文

java代码执行adb java代码执行linux命令

用Java调用adb,不出来是为什么

你需要在前面加上cmd /c

即exec中执行的命令应该是cmd /c adb shell input ...

java通过exec条用cmd执行adb无效

"cmd.exe /c adb devices"

java的Runtime环境已经是命令行模式,类似已经打开cmd.exe 所以,

执行后续命令无需加上 cmd.exe,命令修改为:

Runtime.getRuntime().exec("adb devices")

java for循环里怎么调用adb keyevent 命令

android中执行shell命令有两种方式: 1.直接在代码中用java提供的Runtime 这个类来执行命令,以下为完整示例代码。

如何在Java代码中调用adb命令

代码如下:

package com.symbio.ltp.adb;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.util.ArrayList;

import java.util.List;

import com.symbio.ltp.model.ConfigPropertiesData;

import com.symbio.ltp.util.Log;

public class ShellCommand {

private String name;

private Process process;

private BufferedWriter writer;

private BufferedReader reader;

private BufferedReader errorReader;

private ListString list;

private String[] returnValue;

public ShellCommand(String name) {

this.name = name;

}

public String getName() {

return name;

}

public Process getProcess() {

return process;

}

public BufferedWriter getOutputWriter() {

return writer;

}

public BufferedReader getInputReader() {

return reader;

}

public BufferedReader getErrorReader() {

return errorReader;

}

public boolean start(String cmd) {

try {

process = Runtime.getRuntime().exec(cmd);

writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));

reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));

} catch (IOException e) {

Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());

return false;

}

return true;

}

public boolean exec(String cmd) {

String line;

try {

writer.write(cmd + "\n");

writer.flush();

while((line = reader.readLine()) != null) {

Log.debug(line);

if(line.equals(ConfigPropertiesData.ltp_success)) {

return true;

} else if(line.equals(ConfigPropertiesData.ltp_fail)) {

return false;

}

}

} catch (IOException e) {

Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());

return false;

}

return true;

}

public String [] execReturn(String cmd) {

String line;

list = new ArrayListString();

try {

writer.write(cmd + "\n");

writer.flush();

line = reader.readLine();

while((line = reader.readLine()) != null) {

if(line.length()0 !(line.startsWith("#"))){

Log.debug(line);

list.add(line);

if(line.equals(ConfigPropertiesData.ltp_success)) {

break;

} else if(line.equals(ConfigPropertiesData.ltp_fail)) {

break;

}

}

}

int size = list.size();

returnValue = new String[size];

for (int i = 0; i size; i++) {

returnValue[i] = list.get(i);

}

} catch (IOException e) {

Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());

return null;

}

return returnValue;

}

public void terminate() {

try {

writer.write(0x03);

writer.flush();

} catch (IOException e) {

Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());

}

}

}

用Java调用adb出现问题

①、重启

ADB 响应失败,最先想到的就是重启工具了

不过重启一般都没有用,建议跳过该方法哈哈

②、使用 cmd 工具重启 ADB 进程

关掉所有工具

快捷键 Windows + R,输入 cmd

进入 AndroidStudio 的 sdk 工具文件夹 

以我的AndroidStudio安装在D盘为例

其中,cd 命令为打开某文件夹,这里我们需要打开 sdk 中的 platform-tools 文件夹

杀死并启动 adb 进程

其中 adb kill-server 为杀死 adb 进程 

adb start-server 为启动 adb 进程

若显示 上图中的 daemon started successfully 那么恭喜你,你的问题解决了,启动开发工具就可以正常使用了

③、关闭 adb 被占用的进程

如果使用第2种方法的时候,最终显示 failed to start deamon 那么,你就需要用到本方法了

关掉所有工具

快捷键 Windows + R,输入 cmd

输入netstat -aon|findstr “5037”

可以看到进程号为9460的进程(这个进程号因机器和时间而异)在占用5037端口(adb需要使用此端口)

打开任务管理器,选择“进程”选项卡,点击选项栏“查看-选择列…”,勾选“PID(进程标识符)”,点确定。会看到每个进程都会显示它们的PID了。找到进程号为9406的进程,结束这个进程。 

在cmd中,重新 adb start-server,可以看到成功启动

最后启动开发工具,就可以正常使用了

④、更改 Genymotion 使用的 ADB 路径

在第3种方法中,我们在任务管理器里有时是无法关闭某进程的,它会不断自动重启,比较顽固

这就需要放大招了:

打开 Genyotion 模拟器,依次选择 Settings、ADB 

选中上图中的 Use Custom Android SDK tools

点击 Browse 选择 AndroidStudio 所使用的 SDK 的文件夹

启动 Genymotion ,启动 AndroidStudio,正常使用

该解决方法对应的原因就是,Genymotion 本身有自带的 adb 工具,启动时会打开自带的 adb。

但是 Genymotion 和 AS 一起使用的时候,两者都会启动一份 adb ,所以这里我们让两者都启动 AS 的 adb ,问题就解决了!

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录