‘壹’ 用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 ,问题就解决了!
‘贰’ 用Java调用adb,不出来是为什么
你需要在前面加上cmd /c
即exec中执行的命令应该是cmd /c adb shell input ...
‘叁’ 利用adb命令打开usb调试
打开Android手机的USB调试对于使用豌豆夹、调试程序等来说很重要。下面说说如何用代码自动打开USB调试。先分析USB调试的相关源代码。
在 packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java 找到关于 USB Debug Enable 的代码:
[java]view plain
Settings.Secure.putInt(getContentResolver(),Settings.Secure.ADB_ENABLED,0);
此文件中,将根据用户设置将其值保存到 Settings 数据库中。别处将根据其值动态变化做出相应动作
经搜索,在 frameworks/base/services/java/com/android/server/NotificationManagerService.java 中存在利用该值判断是否在状态栏中进行通知。代码如下:
别处将根据其值动态变化做出相应动作如状态栏消息提示。
[java]view plain
voidobserve(){
ContentResolverresolver=mContext.getContentResolver();
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ADB_ENABLED),false,this);
update();
}
@OverridepublicvoidonChange(booleanselfChange){
update();
}
publicvoipdate(){
ContentResolverresolver=mContext.getContentResolver();
mAdbEnabled=Settings.Secure.getInt(resolver,
Settings.Secure.ADB_ENABLED,0)!=0;
updateAdbNotification();
}
通过分析代码,我们可以实现用程序自动打开usb调试了。
[java]view plain
booleanenableAdb=(Settings.Secure.getInt(getContentResolver(),Settings.Secure.ADB_ENABLED,0)>0);
if(!enableAdb){
Settings.Secure.putInt(getContentResolver(),Settings.Secure.ADB_ENABLED,1);
}
马上进行运行,会出现异常,通过Logcat可以看到没有权限。android.permission.WRITE_SECURE_SETTINGS是不允许普通程序来执行,必须要有系统的签名或放到
/system/app下。
(1)、在AndroidManifest.xml加上两个权限
[html]view plain
<uses-permissionandroid:name="android.permission.WRITE_SETTINGS"></uses-permission>
<uses-permissionandroid:name="android.permission.WRITE_SECURE_SETTINGS"/>
可以把程序push到/system/app,并对这个apk加上0644的权限,重启手机,可以发现usb调试自动打开了。
‘肆’ java代码启动android adb命令 报错
先保证你的adb能使用吧,再调试代码。
‘伍’ ADB命令必须安装JDK吗
JDK在windows系统下的环境变量配置方法如下(Win7):
计算机-> 属性->高级->环境变量, 在系统变量中
1. 新建 变量名:JAVA_HOME 变量值 C:\Program Files\Java\jdk1.7.0_11(以本机的jdk安装路径为准)
2. 新建 变量名:classpath 变量值 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
3.编辑变量名Path, 变量值添加:%JAVA_HOME%\bin;
以上配置完成后,保存。 运行cmd,在控制台中输入javac 回车, 如果没有提示命令语法错误,就证明配置OK!
设置adb的环境变量:
计算机-> 属性->高级->环境变量, 在系统变量中
1. 新建 变量名:Android 变量值 C:\.....android SDK路径\sdk\platform-tools; C:\.....android SDK路径\sdk\tools;(以本机的android sdk安装路径为准)
2. 编辑变量名Path, 变量值添加:%android%;
‘陆’ 如何使用adb命令定位测试机当前运行的java类
因为你电脑上有adb这个程序,所以可以通过java调用。而安卓上没有这个程序,所以没法。除非你可以找到一个android版的adb
‘柒’ java for循环里怎么调用adb keyevent 命令
android中执行shell命令有两种方式: 1.直接在代码中用java提供的Runtime 这个类来执行命令,以下为完整示例代码。
‘捌’ 如何在android里面执行adb shell命令
ADB接口的作用主要是让电脑等其它设备控制安卓系统的,所以,称为“中间桥”; 不是为安卓自已用的,自已可直接执行称为SHELL,这与ADB无关。 所以安卓JAVA不一定有封装的ADB类。电脑上有ADB服务程序,端口5037, 它是中间程序,与安卓系统上守护进程(Daemon)通讯。 如果要在自已的手机上应该也能执行adb命令,应该直接跟守护进程 (Daemon)通讯了。网络上可以搜到的方法并不满意。 楼主用exec执行CMD命令,这已不是ADB接口了,这是系统的SHELL了!!! 自已用socket/tcp直接发命令效果不知怎样,地址用127.0.0.1, 安卓daemon进程的端口 5555 是奇数开始。
‘玖’ 我使用Java可以调用adb的命令 而使用Android想把类似adb shell input这样的一个命令加进去当时不能实现
因为你电脑上有adb这个程序,所以可以通过java调用。
而安卓上没有这个程序,所以没办法。除非你可以找到一个android版的adb
‘拾’ 如何在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 List<String> 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 ArrayList<String>();
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());
}
}
}