ADBKeyBoard:通過ADB實現Android虛擬鍵盤輸入

項目描述

ADBKeyBoard 是一個創新的Android虛擬鍵盤輸入法。它通過接收系統廣播意圖(Broadcast Intents)來執行輸入命令,使得用户能夠使用ADB(Android Debug Bridge)直接向Android設備發送文本輸入。該項目主要解決了標準ADB input 命令無法輸入Unicode字符(如中文、表情符號等)的問題,是自動化測試、設備批量操作和特殊字符輸入場景的理想工具。

功能特性

  • ADB驅動的文本輸入:通過ADB命令直接發送任意文本到當前激活的輸入框。
  • 完整的Unicode字符支持:突破了原生adb shell input text命令的限制,可以輸入包括中文、日文、韓文及Emoji在內的所有Unicode字符。
  • 多種輸入模式
    • 直接文本輸入 (ADB_INPUT_TEXT)。
    • Base64編碼文本輸入 (ADB_INPUT_B64),用於解決高版本Android系統的兼容性問題。
    • 發送鍵位事件碼 (ADB_INPUT_CODE),模擬物理按鍵(如刪除、回車)。
    • 發送編輯器動作 (ADB_EDITOR_CODE),如執行搜索、前往等動作。
    • 發送Unicode字符碼點 (ADB_INPUT_CHARS)。
    • 發送組合鍵(Meta鍵) (ADB_INPUT_MCODE),如Ctrl+A。
    • 清空文本 (ADB_CLEAR_TEXT)。
  • 便捷的ADB控制:提供完整的ADB命令來啓用、切換和重置輸入法。
  • 輕量級與易集成:APK體積小,通過廣播機制與系統交互,無需複雜的權限或後台服務。

安裝指南

方法一:直接安裝APK(推薦)

  1. 從項目的Release頁面下載最新的 ADBKeyboard.apk 文件。
    1. 連接Android設備並開啓USB調試模式。
    1. 執行以下命令進行安裝:
  2. ```bash
    
  3. adb install ADBKeyboard.apk
    
  4. ```
    

方法二:從源碼構建

  1. 克隆倉庫:
  2. ```bash
    
  3. git clone https://github.com/senzhk/ADBKeyBoard.git
    
  4. cd ADBKeyBoard
    
  5. ```
    
    1. 配置環境:
  6. *   設置 `ANDROID_HOME` 環境變量指向你的Android SDK路徑,例如:
    
  7.     ```bash
    
  8.     export ANDROID_HOME=$HOME/Android/Sdk
    
  9.     ```
    
  10. *   或者直接編輯項目根目錄下的 `local.properties` 文件,添加 `sdk.dir=/path/to/your/Android/Sdk`。
    
    1. 構建並安裝:
  11. ```bash
    
  12. ./gradlew installDebug
    
  13. ```
    

啓用鍵盤

安裝後,需要通過ADB或系統設置啓用並切換到此輸入法。

通過ADB啓用和切換

# 啓用ADBKeyBoard輸入法
adb shell ime enable com.android.adbkeyboard/.AdbIME
# 將ADBKeyBoard設置為當前默認輸入法
adb shell ime set com.android.adbkeyboard/.AdbIME

通過系統設置啓用: 進入設備的 設置 -> 系統 -> 語言和輸入法 -> 虛擬鍵盤,找到並啓用“ADBKeyBoard”。

使用説明

啓用ADBKeyBoard後,即可通過發送廣播意圖(Broadcast Intents)來控制輸入。

基礎使用示例

  1. 發送普通文本 (可能在高版本Android上失效):
  2. ```bash
    
  3. adb shell am broadcast -a ADB_INPUT_TEXT --es msg '你好嗎? Hello?'
    
  4. ```
    
  5. 發送Base64編碼的文本 (推薦,兼容性更好):
  6. ```bash
    
  7. # Mac/Linux
    
  8. adb shell am broadcast -a ADB_INPUT_B64 --es msg `echo -n '你好嗎? Hello?' | base64`
    
  9. # Windows (需藉助PowerShell或Python腳本處理Base64)
    
  10. ```
    
  11. 發送按鍵事件 (如刪除鍵,碼值67):
  12. ```bash
    
  13. adb shell am broadcast -a ADB_INPUT_CODE --ei code 67
    
  14. ```
    
  15. 發送編輯器動作 (如“前往”動作,碼值2):
  16. ```bash
    
  17. adb shell am broadcast -a ADB_EDITOR_CODE --ei code 2
    
  18. ```
    
  19. 發送Unicode字符碼點 (發送“:grinning_cat_with_smiling_eyes: Cat”):
  20. ```bash
    
  21. adb shell am broadcast -a ADB_INPUT_CHARS --eia chars '128568,32,67,97,116'
    
  22. ```
    
  23. 發送組合鍵 (如Ctrl + A):
  24. ```bash
    
  25. adb shell am broadcast -a ADB_INPUT_MCODE --es mcode '4096,29'
    
  26. ```
    
  27. 清空當前輸入框的所有文本:
  28. ```bash
    
  29. adb shell am broadcast -a ADB_CLEAR_TEXT
    
  30. ```
    

ADB輸入法管理命令

  • 列出所有可用輸入法:
    adb shell ime list -a
    
  • 切換回其他輸入法 (例如Swype):
    adb shell ime set com.nuance.swype.dtc/com.nuance.swype.input.IME
    
  • 重置為系統默認輸入法:
    adb shell ime reset
    

核心代碼

以下是項目核心類 AdbIME.java 的關鍵代碼片段,展示了廣播接收器的註冊和消息處理邏輯。

package com.android.adbkeyboard;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.inputmethodservice.InputMethodService;
import android.util.Base64;
import android.util.Log;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection;

public class AdbIME extends InputMethodService {
    // 定義廣播Action常量,用於識別不同類型的輸入指令
    private String IME_MESSAGE = "ADB_INPUT_TEXT";
    private String IME_CHARS = "ADB_INPUT_CHARS";
    private String IME_KEYCODE = "ADB_INPUT_CODE";
    private String IME_META_KEYCODE = "ADB_INPUT_MCODE";
    private String IME_EDITORCODE = "ADB_EDITOR_CODE";
    private String IME_MESSAGE_B64 = "ADB_INPUT_B64";
    private String IME_CLEAR_TEXT = "ADB_CLEAR_TEXT";
    private BroadcastReceiver mReceiver = null;

    @Override
    public View onCreateInputView() {
        // 加載一個簡單的空視圖作為輸入法界面
        View mInputView = getLayoutInflater().inflate(R.layout.view, null);

        // 註冊廣播接收器,用於監聽來自ADB的命令
        if (mReceiver == null) {
            IntentFilter filter = new IntentFilter(IME_MESSAGE);
            filter.addAction(IME_CHARS);
            filter.addAction(IME_KEYCODE);

            filter.addAction(IME_EDITORCODE);
            filter.addAction(IME_MESSAGE_B64);
            filter.addAction(IME_CLEAR_TEXT);
            mReceiver = new AdbReceiver();
            registerReceiver(mReceiver, filter);
        }
        return mInputView;
    }

    public void onDestroy() {
        // 服務銷燬時,註銷廣播接收器以防止內存泄漏
        if (mReceiver != null)
            unregisterReceiver(mReceiver);
        super.onDestroy();
    }

    // 內部廣播接收器類,負責處理接收到的各種輸入命令
    class AdbReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // 處理普通文本輸入命令
            if (intent.getAction().equals(IME_MESSAGE)) {
                String msg = intent.getStringExtra("msg");
                if (msg != null) {
                    InputConnection ic = getCurrentInputConnection();
                    if (ic != null)
                        ic.commitText(msg, 1); // 將文本提交到當前輸入連接
                }
                // 此處代碼省略了處理元鍵(Meta Key)的部分邏輯
            }
            // 其他Action(如IME_CHARS, IME_KEYCODE等)的處理邏輯在此類中繼續實現...
        }
    }
}

代碼關鍵點解析:

  1. 繼承 InputMethodServiceAdbIME 類是Android輸入法服務的基礎,使其成為一個合法的系統輸入法。
  2. onCreateInputView 方法:在創建輸入法視圖時,初始化並註冊一個 BroadcastReceiver (AdbReceiver)。它監聽所有預定義的廣播動作。
    1. AdbReceiver 內部類:核心邏輯所在。其 onReceive 方法根據 Intent 的 Action 類型,提取附加數據(如文本、鍵值碼),並通過 getCurrentInputConnection() 獲取當前焦點輸入框的連接,最終將輸入內容提交 (commitText) 或執行相應動作。
    1. 生命週期管理:在 onDestroy 中註銷廣播接收器,這是Android開發中防止上下文泄漏的良好實踐。 這段代碼清晰地展示了ADBKeyBoard的工作原理:作為一個“無界面”的輸入法,它主要依靠後台接收廣播指令來工作,從而實現高度的自動化控制能力。 更多精彩內容 請關注我的個人公眾號 公眾號(辦公AI智能小助手) 對安全感興趣的朋友可以關注我的安全公眾號(網絡安全技術點滴分享)