背景:
最近需要做一個防應用自啓的方案,做在framework層源碼裏面。這裏做下簡單的技術方案介紹。
原理:
- 防止應用接收靜態廣播啓動;
- 防止應用的service隱式啓動。
大致方法:
防止應用接收靜態廣播啓動方案:
要了解此方案,要先了解廣播發送接收機制,請參考:https://blog.csdn.net/zhgeliang/article/details/80493390
可以在BroadcastQueue.java中的processNextBroadcast方法中處理靜態廣播拉起引用之前:
if ((r.curApp=mService.startProcessLocked 判斷是否是白名單應用,若不是,則調用scheduleBroadcastsLocked(); 方法繼續處理下一個廣播,並返回。
爲什麼不加在processNextBroadcast的最前面?
我們要做的是防止應用自啓,但應用啓動後其應該接收到的廣播還是應該讓其接收到。
防止應用的service隱式啓動
建議先了解service的啓動流程,請參考:https://blog.csdn.net/freekiteyu/article/details/79785720
可以在ActiveServices.java 中的retrieveServiceLocked 中獲取到ServiceRecord 之後(主要是爲了獲取應用相關的信息,爲判斷是否在白名單做準備),返回ServiceLookupResult之前 判斷是否是白名單應用,若不是,則返回null。
防止應用被殺後再啓動:
在killServicesLocked中"// Any services running in the application may need to be placed" 之前判斷若不是白名單應用,調用bringDownServiceLocked(sr); continue;
白名單應用注意事項
Android核心應用(coreApp)應該在白名單內,系統重要應用也應該在白名單內。