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(推薦)
- 從項目的Release頁面下載最新的
ADBKeyboard.apk文件。 -
- 連接Android設備並開啓USB調試模式。
-
- 執行以下命令進行安裝:
-
```bash -
adb install ADBKeyboard.apk -
```
方法二:從源碼構建
- 克隆倉庫:
-
```bash -
git clone https://github.com/senzhk/ADBKeyBoard.git -
cd ADBKeyBoard -
``` -
- 配置環境:
-
* 設置 `ANDROID_HOME` 環境變量指向你的Android SDK路徑,例如: -
```bash -
export ANDROID_HOME=$HOME/Android/Sdk -
``` -
* 或者直接編輯項目根目錄下的 `local.properties` 文件,添加 `sdk.dir=/path/to/your/Android/Sdk`。 -
- 構建並安裝:
-
```bash -
./gradlew installDebug -
```
啓用鍵盤
安裝後,需要通過ADB或系統設置啓用並切換到此輸入法。
通過ADB啓用和切換:
# 啓用ADBKeyBoard輸入法
adb shell ime enable com.android.adbkeyboard/.AdbIME
# 將ADBKeyBoard設置為當前默認輸入法
adb shell ime set com.android.adbkeyboard/.AdbIME
通過系統設置啓用: 進入設備的 設置 -> 系統 -> 語言和輸入法 -> 虛擬鍵盤,找到並啓用“ADBKeyBoard”。
使用説明
啓用ADBKeyBoard後,即可通過發送廣播意圖(Broadcast Intents)來控制輸入。
基礎使用示例
- 發送普通文本 (可能在高版本Android上失效):
-
```bash -
adb shell am broadcast -a ADB_INPUT_TEXT --es msg '你好嗎? Hello?' -
``` - 發送Base64編碼的文本 (推薦,兼容性更好):
-
```bash -
# Mac/Linux -
adb shell am broadcast -a ADB_INPUT_B64 --es msg `echo -n '你好嗎? Hello?' | base64` -
# Windows (需藉助PowerShell或Python腳本處理Base64) -
``` - 發送按鍵事件 (如刪除鍵,碼值67):
-
```bash -
adb shell am broadcast -a ADB_INPUT_CODE --ei code 67 -
``` - 發送編輯器動作 (如“前往”動作,碼值2):
-
```bash -
adb shell am broadcast -a ADB_EDITOR_CODE --ei code 2 -
``` - 發送Unicode字符碼點 (發送“:grinning_cat_with_smiling_eyes: Cat”):
-
```bash -
adb shell am broadcast -a ADB_INPUT_CHARS --eia chars '128568,32,67,97,116' -
``` - 發送組合鍵 (如Ctrl + A):
-
```bash -
adb shell am broadcast -a ADB_INPUT_MCODE --es mcode '4096,29' -
``` - 清空當前輸入框的所有文本:
-
```bash -
adb shell am broadcast -a ADB_CLEAR_TEXT -
```
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等)的處理邏輯在此類中繼續實現...
}
}
}
代碼關鍵點解析:
- 繼承
InputMethodService:AdbIME類是Android輸入法服務的基礎,使其成為一個合法的系統輸入法。 onCreateInputView方法:在創建輸入法視圖時,初始化並註冊一個BroadcastReceiver(AdbReceiver)。它監聽所有預定義的廣播動作。-
AdbReceiver內部類:核心邏輯所在。其onReceive方法根據Intent的 Action 類型,提取附加數據(如文本、鍵值碼),並通過getCurrentInputConnection()獲取當前焦點輸入框的連接,最終將輸入內容提交 (commitText) 或執行相應動作。
-
- 生命週期管理:在
onDestroy中註銷廣播接收器,這是Android開發中防止上下文泄漏的良好實踐。 這段代碼清晰地展示了ADBKeyBoard的工作原理:作為一個“無界面”的輸入法,它主要依靠後台接收廣播指令來工作,從而實現高度的自動化控制能力。 更多精彩內容 請關注我的個人公眾號 公眾號(辦公AI智能小助手) 對安全感興趣的朋友可以關注我的安全公眾號(網絡安全技術點滴分享)
- 生命週期管理:在