高仿豌豆莢免Root自動(dòng)安裝(AccessibilityService)

對(duì)于那些由于視力、聽(tīng)力或其它身體原因?qū)е虏荒芊奖闶褂?Android 智能手機(jī)的用戶粘勒,Android 提供了 Accessibility 功能和服務(wù)幫助這些用戶更加簡(jiǎn)單地操作設(shè)備屎即,包括文字轉(zhuǎn)語(yǔ)音、觸覺(jué)反饋技俐、手勢(shì)操作、軌跡球和手柄操作啡邑。開(kāi)發(fā)者可以搭建自己的 Accessibility 服務(wù)井赌,這可以加強(qiáng)應(yīng)用的可用性贵扰,例如聲音提示流部,物理反饋,和其他可選的操作模式枝冀。- 隨著Android系統(tǒng)版本的迭代,Accessibility功能也越來(lái)越強(qiáng)大球切,它能實(shí)時(shí)地獲取當(dāng)前操作應(yīng)用的窗口元素信息绒障,并能夠雙向交互,既能獲取用戶的輸入端盆,也能對(duì)窗口元素進(jìn)行操作费封,比如點(diǎn)擊按鈕。更多的介紹見(jiàn)Android開(kāi)發(fā)者官網(wǎng)的Accessibility頁(yè)面焚鹊。

  • 話不多說(shuō)直接開(kāi)始韧献,首先使用Android Accessibility 需要三個(gè)步驟:
    1、申請(qǐng)權(quán)限
    2锤窑、注冊(cè)服務(wù)
    3、配置 AccessibilityService Info首先需要申請(qǐng)權(quán)限
    <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
    注冊(cè)服務(wù)
<service        
        android:name=".Your Accessibility Name"       
        android:enabled="true"        
        android:exported="true"        
        android:label="Your Service Title"      
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
        android:process=":accessibility">        
        <intent-filter>            
                <action android:name="android.accessibilityservice.AccessibilityService" />       
         </intent-filter>        
        <meta-data            
        android:name="android.accessibilityservice"            
        android:resource="@xml/accessibility_config" />
</service>

配置 AccessibilityService Info

<accessibility-service    xmlns:android="http://schemas.android.com/apk/res/android"    android:accessibilityEventTypes="typeViewScrolled|typeWindowContentChanged|typeWindowStateChanged"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:accessibilityFlags="flagDefault|flagReportViewIds"
    android:canRetrieveWindowContent="true"
    android:description="@string/auto_service_des"
    android:packageNames="com.android.packageinstaller,com.google.android.packageinstaller,com.samsung.android.packageinstaller,com.lenovo.safecenter,com.lenovo.security" />

在這里需要注意的是packageNames是AccessibilityService所監(jiān)聽(tīng)的應(yīng)用的包名』嬷ぃ可以監(jiān)聽(tīng)多個(gè),在自動(dòng)安裝的時(shí)候箭筒不同的包名用于做適配胞枕。源碼中會(huì)有所要適配的包名魏宽,包含了大部分安裝程序的包名决乎。該程序?qū)崿F(xiàn)自動(dòng)裝的原理分析:首先我們可以用 getRootInActiveWindow()派桩,和event.getSource()均可以得到AccessibilityNodeInfo的實(shí)例,即為觸發(fā)這次事件的UI節(jié)點(diǎn)唤反。
重寫AccessibilityService服務(wù)鸭津,實(shí)現(xiàn)onAccessibilityEvent方法,該方法是監(jiān)聽(tīng)服務(wù)監(jiān)聽(tīng)到界面變化會(huì)調(diào)用因此逆趋,我們從該方法去做實(shí)現(xiàn)我們的自動(dòng)安裝功能。
那么我們?nèi)绾握业経I元素呢名斟?
1魄眉、findAccessibilityNodeInfosByText(String text) 該方法可以根據(jù)控件顯示的文本得到控件。所注意的是該方法的邏輯是包含(contains)而不是等于(equal)岩梳。
例如:參數(shù)我們傳遞 "安裝" 晃择,那么像,"是否安裝宫屠?","安裝"抵栈,都會(huì)得到乌逐,所以需要我們?nèi)ヌ幚怼W詈笪覀兪褂媚M用戶點(diǎn)擊實(shí)現(xiàn)自動(dòng)點(diǎn)擊效果

nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);

實(shí)現(xiàn)的基本流程就是這樣浙踢,但是這只是剛剛開(kāi)始,我們需要更嚴(yán)格的邏輯去處理胰舆,現(xiàn)在可以看下onAccessibilityEvent方法我是怎么實(shí)現(xiàn)的,

private void doAccessibilityEvent(AccessibilityEvent event) {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { 
       String className = event.getClassName().toString(); 
       if (uninstallPkgSet.contains(className)) {
            isInstallOrUninstall = false;
        }        
if(installViewSet.contains(event.getClassName().toString())) {
            isInstallOrUninstall = true;        
}        
if (installViewSet.contains(event.getPackageName().toString())) {
            isInstallOrUninstall = true; 
       } 
       AccessibilityNodeInfo rootNodeInfo = getRootInActiveWindow();
        if (rootNodeInfo != null && isInstallOrUninstall) {
            String pkgName = (String) rootNodeInfo.getPackageName();
            if (installPkgSet.contains(pkgName)) { 
               for (int i = 0; i < nodeContents.size(); i++) {
                    List<AccessibilityNodeInfo> textNodeInfo = new ArrayList<>(); 
                   for (int k = 0; k < completeTexts.size(); k++) {                       
                      textNodeInfo.addAll(rootNodeInfo.findAccessibilityNodeInfosByText(completeTexts.get(k))); 
                   } 
                   if (textNodeInfo.size() > 0) {
                        for (int j = 0; j < textNodeInfo.size(); j++) { 
                           String text = textNodeInfo.get(j).getText().toString();
                            if (completeTexts.contains(text)) {
                                clickInstall(textNodeInfo.get(j));
                            } 
                       }
                    } 
               } 
           }
        }
        AccessibilityNodeInfo nodeInfo = event.getSource();
        if (nodeInfo != null && isInstallOrUninstall) {
            for (int i = 0; i < nodeContents.size(); i++) {
                List<AccessibilityNodeInfo> textNodeInfo = nodeInfo.findAccessibilityNodeInfosByText(nodeContents.get(i)); 
               List<AccessibilityNodeInfo> installNodeInfo = new ArrayList<>();
                for (int k = 0; k < completeTexts.size(); k++) {
                    installNodeInfo.addAll(nodeInfo.findAccessibilityNodeInfosByText(installTexts.get(k)));
                } 
               boolean isInstall = installNodeInfo.size() != 0; 
               if (textNodeInfo != null && textNodeInfo.size() > 0) {
                    for (int j = 0; j < textNodeInfo.size(); j++) { 
                       String text = textNodeInfo.get(j).getText().toString(); 
                       if (nodeContents.contains(text) && isInstall) { 
                           clickInstall(textNodeInfo.get(j)); 
                       }
                    }
                } 
           } 
       } 
   }}

在這里我是根據(jù)豌豆莢所兼容的android手機(jī)都進(jìn)行了兼容處理,并對(duì)多語(yǔ)言進(jìn)行處理误续。大家看到我對(duì)單個(gè)文字也進(jìn)行了list話不理解的話扫茅,想想多語(yǔ)言,估計(jì)就理解了葫隙。目前測(cè)試國(guó)內(nèi)及國(guó)外手機(jī)幾乎都能實(shí)現(xiàn)自動(dòng)裝。目前有一個(gè)AppInstall的管理類腺办,實(shí)現(xiàn)了Root安裝糟描,及accessibility安裝的管理。讓使用起來(lái)更加方便蚓挤。
項(xiàng)目地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灿意,一起剝皮案震驚了整個(gè)濱河市崇呵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌域慷,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抵窒,死亡現(xiàn)場(chǎng)離奇詭異叠骑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)掉房,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瘾杭,“玉大人哪亿,你說(shuō)我怎么就攤上這事∮蓿” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵变勇,是天一觀的道長(zhǎng)贴唇。 經(jīng)常有香客問(wèn)我,道長(zhǎng)链患,這世上最難降的妖魔是什么瓶您? 我笑而不...
    開(kāi)封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮呀袱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘明棍。我一直安慰自己寇僧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布兴蒸。 她就那樣靜靜地躺著细办,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上区宇,一...
    開(kāi)封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天值戳,我揣著相機(jī)與錄音,去河邊找鬼卧晓。 笑死赴捞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赦政。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼桐愉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掰派!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起靡羡,我...
    開(kāi)封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤略步,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后纳像,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年岔帽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了导绷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贾费,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出褂萧,到底是詐尸還是另有隱情,我是刑警寧澤唱凯,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布谎痢,位于F島的核電站,受9級(jí)特大地震影響节猿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜峰鄙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一九孩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧煤墙,春花似錦、人聲如沸仿野。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)球涛。三九已至校镐,卻和暖如春亿扁,著一層夾襖步出監(jiān)牢的瞬間鸟廓,已是汗流浹背襟己。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工擎浴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贮预。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓链嘀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親怀泊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,180評(píng)論 25 707
  • 走過(guò)人生的山河與歲月,每一程山水都有不同的風(fēng)景售葡,每一段歲月都有不同的顏色忠藤,無(wú)論是滄桑還是美好挟伙,都是歲月給我們的饋贈(zèng)...
    門前折柳閱讀 207評(píng)論 0 0
  • 常說(shuō)自律即自由尖阔。我們往往只看到自由,卻忽略自律介却。
    Patsang閱讀 344評(píng)論 0 0
  • 是一個(gè)自己總是記不太清的屬性: 幾個(gè)相同的元素块茁,添加同樣的一個(gè)點(diǎn)擊事件處理程序來(lái)做處理,需要將元素自身 傳遞給事件...
    秋夜已涼閱讀 2,169評(píng)論 0 2