Android程式長生不老
前言的前言
眾所周知,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有賬戶系統,然後通過定期同步賬戶保活
先看看萬年曆是怎麼做的
其中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面試題及答案!
群裡免費分享給有需要的朋友,希望能夠幫助一些在這個行業發展迷茫的,或者想系統深入提升以及困於瓶頸的
朋友,在網上部落格論壇等地方少花些時間找資料,把有限的時間,真正花在學習上,所以我在這免費分享一些架構資料及給大家。希望在這些資料中都有你需要的內容。
相關文章
- 怎樣才能長生不老——資料資訊圖
- OpenAI奧特曼豪賭1.42億破解長生不老OpenAI奧特曼
- 『 不老 』程式設計師之修煉指南程式設計師
- 程式也想長生不死
- IT人永遠不老,老程式設計師價值何在?程式設計師
- yum命令詳解-(轉自草根不老閣)
- 推送——Android程式設計師‘一生的痛’!!Android程式設計師
- Android從啟動到程式執行發生的事情Android
- 《第一行程式碼——Android》封面誕生記行程Android
- 日媒:阿里出資魅族是在尋找不老之道阿里
- Android平臺每18秒就有一個惡意程式誕生Android
- 10個在Google實驗室誕生的Android應用程式GoAndroid
- Android:程式碼擼彩妝 2(大眼,瘦臉,大長腿)Android
- 覓長生 for Mac(修仙角色扮演遊戲)Mac遊戲
- 覓長生 mac CrossOver 快樂遊玩MacROS
- Java誕生二十週年:回顧程式設計世界主宰的成長曆程Java程式設計
- Android要走路還很長Android
- Android進行長圖分享Android
- 生於雲、長於雲,RocketMQ 5.0 再出發MQ
- 一起構建Python生長土壤Python
- HTML5已死;HTML5長生!HTML
- 程式碼生 成器:程式設計師生產力快速提升工具程式設計師
- Android解析WindowManagerService(一)WMS的誕生Android
- Android長截圖的實現Android
- 不老傳奇,東軟的生存之道!(內含技術路線圖)
- 覓長生Mac版蘋果電腦Mac修仙遊戲Mac蘋果遊戲
- 中國真的沒有軟體生長的土壤嗎?
- JAVA 程式的一生Java
- 一個Android路由框架的誕生之路Android路由框架
- android ANR產生原因和解決辦法Android
- Xamarin Android長度單位區別Android
- Android 5.0 長啥樣?看這裡Android
- Android成長史–資料資訊圖Android
- 產生10個長度不超過10的字串字串
- 加密勒索病毒:誕生、忽視以及爆炸式增長加密
- 從程式設計到養生程式設計程式設計
- 養生吧,程式設計師!程式設計師
- C#學生選課程式C#