這是一個輕量級的庫,配置幾行代碼,就能夠實如今android上實現進程常駐,也就是在系統強殺下,以及360獲取root權限下,clean master獲取root權限下都沒法殺死進程java
支持系統2.3到6.0linux
支持大部分設備,包括三星,華爲,oppo,nexus,魅族等等android
能夠簡單對開機廣播進行保護git
github地址:github
https://github.com/Marswin/MarsDaemonwindows
原理分析:api
Android 進程常駐(0)----MarsDaemon使用說明
session
Android 進程常駐(2)----細數利用android系統機制的保活手段
測試
Android 進程常駐(3)----native保活5.0如下方案推演過程以及代碼詳述
Android 進程常駐(4)----native保活5.0以上方案推演過程以及代碼詳述
Android 進程常駐(5)----開機廣播的簡單守護以及總結
正文:
上一篇咱們經過父子進程間創建雙管道,來監聽進程死掉,通過測試,無耗電問題,無內存消耗問題,能夠在設置中force close下成功拉起,也能夠在獲取到root權限的360/cleanmaster下成功存活。
4.4.3的ActivityManagerService
、
實如今這裏
而後5.0的AMS
實現
開始本身頭腦風暴,想出如下幾種解決策略:
一、放棄java進程,使用兩個純native的binary進程,相互保活,確保native進程常駐,而後按時拉起須要常駐的java進程。
二、使用setsid將子進程的session改變,是否可讓系統不凍結子進程。
三、子進程建立子進程,而後自殺,重複1000次,也就是父進程和本身子進程的子進程的子進程重複一千遍的進程之間互保,是否可讓系統不凍結子進程其中a和b兩個進程都會執行這塊代碼,對於a進程來講,indicator_self_path對應a1,indicator_daemon_path對應b1,observer_self_path對應a2,observer_daemon_path對應b2,b進程同理
首先本身加鎖,而後加入同步模塊notify_and_waitfor
以上代碼就是上述同步邏輯
同步完成後,兩個進程同時監聽對方的鎖,一方掛掉另外一方馬上能夠監聽到。這套方案在5.0+上能夠作到互相監聽對方死亡狀態,由於都是阻塞方法,因此無耗電效率問題。
這裏要說一下,也許你看完源碼你會問爲何步在5.0如下采用這種方案,由於這種方案是須要掛兩個進程的,雖然與父子進程相比,在linux下都是兩個進程兩個pid,可是在android系統的設置裏面,父子進程中的native進程是android系通通計不到的,因此不會列出來,不會讓用戶以爲你爲啥啓這麼多進程。因此從用戶體驗角度,5.0如下仍是採用上一篇博文采用的方案。
因此時間很重要!!!咱們要跟系統搶時間
那麼如今的問題是怎樣才能把intent發出去,查看源碼,咱們能夠看出intent的發送其實是ActivityManagerNative這個類,他持有一個binder,用來與系統的ActivityManagerService通訊,而後咱們發送intent的時候會初始化一個Parcel,經過binder transcate過去。
時間都消耗在了pacel的建立上。
那麼咱們可不能夠把這些耗時操做放在進程開始的時候就完成,等到監聽到進程掛掉,直接調用。
可是那個binder咱們無法直接拿到,這裏須要用到反射。
看代碼:
代碼com.marswin89.marsdaemon.strategy.DaemonStrategy22.java
拿到ActivityManagerNative實例而後拿binder,也就是他的一個成員變量mRemote
而後把Pacel初始化出來,這裏註釋掉的是我一行一行試驗的,爲了節省時間,在能達到目的的前提下,時間越少越好,因此參數能少傳就少傳。
而後在檢測到對方進程死掉的時候,直接調用transcate方法。
ok,5.1上也能夠實現雙向守護。
可是很遺憾,6.0上又跪了。
而後通過排查,發現經過以上方式用binder transcate的方法沒法啓動一個service。那該怎麼辦呢?抱着試試看的內心嘗試了broadcastreceiver,果真廣播是能夠的。一樣的原理用ActivityManagerNative中的binder transcate一個pacel來啓動一個broadcast拉起進程。
也是仿照系統源碼來作的廣播的Pacel
代碼com.marswin89.marsdaemon.strategy.DaemonStrategy22.java
ok,6.0也搞定。
在系統force close時成功拉起對方,可是在360\clean master with root的強殺下仍然有必定的概率會跪。經過log能夠看出來,在一鍵清理的時候是有成功拉起的,可是360\cm均會重複殺,被拉起來的新進程還沒初始化完成,就又被殺掉了。
再次,時間很重要!!!咱們要跟360\cm搶時間
這裏咱們在進程剛建立的時候使用多線程,將文件的同步加鎖監聽與啓動另外一個進程同時進行,歷來能節約100毫秒左右的時間
大功告成!
從5.0到6.0,在force close和360\cm with root的一鍵清理下均可以實現互相守護了。