1. 程式人生 > >Android自動化之adb模擬操作(可實現按鍵精靈和手機輸入法)

Android自動化之adb模擬操作(可實現按鍵精靈和手機輸入法)

最近因為工作需要,需要實現某一應用自動操作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
感興趣的也可以自己實現一下。