怎樣可以跨進程測試

在Android系統下模擬鼠標鍵盤等輸入設備,網絡上資料非常多。但不少是人云亦云,甚至測試都不愿測試一下就抄上來了。這次寫一點體會,當作拋磚引玉。

0. 背景知識
眾所周知,Android是將Framework架在Linux之上的系統。Linux層和硬件打交道,Framework通過JNI等途徑得到底層信息。
消息的傳遞是:Linux -> Framework -> Application
因為此架構的特性,我們很容易知道可以在哪些環節,以何種途徑加入鼠標和鍵盤消息。

1. 添加鼠標鍵盤消息的方法
我們知道消息傳遞的路徑,就很清楚可以在哪些環節把我們需要的鍵盤鼠標消息添加進去了。
1.1: Linux Driver 層面添加:
可以寫一個Linux Driver,注冊一個字符設備驅動程序,建立一個虛擬的字符設備,主設備號13。利用Ioctl()和應用程序溝通。
之前在Linux 2.4時代,Sam曾在S3C2440A上寫過這樣一個Driver,個人起名叫VInput。可以實現以上功能。
優點:很少。
缺點
1.編程較為復雜。Linux Kernel從2.4到2.6,再到3.0。Kernel變動不小,僅字符設備驅動程序的注冊方法和Device的建立方法都有不小的變化,devfs也不支持了。
2. 需要有對應目標平臺的Kernel Source Code。
3.需要有root權限,才能夠insmod ko文件。

總結:這個方法并不好用。除了專業寫Driver的朋友外,估計沒有人會這么干。有一次曾想把Linux Kernel 2.4時代的VInput移植到Linux Kernel3.0來。但內核符號改變太大。沒能實現。


1.2: ?Linux 用戶層面添加
在Linux Kernel 2.6的某個版本中,添加了UInput。即Input User level driver.??這個Driver允許應用程序通過和 /dev/uinput交互來創建一個新的Linux Input Device。 這個Device可以是Keyboard, Mouse,絕對位置設備等等。既然Linux 層面都模擬出具體設備了。則Framework更會認為這是個實實在在的輸入設備。則我們模擬出的消息會一路上傳,一直傳遞到App層面。
具體方法:
http://blog.sina.com.cn/s/blog_602f87700100llew.html

優點
程序簡單易行,不需要Kernel Source Code。可以模擬幾乎一切常見的輸入設備。
缺點
這個程序最好是使用NativeC程序寫成一個可執行程序。只在Linux層運行。?
但如果才用JNI把它做成一個庫,供上層Android程序調用。則有可能會遇到一個問題:權限不足
我們在Android系統下常看到/dev/input設備的擁有者是system. ?同組的其它用戶的權限常常是不可讀寫。而一般的APK的擁有者并不是system, 所以無法讀寫這個設備(/dev/uinput). 所以此方法在JNI方式下有可能會失敗。
除非/dev/uinput的權限是666. 則沒有問題。
(當然也有兩個辦法突破,但那是另一個話題了, 可以看看以下文檔系統簽名部分:
http://blog.sina.com.cn/s/blog_602f87700101jm9b.html)

總結:這個方法Sam一直在實際使用。效果很不錯。



1.3: Framework 層面修改
這個辦法只是理論上可行,可以在Framework 讀取/dev/eventX 的JNI部分去下手。但實際上沒有人會為了這個功能去破壞Framework的穩定。所以只是理論上可行。以前一個同事曾研究過這一塊。但沒有最終動手做。

總結:除非有特殊需求,否則不要這么做。


1.4: 利用Instrumentation發送鍵盤鼠標消息
Instrumentation可以監聽系統和應用程序之間的通訊。可以利用它給應用程序發送鼠標鍵盤消息。有點像Windows下的Hook。

具體方法:
如果僅想向本應用程序發送鍵盤鼠標消息。
Instrumentation inst=new Instrumentation();
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_A);
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 100, 200, 0));
SystemClock.sleep(1000);
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 200, 200, 0));
SystemClock.sleep(1000);
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 200, 200, 0));


發送鍵盤和鼠標消息給當前有焦點的窗口。
可以采用:
sendKeyDownUpSync()
sendKeySync()
sendCharacterSync()等方式發送鍵盤消息。

可以使用sendPointerSync()發送鼠標消息。


但如果想向其它App的窗口發送鍵盤鼠標消息。僅僅這樣做就會出錯,程序會Crash。
java.lang.SecurityException: Injecting to another application requires?INJECT_EVENT?permission.

好的,我們加上這個權限。
在AndroidManifest.xml 的Permissions選單中,添加Uses Permission.選中INJECT_EVENT.

此時?uses-permission android:name="android.permission.INJECT_EVENT"?被加入。
但編譯時會報錯,這個權限僅有System APP才能擁有。
呵呵,那只好再加系統權限了。

android:sharedUserId="android.uid.system">
加入。
生成未簽名的APK。 再使用apktools加上系統簽名文件。這樣,就可以向其它APP發送鼠標鍵盤消息了。


優點:簡單易行。
缺點:如果向其它程序發送鼠標鍵盤,則需要系統簽名文件。且一些程序估計從更底層拿消息,所以會產生在這類程序中無響應的情況。

總結:想向其它APP Window 發送消息。則一定需要系統簽名。



總的看來,在Android系統中模擬鼠標鍵盤。采用UInput方案且在Linux層做NativeC可執行程序最為穩妥。在Linux層面就直接創建了輸入設備。
如果采用Instrumentation方式,一方面一些APP可能不吃,另一方面,如果想向其它APP發送消息。則需要系統簽名文件。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387934.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387934.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387934.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Studio 導入新工程項目

1 導入之前先修改工程下相關文件 1.1 只需修改如下三個地方1.2 修改build.gradle文件 1.3 修改gradle/wrapper/gradle-wrapper.properties 1.4 修改app/build.gradle 2 導入修改后的工程 2.1 選擇File|New|Import Project 2.2 選擇修改后的工程 如果工程沒有變成AS符號&#xf…

馬蜂窩張矗:績效考核是為了激發工作潛力,而不是逃避問題

3 月 23 日,由高端技術領導者社交平臺 TGO 鯤鵬會主辦的 GTLC 全球技術領導峰會分站首站在北京舉行。會上馬蜂窩技術副總裁 \u0026amp; TGO 鯤鵬會會員張矗發表了主題為“我在馬蜂窩的技術管理實踐”的演講。本文根據其演講整理而成。大家好,我是來自馬蜂…

vue domo網站_DOMO與Tableau-逐輪

vue domo網站Let me be your BI consultant. Best yet, let me be your free consultant on the following question:讓我成為您的BI顧問。 最好的是,讓我成為您的免費顧問 ,解決以下問題: DOMO vs. Tableau — What should I use?DOMO vs.…

fiddler抓包1-抓小程序https包

抓小程序包和抓app包是一樣的操作方法;安卓用fiddler,ios用charles; 一、環境準備 1.電腦已裝最新版fiddler 2.手機和電腦在同一局域網 二、fiddler設置 1.fiddler>Tools>Options>HTTPS 勾選Capture HTTPS CONNECTs 及下邊的子項&am…

多態使用的前提

1:必須是繼承(extends),實現(implements) 才行2:必須要重寫(覆蓋)父類的方法。轉載于:https://www.cnblogs.com/liyunchuan/p/10663788.html

Linux下的 FTP

1.安裝vsftpd yum install vsftpd 2.啟動/重啟/關閉vsftpd服務器 [rootlocalhost ftp]# /sbin/service vsftpd restart Shutting down vsftpd: [ OK ] Starting vsftpd for vsftpd: [ OK ] OK表示重啟成功了. 啟動和關閉分別把restart改為start/stop即可. 如果是源碼安裝的,到…

python入門23 pymssql模塊(python連接sql server增刪改數據 )

增刪改數據必須connect.commit()才會生效 回滾函數 connect.rollback() 連接數據庫 dinghanhua sql server增刪改 import pymssqlserver 192.168.1.1 user user password 111111 database testdbconnect pymssql.connect(server server,user user,passwordpassword,da…

每個人都應該使用的Python 3中被忽略的3個功能

重點 (Top highlight)Python 3 has been around for a while now, and most developers — especially those picking up programming for the first time — are already using it. But while plenty of new features came out with Python 3, it seems like a lot of them ar…

iframe自適應高度

為什么需要使用iframe自適應高度呢?其實就是為了美觀,要不然iframe和窗口長短大小不一,看起來總是不那么舒服,特別是對于我們這些編程的來說,如鯁在喉的感覺。 首先設置樣式 body{margin:0; padding:0;} 如果不設置bod…

.Net轉Java自學之路—SpringMVC框架篇八(RESTful支持)

RESTful架構,REST即Representational State Transfer。表現層狀態轉換,就是目前最流行的一種互聯網軟件架構。它結構清晰、符合標準、易于理解、擴展方便,所以得到越來越多網站的采用。 RESTful其實就是一個開發理念,是對http的很…

沖刺第七天

今天任務進行情況:今天我們將我們的游戲導到界面形成可用的應用程序,并且進行調試與運行,讓同學試玩,發現了困難并加以改正。 遇到的困難及解決方法: 運行時發現游戲界面中UI的button和image的位置會隨分辨率的不同而發…

數據探查_數據科學家,開始使用探查器

數據探查Data scientists often need to write a lot of complex, slow, CPU- and I/O-heavy code — whether you’re working with large matrices, millions of rows of data, reading in data files, or web-scraping.數據科學家經常需要編寫許多復雜,緩慢&…

Node.js Streams:你需要知道的一切

Node.js Streams:你需要知道的一切 圖像來源 Node.js流以難以使用而聞名,甚至更難理解。好吧,我有個好消息 - 不再是這樣了。 多年來,開發人員在那里創建了許多軟件包,其唯一目的是簡化流程。但在本文中,我…

oracle表分區

1.表空間:是一個或多個數據文件的集合,主要存放的是表,所有的數據對象都存放在指定的表空間中;一個數據文件只能屬于一個表空間,一個數據庫空間由若干個表空間組成,其中包括:a.系統表空間:10g以前,默認系統表空間是System,10g包括10g以后,默認系統表空間是User,存放數據字典和視…

oracle異機恢復 open resetlogs 報:ORA-00392

參考文檔:ALTER DATABASE OPEN RESETLOGS fails with ORA-00392 (Doc ID 1352133.1) 打開一個克隆數據庫報以下錯誤: SQL> alter database open resetlogs; alter database open resetlogs * ERROR at line 1: ORA-00392: log 1 of thread 1 is being…

從ncbi下載數據_如何從NCBI下載所有細菌組件

從ncbi下載數據One of the most important steps in genome analysis is gathering the data required for downstream research. This sometimes requires us to have the assembled reference genomes (mostly bacterial) so we can verify the classifiers trained or bins …

shell之引號嵌套引號大全

萬惡的引號 這個能看懂你就出師了! 轉載于:https://www.cnblogs.com/theodoric008/p/10000480.html

oracle表分區詳解

oracle表分區詳解 從以下幾個方面來整理關于分區表的概念及操作: 表空間及分區表的概念表分區的具體作用表分區的優缺點表分區的幾種類型及操作方法對表分區的維護性操作 1.表空間及分區表的概念 表空間: 是一個或多個數據文件的集合,所有的數據對象都存…

線性插值插值_揭秘插值搜索

線性插值插值搜索算法指南 (Searching Algorithm Guide) Prior to this article, I have written about Binary Search. Check it out if you haven’t seen it. In this article, we will be discussing Interpolation Search, which is an improvement of Binary Search when…

其他命令

keys *這個可以全部的值del name 這個可以刪除某個127.0.0.1:6379> del s_set(integer) 1127.0.0.1:6379> keys z*(匹配)1) "z_set2"2) "z_set"127.0.0.1:6379> exists sex(integer) 0 127.0.0.1:6379> get a"3232…