Android自動化之adb模擬操作(可實現按鍵精靈和手機輸入法)
阿新 • • 發佈:2019-02-06
最近因為工作需要,需要實現某一應用自動操作android手機的業務場景。網上查了下,發現按鍵精靈早就有了Android版本,於是研究了下它。
我們知道,手機連線電腦,在電腦上輸入adb命令是可以實現安裝應用、解除安裝應用、monkey等事件的,甚至可以指定點選螢幕某點、或者操作某按鍵的行為。在android應用裡,也可以執行adb命令,因此,這些操作是可以不借助電腦、直接在某一android應用裡實現的。
按鍵精靈就是通過該技術實現的。
Android上執行adb命令
首先,應用執行adb命令需要先進入su賬戶;而進入su賬戶,需要手機已被完全root過。類似於在PC上adb shell之後的su(超級管理員)。
獲取root許可權
/**
* 應用程式執行命令獲取 Root許可權,裝置必須已破解(已Root過,獲得ROOT許可權)
* @return 應用程式是/否獲取Root許可權
*/
public static boolean getRootAhth() {
OutputStream os = null;
try {
//請求進入su賬戶,類似PC端adb shell之後的su命令。同時,獲取與之相關的輸出流
os = Runtime.getRuntime().exec("su").getOutputStream();
//退出su
os.write(("exit\n").getBytes());
os.flush();
//上述命令執行成功,則進入su賬戶成功,具備進入su的能力,說明已經獲取到了root許可權
return true;
} catch (Exception e) {
System.out.println("adb命令執行失敗,錯誤原因:" + e.getMessage());
return false;
} finally {
try {
if (os != null ) {
os.close();
}
} catch (Exception e) {
}
}
}
如果之前沒為應用分配root許可權,到系統裡為它分配root許可權。以小米手機(MIUI系統)為例,到“安全中心”–“授權管理”–“ROOT許可權管理”中,找到你自己的應用,為它分配root許可權。
執行adb命令
/**執行adb命令,需要已經為應用分配過root許可權
* @param adbCommand
*/
public static void execAdb(String adbCommand) {
//簡單有效,直接執行三條條adb命令
// try {
// Runtime.getRuntime().exec("su");
// Runtime.getRuntime().exec(adbCommand);
// Runtime.getRuntime().exec("exit\n");
// } catch (Exception e1) {
// e1.printStackTrace();
// }
//或者用下面方式
OutputStream os = null;
try {
//獲取與之相關的輸出流
os = Runtime.getRuntime().exec("su").getOutputStream();
os.write(adbCommand.getBytes());
//退出su
os.write(("exit\n").getBytes());
os.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
} catch (Exception e) {
}
}
}
adb命令執行注意點
獲取執行命令所需的OutputStream 需要以鏈式呼叫的方式來獲取,分兩行寫的非鏈式呼叫會導致部分命令不生效。
有效寫法:
os = Runtime.getRuntime().exec("su").getOutputStream();
無效寫法:
process = Runtime.getRuntime().exec("su");
os = process.getOutputStream();
常用adb命令總結
//在IO流中輸入命令,需要加"\n",因為見到回車才會執行命令;
//如果直接用Runtime.getRuntime().exec(adbCommand)來執行,則不必加回車符;
//點選螢幕上的一點,eg:這點的畫素座標是(100,100)
public String AdbTap = "input tap 100 100\n";
/**
* 實現滑動操作,前兩個引數是開始座標,接下來兩個是終點座標,最後一個是持續時間。
* 解釋參考:http://blog.csdn.net/u012912435/article/details/51483309
* 可以用來模擬長按,原理:在小的距離內,在較長的持續時間內進行滑動,最後表現出來的結果就是長按動作。
*/
public String AdbSwipe = "input swipe 500 500 501 501 2000\n";
//按下按鍵,eg:該按鍵的按鍵值是4(系統的返回鍵)。按鍵值參考https://www.cnblogs.com/sharecenter/p/5621048.html
public String AdbKeyevent = "input keyevent 4\n";
//輸入文字,eg:文字內容是1234567890
public String AdbText = "input text 1234567890\n";
發散思維
另外,我們還可以單純的用”input keyevent keycode”命令來實現一款安卓版手機輸入法,當然很不實用就是了,因為adb命令的執行是需要時間的,這種方式開發出來的輸入法必定互動很差。而且,輸入法有專門相關的類,這個類叫InputMethodService,可以參考:
http://blog.csdn.net/mfzabc/article/details/54894875
感興趣的也可以自己實現一下。