『壹』 用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());
}
}
}