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奧特曼
- 『 不老 』程式設計師之修煉指南程式設計師
- Science:科學家發現能促使黑色素瘤“長生不老”的關鍵遺傳因素
- IT人永遠不老,老程式設計師價值何在?程式設計師
- 青春不老我們不散
- 推送——Android程式設計師‘一生的痛’!!Android程式設計師
- Android:程式碼擼彩妝 2(大眼,瘦臉,大長腿)Android
- Android應用程式啟動原始碼淺析-(三萬字長文慎點&Android14)Android原始碼
- 經典不老,萬古長青,欣賞e和e的非0有理數次方的無理性證明。
- Android要走路還很長Android
- Android長截圖的實現Android
- Android啟動過程-萬字長文(Android14)Android
- Google:2018年Android 生態安全報告GoAndroid
- 一個Android路由框架的誕生之路Android路由框架
- [Android]你不知道的Android程式化–程式資訊Android
- Android程式設計基礎 • 【第1章 Android程式入門】Android程式設計
- CSOL :被忽略的生長之痛
- 程式碼生 成器:程式設計師生產力快速提升工具程式設計師
- 如何增長程式碼長度
- Android跨程式通訊Android
- android HAL層程式碼Android
- 下載Android程式碼Android
- Android 多程式通訊Android
- Android UsbDeviceManager 程式碼分析Androiddev
- 生產者與消費者之Android audioAndroid
- 不老傳奇,東軟的生存之道!(內含技術路線圖)
- Android 架構之長連線技術Android架構
- 一起構建Python生長土壤Python
- 覓長生 mac CrossOver 快樂遊玩MacROS
- [Android]你不知道的Android程式化(6)--程式通訊Andromeda框架Android框架
- [Android]你不知道的Android程式化(5)--程式通訊Messenger框架AndroidMessenger框架
- [Android]你不知道的Android程式化(4)--程式通訊AIDL框架AndroidAI框架
- android 混淆規則作用,Android程式碼混淆詳解Android
- Android-返回桌面?退出程式?Android
- android USB host程式設計Android程式設計
- Android P 加密程式變更Android加密
- Android Note - 程式碼優化Android優化
- android程式和執行緒Android執行緒