1. 程式人生 > >Android後臺保活機制,應用程序長存的可行性分析

Android後臺保活機制,應用程序長存的可行性分析

什麼時候會造成STOPPED狀態:

重未啟動過的應用,原生的系統中,當應用初次啟動後就會被標識為非STOPPED狀態,而且再也沒有機會被打回原形除非重新安裝應用;但是一些定製系統,在清理應用時加入了將應用重置為STOPPED的邏輯。

與系統Service捆綁

Android系統提供給我們一系列的Service,注意這裡我們所指的系統Service並非“SystemService”提供的那些玩意,而是類似於系統廣播的便於我們使用的Service,常見常用的就是IntentService,當然還有其它更多更不常用的系統Service,那麼為什麼愛哥要在這裡提到這玩意呢?因為某些系統Service一旦繫結就像擁有開了掛一樣的許可權,這在大部分機型包括某些深度定製系統上簡直就像BUG般存在,以最BUG的NotificationListenerService為例,大家可能很少會用到這玩意,這玩意是用來讀取通知的,也就是說只要是通知不管你誰發的,NotificationListenerService都可以檢測到,使用它也很簡單,和IntentService一樣定義一個類繼承一下即可:

package com.aigestudio.daemon.core;

import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;

/**
 * @author AigeStudio
 * @since 2016-05-05
 */
public class DService extends NotificationListenerService {
    @Override
    public void onNotificationPosted
(StatusBarNotification sbn) { } @Override public void onNotificationRemoved(StatusBarNotification sbn) { } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

裡面什麼邏輯都不用實現,是的你沒聽錯,什麼邏輯都不需要,然後在AndroidManifest中宣告許可權:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package
="com.aigestudio.daemon">
<application> <service android:name=".core.DService" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" android:process=":service"> <intent-filter> <action android:name="android.service.notification.NotificationListenerService" /> </intent-filter> </service> </application> </manifest>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

這裡為了區別主程序,我將該Service置於一個單獨的程序中,然後啟動應用,注意,這裡我們的應用什麼邏輯都沒有,剔除掉上面所做的所有有關程序保護的邏輯,執行之後你發現看不到你NotificationListenerService所在的程序:

AigeStudio:Android AigeStudio$ adb shell
root@vbox86p:/ # ps|grep aigestudio
u0_a61    9513  339   1002012 30452 ffffffff f74aa3b5 S com.aigestudio.daemon
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

先別急,NotificationListenerService是個特殊的系統Service,需要非常特別的許可權,需要你手動在“設定-提示音和通知-通知使用許可權”中開啟,注意這個“通知使用許可權”選項,如果你裝置裡沒有需要使用通知使用許可權換句話說就是沒有含有NotificationListenerService的應用的話,這個設定選項是不可見的: 
這裡寫圖片描述
這時我們勾選我們的應用,會彈出一個提示框: 
這裡寫圖片描述
所以,你想好如何騙你的使用者勾選這個勾勾了麼,一旦勾上,一發不可收拾,這時你就會看到我們的程序啟動起來了:

[email protected]:/ # ps|grep aigestudio                                            
u0_a61    9513  339   1003044 30532 ffffffff f74aa3b5 S com.aigestudio.daemon
u0_a61    12869 339   993080 23792 ffffffff f74aa3b5 S com.aigestudio.daemon:service
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

好了,這時候,見證奇蹟的時候來了,不管是某米、某族還是某某,請嘗試下它們的一鍵清理,你會發現不管怎麼殺,我們的程序都還在,除了一小部分名不經傳的手機因為修改系統邏輯將其殺死外,絕大部分手機都不會殺掉該程序,為什麼呢?好事的朋友一定會去check該程序的adj值:

root@vbox86p:/ # ps|grep aigestudio                                            
u0_a61    12869 339   993080 23792 ffffffff f74aa3b5 S com.aigestudio.daemon:service
root@vbox86p:/ # cat /proc/12869/oom_adj
0
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

你會發現我們的程序被置為前臺程序了,而且不僅僅是這樣哦,即便你重啟裝置開機,它也會首先被啟動,因為其內部邏輯會使其在系統啟動時繫結並開始監聽通知,當然我們這裡並沒有任何關於通知的邏輯,那麼你可能會問愛哥這又有什麼用呢?我們又不能在NotificationListenerService裡處理與通知不相關的邏輯,沒錯,是這樣,但是我們也沒必要啊,我們只需新建一個Service並使其與NotificationListenerService在同一程序下,那麼我們的這個Sefvice不就一樣不死了嗎:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.aigestudio.daemon">

    <application>
        <service
            android:name=".services.DaemonService"
            android:process=":service" />
        <service
            android:name=".core.DService"
            android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
            android:process=":service">
            <intent-filter>
                <action android:name="android.service.notification.NotificationListenerService" />
            </intent-filter>
        </service>
    </application>
</manifest>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

這種方式唯一的一個缺點就是你需要欺騙使用者手動去開啟通知許可權,需要給使用者一個合理的理由,所以對於跟通知許可權根本不沾邊的應用想想還是算了吧,用了這種方式安全軟體都拿你沒辦法了。 

KFC外帶全家桶

以全家桶的方式去相互喚醒相互拉活是目前來說最穩定最安全的方式,各大牛逼點的應用都有類似行為,當然對於很多小應用來說,沒有BAT那樣的實力,不過你依然可以使用一些第三方的網路服務,比如XX推送,一旦裝置上的某應用通過XX的推送獲得訊息時,是可以間接喚醒其它應用並推送與其相關的訊息的。好了,就先扯這麼多。




相關推薦

Android後臺機制應用程序長存可行性分析

什麼時候會造成STOPPED狀態: 重未啟動過的應用,原生的系統中,當應用初次啟動後就會被標識為非STOPPED狀態,而且再也沒有機會被打回原形除非重新安裝應用;但是一些定製系統,在清理應用時加入了將應用重置為STOPPED的邏輯。 與系統Service捆綁 Android系統提供給我們一系列的

全面盤點當前Android後臺方案的真實執行效果(截止2019年前)

本文原作者“minminaya”,作者網站:minminaya.cn,為了提升文章品質,即時通訊網對內容作了幅修訂和改動,感謝原作者。 1、引言 對於IM應用和訊息推送服務的開發者來說,在Android機型上的後臺保活是個相當頭疼的問題。 老闆一句:“為什麼微信、QQ能收到訊息,而你寫的

Android後臺4.0~8.0系統(一)

一:前言 在談保活之前,我們應該知道隨著Android系統的不斷髮展,系統管控越來越嚴格,後臺保活將是一個偽命題了,後臺保活主要是和推送相關,隨著技術的發展,泰爾終端實驗室也制定了統一的推送標準,我想在後面Android會像Iphone一樣,使用統一系統服務進

Android後臺4.0~8.0系統(三)

簡單回顧下:在之前的保活第一篇中,主要介紹了設定模組關於保活的一些作用;在第二篇中,主要介紹了在關閉activity和系統退出的時候,系統是如何反應的,我們能否利用這些機制創造出更多的保活條件; 這篇主要介紹下在4.0~8.0系統當中,我們可以利用的保活方

Android後臺4.0~8.0系統(二)

一:在談到Service保活的時候,需要理解出如下幾個概念 1)Activity的finish方法 /** * Call this when your activity is done and should be closed.

Android記一次後臺設計心得2018

決定 名單 設備 .com cosplay 手機 音樂 方法 一次 首先我並不推薦也不喜歡手機應用通過各種手段後臺保活,但是當產品經理確定一定以及肯定地提出了這個需求,活著應用有著必須常駐後臺的理由,也就只有硬著頭皮去與各個手機的後臺管理機制做鬥爭了。 背景:因為開發的

Android中的程序(不死程序

Android中的程序保活方式主要分為以下三種: 黑色保活:不同的app程序,用廣播相互喚醒(包括利用系統提供的廣播進行喚醒) 白色保活:啟動前臺Service 灰色保活:利用系統的漏洞啟動前臺Service 黑色保活 利用不同的app程序使用廣播來進

安卓應用實踐(雙程序守護)

         研究安卓應用保活黑科技已經有一段時間了,其實很多都是看看文章,部落格,看完就忘了,今天休息,在家寫寫Demo,研究一下,跟大家分享。 學習資料:http://www.oschina.

Android 使用極光推送整合、出現問題和後臺

今天接入極光推送學習一下,就發現的問題一起探討 主要包含了註冊、接入、sdk版本獲取失敗、後臺保活介紹 接入的時候還是按照官方接入流程,主要就是一下三步 註冊 註冊極光推送賬號 建立應用(記錄自己的appkey) 根據平臺設定推送設定,主要是設定一個包名(這個包名一定要和自

IIS無法啟動應用程序池自動關閉應用程序池XXXX將被自動禁用 解決方案之一

nbsp 問題 -- content 其中 iis service .com 裏的 是上網找各種相關資料。其中解決該問題的前半段是用如下這個帖子的方法。 http://www.360doc.com/content/14/1119/01/16402602_426289088.

管理數據應用程序和主機安全-A

管理數據 應用程序和主機安全 1、數據安全是指保持組織數據安全可用,並能阻止未授權訪問的安全控制和措施。數據安全必須應用到組織的每個層面中,包括:物理環境、所有的設備和系統、所有用於商業的移動設備等!2、常用的數據存儲方式包括:直接附加存儲(DAS)、網絡附加存儲(NAS)、存儲區域網絡(SAN)、基

管理數據應用程序和主機安全-B

管理數據 應用程序和主機安全 1、應用安全確保了軟件合理的開發、部署和維護全部到位,保護應用程序不會受到威脅和漏洞的威脅。應用程序安全應用在軟件開發過程中的每個階段中,並且應該結合到所有應用程序的初始設計中!2、補丁管理是監控、獲取、評估、測試並部署軟件補丁和更新的實踐!3、應用程序安全方法包括:配置

管理數據應用程序和主機安全-C

管理數據 應用程序和主機安全 1、應用程序黑名單是指阻止被組織認定的不良程序的執行,為了實施黑名單功能,需要將拒絕訪問系統的應用程序列舉出來,防止它們安裝到目標系統中並在其運行。2、應用程序白名單是指將需要維護的一組允許的應用程序列表,只有這些應用程序才能被允許安裝並運行在目標系統中。白名單是隱式拒絕

絕地求生大逃殺BE啟動失敗應用程序無法正常啟動

應用 str strong body 遊戲 clas img post tro 今日更新絕地求生大逃殺後部分客戶反饋絕地求生點擊啟動提示BE安裝,應用程序無法啟動 問題原因:經過排查發現,客戶開啟過超級工作站運行過遊戲,在系統鏡像包中保留了舊版的BE服務,致使新版BE無法安

web服務器應用程序服務器http服務器的區別

itWEB服務器、應用程序服務器、HTTP服務器有何區別?IIS、Apache、Tomcat、Weblogic、WebSphere都各屬於哪種服務器? 這個概念很重要。 Web服務器的基本功能就是提供Web信息瀏覽服務。它只需支持HTTP協議、HTML文檔格式及URL。與客戶端的瀏覽器配合。因為Web服務器主

Android Service的一些參考資料-轉載連結

我們在開發app時,經常被要求保活應用,避免被Android系統殺死,或者殺死後可以被自動拉起來 大概思路有一下幾個方向: 1、前臺service 2、監聽系統廣播 3、START_ STICKY-粘性啟動 4、onDestory方法重新啟動: 5、提高service優先順序

安卓後臺黑科技 播放無聲音樂

1、準備一段無聲的音訊,新建一個播放音樂的Service類,將播放模式改為無限迴圈播放。在其onDestroy方法中對自己重新啟動。 public class PlayerMusicService extends Service { private final static String TAG

Android Service(執行緒

    Android 系統對於記憶體管理,為了使系統有序穩定的執行,系統內部會自動分配,控制程式的記憶體使用。當系統覺得記憶體的資源非常有限的時候,為了保證一些優先順序高的程式能執行,就會殺掉一些他認為不重要的程式或者服務來釋放記憶體, 比如專案需求需要Service在後臺實時

(轉)lwip TCP client & FreeRTOS 開啟TCP 的 機制 LWIP_TCP_KEEPALIVE==1

參考大神教程:http://blog.sina.com.cn/s/blog_62a85b950101aw8x.html   老衲五木       :http://blog.sina.com.cn/s/blog_62a85b950102vrr4.html   

Zookeeper工作機制應用場景及安裝

Zookeeper 檔案系統 = 儲存資料 通知機制 = 監聽 功能     1、儲存資料:儲存叢集中每臺機器都關心的資料     2、監聽 zookeeper工作機制     基於觀察者模式設計的