1. 程式人生 > >Android應用保活方案的另類出路,讓你應用長生不老(針對小米手機)

Android應用保活方案的另類出路,讓你應用長生不老(針對小米手機)

一、前言
我們在做Android應用的時候都知道,必須要有一套好的保活方案,這樣應用的push到達率高,應用的活躍度也就很高,我們平時也可以發現很多應用我們明明已經關閉了,但是還是可以接收到push訊息,或者ps檢視程序還是存在的。當然這裡就有很多方案做這件事了,從最早的Java層中接受各種事件和廣播等時機喚醒我們的應用,在到Native層的程序保活都是很好的方案,但是隨著Android系統的更新,Google也擔心使用者手機中的一些應用關閉失敗導致手機耗電很快。所以也給出了很多策略讓保活方案一度受到很大的障礙,同時國內的一些手機廠商更是厲害,直接forcestop操作,這種操作理論上是最終的殺死程序方案了。包括小米,OV等廠商都是這麼做的,但是有一個問題就是像微信中及時接受訊息的應用如果系統把他強殺之後接收不到訊息,使用者也是要瘋掉的,所以系統廠商會給出一個白名單有一些應用是不會強殺的。

當然現在還有很多應用在一起組成了一個拉活聯盟,就是你的應用可以把我的應用喚醒,我的應用可以把別人的應用喚醒,只要在這個聯盟裡面的應用都可以相互喚醒和被喚醒,這樣如果你手機中如果裝了這些聯盟中的應用,只要一個沒有別殺死那麼聯盟中的成員應用都會被喚醒。還有一種方案是因為我們知道微信和QQ這樣的及時應用很多廠商加了白名單,也就是這些應用不會被殺死的,那麼他們應用肯定會在指定時機中發出一些特定廣播,這個需要反編譯去看看他們內部到底有哪些廣播了,我們可以監聽這些廣播,只要微信不死,在一定時間內發出了我們註冊了他的廣播,我們也有可能被喚醒。當然還有很多方案比如網上很多的MarsDaemon框架,不過這個框架對於小米系統來說幾乎是失敗的。所以本文就針對於小米手機來一個全新的解決方案。

 

二、分析小米殺程序原理
首先我們看看小米手機他的殺程序方案是啥,我們知道可以按系統的多工選單就可以很方便的殺死全部程序或者全部程序了:

那麼我們可以找到這個按鈕,然後檢視指定邏輯,我們這裡可以通過UI工具找到id,然後去搜索,但是到哪搜尋呢?其實這裡有個知識點就是系統中的介面以及系統應用一般都在 /system/priv-app/ 這個目錄下,我們可以直接進入這個目錄查詢指定應用,這裡需要注意的是我們可能很容易認為應該是桌面應用也就是MiuiHome.apk這個應用,但是通過反編譯檢視卻找不到我們想要的東西,然後就發現了還有一個系統UI應用MiuiSystemUI,然後在弄出來反編譯就發現了這個地方:

我們通過思考一下,我們看到的是最近正在使用的應用,那麼我們想系統應該出現這個介面肯定也需要呼叫這個方法獲取當前正在執行的應用:getRecentTasks,我們可以全域性搜尋這個資訊,看到的確有一些內容,通過排查發現有一個重要的類:RecentTasksManager,然後到這個類檢視資訊:

我們點選進入檢視方法:

這裡看到內部會用對應用做分類,後面的殺死的方式也是不一樣的:

這裡看到殺死程序的方法:

這裡看到有很多哦判斷,如果在這個判斷內就走系統的強殺,也就是上面說的MarsDaemon框架是可以保活的,如果不在這個判斷內就走了系統最終殺死方案,這個是最強的殺程序方案,目前沒有好的保活方案可以解決。我們在來看一下那個判斷,可以看到在之前的分類中如果強殺列表為空,或者是系統應用,或者是應用開啟了自啟動許可權就不會強殺了,通過後面的一個判斷的方法名我們可以猜測這個是自啟動許可權功能,可以去系統程式碼檢視,這時候就需要去/system/framework/framework.jar中查詢系統類了:

這裡我們把系統類的framework.jar弄出來解壓出dex直接開啟即可:

看到這裡是呼叫系統的APP_OPS服務,所以我們去我們的專案中用反射的方式呼叫這個方法:

然後執行專案,報了許可權錯誤:

我們在AndroidManifest.xml中新增這個許可權即可,然後執行可惜沒什麼效果。所以就換個思路,既然要開啟應用的自啟動許可權,對於小米手機我們知道在小米安全應用中管理的,我們同樣去/system/priv-app/這個目錄下找到這個應用:

頁面如下:

然後弄出來apk之後用Jadx開啟apk檢視,同時我們可以用adb shell dumpsys activity top命令檢視當前頁面的activity資訊:

然後去搜索這個類,直接看到那個開啟的開關邏輯程式碼:

逐個排查詢到這個類中:

繼續往裡面看:

這裡看到了重要資訊就是寫入CP了,有了uri資訊,看到這裡寫入三個欄位資訊,檢視他的uri資訊:

到這裡就簡單了,我們在應用中直接利用uri資訊寫入值,當然需要把我們的應用自啟動開啟:

然後執行看效果:

有報錯資訊,提示缺少許可權我們新增即可,執行看看效果:

 

三、結果出乎意料
到這裡我們就操作成功了,這裡就結束了嗎?顯然不是因為這裡有一個很大的問題,細心的同學發現了,如果這個真的不用root許可權就這麼簡單的開啟那小米系統也太不安全了吧,但是我手中的這臺小米4的確是可以的,但是用了其他的小米手機發現確還是提示許可權不足,其實用我們的腳指頭想一想也是正常的,這裡肯定有問題,如果這一點都可以做到的話,那麼小米系統真的是太不安全了,那為什麼我的手機可以呢?因為我的手機當時自己刷了網上第三方的小米ROM,這個ROM應該是被改過了,只要是有許可權驗證的地方都可以免root過掉。那麼這裡我就被我的手機耍了一次,而你們卻被我耍了一次。

 

四、保活的另類出路
我們知道現在很多應用都想開啟自啟動許可權,這樣應用就可以長生不老了,不過通過這一次分析小米系統原始碼可以發現只要有了自啟動許可權之後應用首先是不會殺死,然後也可以重啟,真的是完完全全的長生不老了,那麼其實許可權這個事情我們肯定是做不了了,所以我們可以想其他的方案,比如我們可以引導使用者去開啟,這個就要看產品怎麼去很好的引導使用者了,比如有一個提示說:開啟自啟動可以更好的使用本應用此類訊息。這樣有了自啟動許可權之後可以做很多事情了,但是不是所有的使用者都願意去開啟的,那麼我們怎麼讓我們的應用長生不老呢,難道真的沒辦法了嗎?辦法其實還是有的,我們可以通過上面分析系統原始碼的時候看到:

當我們點選系統選單鍵出現系統多工介面,然後點選清空記憶體,其實系統這時候會獲取當前正在執行的程式,並且獲取他們的頁面截圖用於展示,而對於正在當前執行的程式是不會強制殺死的,也就是TopActivity的程式是不會殺死的。那麼我們是否可以利用這一點來做呢?首先我們可以監聽系統的多工選單鍵,這個就是動態監聽系統一個廣播即可,然後我們監聽到之後就立馬啟動我們自己的一個保活Activity這裡就叫做一畫素Activity,但是這個Activity需要具備以下三點:

第一點:因為一畫素對於肉眼來看幾乎可以忽略,所以需要在這個Activity中設定大小:

第二點:不能讓這個Activity出現在多工中,不然會被使用者發現就噁心了,這裡可以在xml中設定一個屬性即可:

第三點:啟動這個Activity速度要非常快,也就是要趕在系統獲取正在執行的Task之前啟動起來,不然就無效了,所以按照正常的系統啟動Activity流程會很慢的,這裡用反射啟動Activity,這個技術在之前的文章已經介紹了,這裡不多說了,這樣啟動的話保證在10ms之內完成,這樣就可以趕在系統獲取Task之前了:

第四點:在啟動之後要在一定時間內把一畫素Activity關閉,不然最頂端的一畫素Activity會奪取螢幕的觸控焦點,使用者點選清空記憶體就無效了,使用者會癲狂的:

有了這四點,這個一畫素Activity就可以讓我們的應用長生不老了:

當然這個可能有手機適配問題,大家可以看程式碼進行專案的適配,這種方式還有一個最大的好處就是,我們知道Android8.0之後系統不允許應用在後臺靜默啟動一個服務了,如果要啟動服務就要告訴使用者,讓使用者可以看到,不然就報錯,大家可以自行搜尋相關內容:

其實這對於使用者來說是好事,這樣對裝置有好處,不然後臺啟動了一大堆服務在跑,耗電耗效能。如果用了這個一畫素保活方案的話那麼我們沒有啟動一個服務,也就不會有這種限制了,同時也讓我們的應用長生不老了。

 

五、保活方案總結
好了到這裡我們就把小米的保活方案介紹完了,下面就來總結一下保活方案吧:

第一、首先是網上有很多各種保活方案主要是監聽廣播等,而現在很多應用採用了MarsDaemon框架方案,這個框架的確還是有用的,對於某些指定手機。

第二、同時現在有一個叫做保活互助聯盟,比如支付寶,微信,頭條等都在裡面,只要使用者手機中安裝了聯盟成員的應用,只有有一個成員的應用活著就會把其他已經被殺死的聯盟成員應用都喚醒起來。而我們知道像微信這類即時通訊工具一遍很多手機廠商都會加上白名單也就是不會強殺的,那麼如果我們通過反編譯微信找到他內部一個不需要許可權廣播,微信不死我們監聽他的某個廣播就可以起來了,前提是你能找到這個廣播。

第三、上面也說了,不管是哪種保活方案,最終的歸途都是不好的,因為谷歌慢慢的優化系統對於後臺啟動服務的操作是不贊同的,所以後面隨著系統升級很多保活方案几乎都要掛了,而本文介紹的另類處理方式的一畫素保活方案可以暫時解決這樣的問題,當然暫時只是適配了小米手機。

第四、前面分析了小米手機或者其他手機也是類似就是如果開啟了自啟動許可權就可能長生不老,所以如果在產品中用一種比較友好的方式去引導使用者開啟這個許可權也是未嘗不可的。

 

本文的目的只有一個就是學習更多的逆向技巧和思路,如果有人利用本文技術去進行非法商業獲取利益帶來的法律責任都是操作者自己承擔,和本文以及作者沒關係,本文涉及到的程式碼專案可以去編碼美麗小密圈自取,歡迎加入小密圈一起學習探討技術

 

六、總結
應用的保活至關重要,對於應用的活躍度無可厚非,所以這個也是很多公司一直看中的技術,但是在做這個的同時我們也要在乎使用者裝置的耗電耗效能資料,因為最終看中的是使用者體驗,而隨著谷歌新系統的優化,未來的保活之路幾乎是無望了,期待谷歌系統的優化方案,給使用者一個感覺的作業系統。

 
--------------------- 
作者:尼古拉斯_趙四 
來源:CSDN 
原文:https://blog.csdn.net/jiangwei0910410003/article/details/82558465 
版權宣告:本文為博主原創文章,轉載請附上博文連結!