Android程式長生不老

weixin_34185364發表於2019-03-01

前言的前言

眾所周知,Android是免費開源的,所以我們每個人都可以獲取到Android原始碼,最近手機耗電厲害,天天提醒,10分鐘耗電20%。
不是,我這幹啥了,就耗電這麼快。後來就網上搜搜看看,到底是怎麼回事。順便逆向了一個萬年曆。

每個產品都想讓自己的程式在後臺能夠長期的執行,不管是監測使用者的行為,還是能夠讓自己正常的push,所以這個問題就引申出來了。
問:如何讓自己的程式長期後臺執行,殺不死。

前言 "前言")前言

看完我自己都驚了,感覺手機每天執行的都是什麼亂七八糟,因為自己手機上裝了這款app,而且這款app要求的許可權異常的多,
所以就直接引起了我的注意,訪問手機就賬戶列表,WIFI狀態,照相機,讀取聯絡人,鎖屏,啟動事件。
一個萬年曆就要這麼多許可權,不禁引起了好奇,所以決定一探究竟

一個萬年曆app是如何保活的 "一個萬年曆app是如何保活的")一個萬年曆app是如何保活的

說起萬年曆如何保活的,用白話來說,就是這麼幾個方法來實現

  • 監聽螢幕亮滅,如果螢幕滅,那麼建立一個1畫素的懸浮層。螢幕亮,把這個1畫素的頁面關閉,防止意外獲取到焦點惹惱使用者
  • 利用賬戶系統,系統定期喚醒賬號更新服務,欺騙系統我們的app有賬號服務,然後定期同步賬戶,再做一些其他的事情
  • android5.0以後可以利用JobSchedulerService,使我們的程式定時被執行,以及一些其他條件

1畫素懸浮層技術實現 "1畫素懸浮層技術實現")1畫素懸浮層技術實現

package cn.etouch.ecalendar.keeplive;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import cn.etouch.ecalendar.manager.ad;
public class KeepLiveActivity extends Activity {
    public static KeepLiveActivity a = null;
    private boolean b = false;
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        
        Window window = getWindow();
        window.setGravity(51);
        //建立一個1畫素的懸浮層
        LayoutParams attributes = window.getAttributes();
        attributes.x = 0;
        attributes.y = 0;
        attributes.width = 1;
        attributes.height = 1;
        window.setAttributes(attributes);
        a = this;
        ad.b("ActivityManager--->KeepLiveActivity onCreate");
    }
    protected void onResume() {
        super.onResume();
        ad.b("ActivityManager--->KeepLiveActivity onResume");
        if (this.b) {
            finish();
        } else {
            this.b = true;
        }
    }
    protected void onDestroy() {
        super.onDestroy();
        a = null;
        ad.b("ActivityManager--->KeepLiveActivity onDestroy");
    }
}

這個類的名稱起的就很好,KeepLiveActivity,保活的頁面,主要就是用於保活。
建立一個1畫素的懸浮層,對於手機來講是可見的,對於人眼來講,幾乎是不可見的,所以我們也無法發現

欺騙系統我們的app有賬戶系統,然後通過定期同步賬戶保活

先看看萬年曆是怎麼做的

13855150-8789841512af7e1b.png

其中EcalendarAccountProvider,SyncAccountService,SyncAccountUtils就是利用系統賬戶更新功能定期同步賬戶,
我們可以看到萬年曆的程式碼


public class EcalendarAccountProvider extends ContentProvider {
    public static final Uri a = Uri.parse("content://cn.etouch.ecalendar.account.provider/data");
    public boolean onCreate() {
        return true;
    }
    public Cursor query(Uri uri, String[] strArr, String str, String[] strArr2, String str2) {
        return null;
    }
    public String getType(Uri uri) {
        return new String();
    }
    public Uri insert(Uri uri, ContentValues contentValues) {
        return null;
    }
    public int delete(Uri uri, String str, String[] strArr) {
        return 0;
    }
    public int update(Uri uri, ContentValues contentValues, String str, String[] strArr) {
        return 0;
    }
}

首先提供一個賬戶相關的ContentProvider,可是這個內部實現卻什麼也不幹,欺騙系統app使用了系統賬戶功能,但是實際上其實只是利用賬戶同步功能長生不老

建立定時迴圈任務保活 "建立定時迴圈任務保活")建立定時迴圈任務保活

前提,android5.0 api21以上
利用系統的JobService來保活,

萬年曆程式碼如下

@TargetApi(21)
   public static void c() {
       try {
           if (aj.v >= 21) {
               Builder builder = new Builder(1, new ComponentName(ApplicationManager.d, JobSchedulerService.class));
               //建立一個60s週期的任務
               builder.setPeriodic(60000);
               builder.setPersisted(true);
               JobScheduler jobScheduler = (JobScheduler) ApplicationManager.d.getSystemService("jobscheduler");
               if (jobScheduler != null) {
                   jobScheduler.schedule(builder.build());
               }
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }

建立一個60s週期的任務,不斷的讓系統定時呼叫我們的程式來保活

還有什麼其他的黑-hen-科-liu-技-mang-的呢 "還有什麼其他的黑(hen)科(liu)技(mang)的呢")還有什麼其他的黑(hen)科(liu)技(mang)的呢

以上說的是萬年曆的,據博主所知還有很多其他的方法,

比如在鎖屏後無限迴圈播放一段無聲的音樂,作為使用者來講是聽不到的,可是作為手機來講是認為你正在放音樂,因此不能結束掉這個程式

或者android4.4以前可以用jni,fork子程式的方法,可以保證解除安裝app後程式仍然可以在手機裡執行

最後給大家分享一份非常系統和全面的Android進階技術大綱及進階資料,及面試題集

想學習更多Android知識,請加入Android技術開發交流 7520 16839

進群與大牛們一起討論,還可獲取Android高階架構資料、原始碼、筆記、視訊

包括 高階UI、Gradle、RxJava、小程式、Hybrid、移動架構、React Native、效能優化等全面的Android高階實踐技術講解效能優化架構思維導圖,和BATJ面試題及答案!

群裡免費分享給有需要的朋友,希望能夠幫助一些在這個行業發展迷茫的,或者想系統深入提升以及困於瓶頸的

朋友,在網上部落格論壇等地方少花些時間找資料,把有限的時間,真正花在學習上,所以我在這免費分享一些架構資料及給大家。希望在這些資料中都有你需要的內容。

13855150-b6421fc405f0fb85.jpg
13855150-ecce3404fa3a9849.png

相關文章