1. Android端進程被殺死后,目前自帶的保護后台接收消息活躍機制。暫時沒有什么好的機制保持任何情況下都活躍
android原生系統用home鍵殺進程可以起來,如果是強行停止就只能用戶自己手動開啟應用
如果是miui等第三方應用,殺了進程默認無法自啟動
如果是root過的原生系統,殺了進程也是沒有辦法起來的,這個時候推送是收不到的
如果是原生系統,沒有root,只要不是強行停止,其他系統自帶的停止方式都可以自啟動,一般10s內恢復
目前已知以下第三方系統會影響到應用:
小米【MIUI】
自啟動管理:需要把應用加到【自啟動管理】列表,否則殺進程或重新開機后進程無法開啟
通知欄設置:應用默認都是顯示通知欄通知,如果關閉,則收到通知也不會提示
華為【Emotion】
自啟動管理:需要把應用加到【自啟動管理】列表,否則殺進程或重新開機后進程不會開啟,只能手動開啟應用
后台應用保護:需要手動把應用加到此列表,否則設備進入睡眠后會自動殺掉應用進程,只有手動開啟應用才能恢復運行
通知管理:應用狀態有三種:提示、允許、禁止。禁止應用則通知欄不會有任何提醒
魅族【Flyme】
自啟動管理:需要把應用加到【自啟動管理】列表,否則殺進程或重新開機后進程發開啟
通知欄推送:關閉應用通知則收到消息不會有任何展示
VIVO【Funtouch OS】
內存一鍵清理:需要將應用加入【白名單】列表,否則系統自帶的“一鍵加速”,會殺掉進程
自啟動管理:需要將應用加入“i管家”中的【自啟動管理】列表,否則重啟手機后進程不會自啟。但強制手動殺進程,即使加了這個列表中,后續進程也無法自啟動。
OPPO【ColorOS】
凍結應用管理:需要將應用加入純凈后台,否則鎖屏狀態下無法及時收到消息
自啟動管理:將應用加入【自啟動管理】列表的同時,還需要到設置-應用程序-正在運行里鎖定應用進程,否則殺進程或者開機后進程不會開啟,只能手動開啟應用
目前推送的保活機制基本上都是
一.依賴於系統廣播的接收調用
常用的有:1.鎖屏解鎖廣播2.網絡狀態改變廣播3.安裝包廣播,卸載包廣播4.存儲器掛載卸載廣播
android.intent.action.USER_PRESENT
android.net.conn.CONNECTIVITY_CHANGE
android.net.wifi.RSSI_CHANGED
android.net.wifi.STATE_CHANGE
android.net.wifi.WIFI_STATE_CHANGED
android.intent.action.MEDIA_UNMOUNTED
android.intent.action.MEDIA_REMOVED
android.intent.action.MEDIA_CHECKING
android.intent.action.MEDIA_EJECT
二.依賴於同一個手機上不同APP使用相同的SDK來相互拉起對方
通過LBE安全大師看QQ能通過個推,JPUSH,小米推送,微信開放平台接口廣播,新浪SAE雲推送,qq瀏覽器推送狀態廣播,手機QQ廣播接收等多種推送方式相互喚醒
是否可以嘗試按照QQ方式去實現。
嘗試用com.tencent.mm包名,在魅族NOTE2上,在另外zzh中創建了個服務,服務里每隔一秒打印test,發現正常通過菜單關閉都可以繼續執行,此時例子APP到緩存進程中繼續運行,關閉緩存進程才徹底關閉。
QQ當我在魅族NOTE2上,把正在運行和緩存進程中的QQ殺掉后,並且沒有其他QQ能喚醒的情況下,QQ也無法收到推送消息。
三.是否可以嘗試依賴於某個手機自身的推送服務
逐個判斷當前推送方式是否能成功,如果不能成功就換下種推送方式推送
或者在用戶登陸APP后反饋登陸信息,根據反饋信息來首先使用當前手機得推送服務。
魅族沒有自己的推送服務,此路不通
四.看到360手機助手怎么殺都殺不死
找到一個root的手機,如果不行就找個360一鍵root,adb shell進入后,執行su命令,當時root權限后,就進入到data/app中,把我需要的com.qihoo.appstore文件中base.apk復制到某個可以用文件夾(例如/mnt/sdcard/tmp)中,然后adb pull /mnt/sdcard/tmp c:\ 中,再通過反編譯編譯出代碼,看看實現。
發現它有個deamon守護進程的庫,libCoreDaemon.so看看怎么使用,發現一直無法加載該庫,System.loadLibrary("CoreDaemon");報錯,無法加載
1.嘗試在魅族上使用微信的包名,發現通過菜單關閉APP,后台服務依然存在可以執行
2.反編譯出360的JAVA代碼,查看保活機制,沒看懂,嘗試使用它的第三方,發現無法加載
3.嘗試集成了信鴿和JPUSH兩個推送,發現存活率依然不高
4.嘗試集成多個手機系統的消息推送,發現VIVO,魅族等沒有推送服務
5.嘗試鬧鍾喚醒,鬧鍾在5.1隨着APP關閉也無效
6.GITHUB上找例子 JNI開啟服務不行 前台服務也不行 雙JAVA服務也不行
7.嘗試ROOT后使用系統權限 沒有ROOT方式,暫時沒嘗試
8.兩個APP采用不同用戶,一個關閉去拉起另外一個 暫時沒有嘗試
9.嘗試微信或者QQ是否有廣播,可以喚醒我們APP 沒有發現什么廣播可以喚醒
10.嘗試單獨起個接收器,接收所有推送的守護進程廣播,來啟動我們自己的服務 LBE顯示有相互喚醒路徑,但是沒有喚醒服務 沒有喚醒
在上面基本上又做了新的嘗試
問題點1.JNI運行在哪里 啟動服務 確認下通過任務管理器關閉掉APP后C進程是否存在
動態鏈接庫文件,是一種不可執行的二進制程序文件,它允許程序共享執行特殊任務所必需的代碼和其他資源,只是加載到內存一種資源文件,僅測試和java屬於同一個進程,不同線程
java虛擬機類似於一個沙箱,應用程序進程共享zygote的同一套JAVA核心庫,Android的進程和線程其實是和liunx進程管理保持一致,Android里fork創建進程,clone創建線程
am startservice -n com.uhealth.member/cn.jpush.android.service.DaemonService 包名/類名
推送是通過
am startservice -a cn.jpush.android.intent.DaemonService 相互喚醒
魅族把靜態注冊廣播接收器進程沒啟動時,不給啟動,也就是自啟動管理設置的
服務:
packageManagerService解析APK,負責安裝,及/data下目錄生產,並在內存存儲了所有組件的信息(Acitivity,Service),並對外提供數據查詢
ActivityManagerService 管理ActivityRecord和TaskRecord,processRecord,並根據uid和processname去看是否需要創建新的進程,創建新進程是發消息給zygote,給新進程綁定Application,然后最后啟動Activity或Service
問題點2.自啟動試試是否可以
Flyme3.1設置開機自啟:可以在設置—應用控制—開機啟動進行設置。
Flyme4.0設置開機自啟:可以在設置—應用管理—(點擊需設置的軟件)—權限管理—自啟動,點擊即可關閉或打開。 打開自啟動確實可以重啟
所謂的自啟動管理,就是把靜態注冊的廣播接收器進程沒啟動時無法接收廣播,當DEMO程序自啟動打開時,收到發送廣播也會自動啟動
對外暴露的服務是可以通過廣播啟動
問題點3:
嘗試生成子進程的子進程,然后把子進程殺掉,看是否可以形成360的依賴於init的子進程特例
360並不是通過生成子進程,然后殺掉父進程來連接上的
通過JAVA層新建2個進程,2個進程里2個JAVA服務,一個java服務service1去喚醒另外一個JAVA服務service2,service2里會啟動一個C線程,並創建其子進程,然后通過命令殺掉service2所在的進程,此時子進程就成為了init的子進程,子進程一直在運行,然后通過任務管理器關閉DEMO程序,沒有自啟動
轉自:http://blog.csdn.net/z157794218/article/details/51657444