android防止殺死
A. 請問android APP 如何防止被系統殺死和用戶卸載
這個有點流氓軟體的味道了……
如果是防止被殺,參照一下這里吧(Android開發之如何保證Service不被殺掉)
如果要防止用戶卸載,可以用輔助功能監聽用戶是否點開了軟體卸載頁面,如果點開了,查找頁面文字或ID,檢測一下是不是你的軟體,如果是就點取消。但是需要引導用戶把輔助功能打開。
建議不要這么做,防止被殺可以,但是防止卸載如果被舉報會招到官司的。
B. Android如何避免Service被殺掉,如果被殺掉應如何處理。
service 如果你不是bind綁定啟動的話,你不執行stop應該不會被輕易的殺死. 但是如果你遇上了像360等等手機助手的話,他們會直接的殺死在後台運行的serice,這個是沒法避免的.
至於Service被殺掉 ,你只能打開程序重新啟動一下.舉個例子就是你在後台放歌,你清理的一下手機,如果沒有特殊的設置,放歌的軟體和服務都會被清楚,你只能重新打開軟體
C. 如何防止android程序被kill掉
如應用程序'Phone'的AndroidManifest.xml文件: <application android:name="PhoneApp" android:persistent="true" android:label="@string/dialerIconLabel" android:icon="@drawable/ic_launcher_phone"> ... </application>設置後app提升為系統核心級別,任何情況下不會被kill掉, settings->applications裡面也會屏蔽掉stop操作。 這樣設置前的log: Proc #19: adj=svc /B 4067b028 255:com.xxx.xxx/10001 (started-services) # cat /proc/255/oom_adj 4設置後的log: PERS #19: adj=core /F 406291f0 155:com.xxx.xxx/10001 (fixed) # cat /proc/155/oom_adj -12 # 這是CORE_SERVER_ADJ註:init進程的oom_adj為-16(即SYSTEM_ADJ): cat /proc/1/oom_adjAndroid相關部分分析:在文件frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中有以下的代碼: final ProcessRecord addAppLocked(ApplicationInfo info) { ProcessRecord app = getProcessRecordLocked(info.processName, info.uid); if (app == null) { app = newProcessRecordLocked(null, info, null); mProcessNames.put(info.processName, info.uid, app); updateLruProcessLocked(app, true, true); } if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) == (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) { app.persistent = true; app.maxAdj = CORE_SERVER_ADJ; // 這個常數值為-12。 } if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) { mPersistentStartingProcesses.add(app); startProcessLocked(app, "added application", app.processName); } return app; }可見要想成為core service (即app.maxAdj = CORE_SERVER_ADJ(-12)),應用程序需要FLAG_SYSTEM和FLAG_PERSISTENT兩個標志,FLAG_SYSTEM指的是應用位於/system/app下,FLAG_PERSISTENT就是指persistent屬性。而對於frameworks/base/services/java/com/android/server/SystemServer.java,則調用 ActivityManagerService.setSystemProcess();把自己的 app.maxAdj 設置成SYSTEM_ADJ,即-16。原理:Android中的進程是託管的,當系統進程空間緊張的時候,會依照優先順序自動進行進程的回收。由此帶來三個問題: 1) 回收規則: 什麼時候回收與回收哪一個? 2) 避免誤殺: 如何阻止被回收? 3) 數據恢復與保存: 被回收了怎麼辦? Android將進程分為6個等級,它們按優先順序順序由高到低依次是: 1.前台進程( FOREGROUND_APP) 2.可視進程(VISIBLE_APP ) 3. 次要服務進程(SECONDARY_SERVER ) 4.後台進程 (HIDDEN_APP) 5.內容供應節點(CONTENT_PROVIDER) 6.空進程(EMPTY_APP) 特徵:1.如果一個進程裡面同時包含service和可視的activity,那麼這個進程應該歸於可視進程,而不是service進程。2.另外,如果其他進程依賴於它的話,一個進程的等級可以提高。例如,一個A進程里的service被綁定到B進程里的組件上,進程A將總被認為至少和B進程一樣重要。3.系統中的phone服務被劃分到前台進程而不是次要服務進程. 在android中,進程的oom_adj值也就代表了它的優先順序。oom_adj值越高代表該進程優先順序越低。
D. 如何防止android app被kill
1.在service中重寫下面的方法,這個方法有三個返回值,START_STICKY是service被kill掉後自動重寫創建[代碼]java代碼:@(Intentintent,intflags,intstartId){returnSTART_STICKY;}----------------@(Intentintent,intflags,intstartId){//TODOAuto-generatedmethodstubLog.v("TrafficService","startCommand");flags=START_STICKY;returnsuper.onStartCommand(intent,flags,startId);//returnSTART_REDELIVER_INTENT;}2.在Service的onDestroy()中重啟Service.publicvoidonDestroy(){IntentlocalIntent=newIntent();localIntent.setClass(this,MyService.class);//銷毀時重新啟動Servicethis.startService(localIntent);}用 管家殺掉進程的時候,調用的是系統自帶的強制kill功能(即settings里的),在kill時,會將應用的整個進程停掉,當然包括service在內,如果在running里將service強制kill掉,顯示進程還在。不管是kill整個進程還是只kill掉進應用的service,都不會重新啟動service。不知道你是怎麼實現重啟的,實在是不解。在eclipse中,用stop按鈕kill掉進程的時候,倒是會重啟serviceKILL問題:1.settings中stopserviceonDestroy方法中,調用startService進行Service的重啟。2.settings中forcestop應用捕捉系統進行廣播(action為android.intent.action.PACKAGE_RESTARTED)3.藉助第三方應用kill掉runningtask提升service的優先順序service開機啟動今天我們主要來探討android怎麼讓一個service開機自動啟動功能的實現。Android手機在啟動的過程中會觸發一個StandardBroadcastAction,名字叫android.intent.action.BOOT_COMPLETED(記得只會觸發一次呀),在這里我們可以通過構建一個廣播接收者來接收這個這個action.下面我就來簡單寫以下實現的步驟:第一步:首先創建一個廣播接收者,重構其抽象方法onReceive(Contextcontext,Intentintent),在其中啟動你想要啟動的Service或app。[代碼]java代碼:importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.util.Log;{//重寫onReceive方法@OverridepublicvoidonReceive(Contextcontext,Intentintent){//後邊的XXX.class就是要啟動的服務Intentservice=newIntent(context,XXXclass);context.startService(service);Log.v("TAG","開機自動服務自動啟動..");//啟動應用,參數為需要自動啟動的應用的包名Intentintent=getPackageManager().getLaunchIntentForPackage(packageName);context.startActivity(intent);}}第二步:配置xml文件,在receiver接收這種添加intent-filter配置[代碼]java代碼:第三步:添加許可權如何實現一個不會被殺死的進程看Android的文檔知道,當進程長期不活動,或系統需要資源時,會自動清理門戶,殺死一些Service,和不可見的Activity等所在的進程。但是如果某個進程不想被殺死(如數據緩存進程,或狀態監控進程,或遠程服務進程),應該怎麼做,才能使進程不被殺死。addandroid:persistent="true".xml切記,這個不可濫用,系統中用這個的service,app一多,整個系統就完蛋了。目前系統中有phone等非常有限的,必須一直活著的應用在試用。提升service優先順序的方法Android系統對於內存管理有自己的一套方法,為了保障系統有序穩定的運信,系統內部會自動分配,控製程序的內存使用。當系統覺得當前的資源非常有限的時候,為了保證一些優先順序高的程序能運行,就會殺掉一些他認為不重要的程序或者服務來釋放內存。這樣就能保證真正對用戶有用的程序仍然再運行。如果你的Service碰上了這種情況,多半會先被殺掉。但如果你增加Service的優先順序就能讓他多留一會,我們可以用setForeground(true)來設置Service的優先順序。為什麼是foreground?默認啟動的Service是被標記為background,當前運行的Activity一般被標記為foreground,也就是說你給Service設置了foreground那麼他就和正在運行的Activity類似優先順序得到了一定的提高。當讓這並不能保證你得Service永遠不被殺掉,只是提高了他的優先順序。從Android1.5開始,一個已啟動的service可以調用startForeground(int,Notification)將service置為foreground狀態,調用stopForeground(boolean)將service置為background狀態。我們會在調用startForeground(int,Notification)傳入參數notification,它會在狀態欄里顯示正在進行的foregroundservice。backgroundservice不會在狀態欄里顯示。在Android1.0中,將一個service置為foreground狀態:setForeground(true);mNM.notify(id,notification);將一個service置為background狀態:mNM.cancel(id);setForeground(false);對比看出,在1.0API中調用setForeground(boolean)只是簡單的改變service的狀態,用戶不會有任何覺察。新API中強制將notification和改變service狀態的動作綁定起來,foregroundservice會在狀態欄顯示,而backgroundservice不會。Remoteservicecontroller&binding跨進程調用Service。暫時不研究。如何防止Android應用中的Service被系統回收?很多朋友都在問,如何防止Android應用中的Service被系統回收?下面簡單解答一下。對於Service被系統回收,一般做法是通過提高優先順序可以解決,在AndroidManifest.xml文件中對於intent-filter可以通過android:priority="1000"這個屬性設置最高優先順序,1000是最高值,如果數字越小則優先順序越低,同時實用於廣播,推薦大家如果你的應用很重要,可以考慮通過系統常用intentaction來觸發。
E. android 怎麼保證服務不被殺死
1: 正常 stop service的時候會執行生命周期的 onDestory() 可以在銷毀方法中執行再次 startService();
2: 當收到內存影響的時候,out-of-memory killer會銷毀掉一些優先順序低的app:
相較於/data/app下的應用,放在/system/app下的應用享受更多的特權,
比如若在其Manifest.xml文件中設置persistent屬性為true,
則可使其免受out-of-memory killer的影響。
如應用程序'Phone'的AndroidManifest.xml文件:
<application android:name="PhoneApp"
android:persistent="true"
android:label="@string/dialerIconLabel"
android:icon="@drawable/ic_launcher_phone">
...
</application>
設置後app提升為系統核心級別,任何情況下不會被kill掉,
settings->applications裡面也會屏蔽掉stop操作,再次情況下,發現4.1.2的程序在設置裡面的應用裡面,程序沒有禁止掉停止。
在此情況下還要應用上1的重新啟動。
3: force stop service 的時候,則不執行 onDestory(),
還有一種情況是 第三方任務管理器清理掉整個程序的時候;
google 管方就有,ForegroundService 前台服務,讓服務一直以前台任務的方式運行,可以在service 的oncreate來實現前台服務, 通過這個方法必須發送一個通知欄,讓用戶知道服務在運行。我們可以把service修改成前台運行方式,只不過讓通知notification不去顯示就OK了。
F. Android怎麼防止被系統,殺毒軟體殺死除了添加白名單。
注意保護
給樓主一點建議,希望幫助你了
1、不輕易打開陌生郵件
2、不加陌生好友
3、不亂進不安全網站
4、不亂下載
5、不要亂掃描
6、連接電腦等,主要開啟防火牆
7、注意手機內部保護,安裝安全軟體
騰訊手機管家殺毒保護都不錯的
病毒查殺方面,騰訊手機管家和卡巴斯基雙核查殺,讓手機病毒無所藏身,可以對您的機子進行聯網的雲查殺和備用病毒庫的查殺,更加安全;
8、做好備份,有備無患
建議以後可以備份,把文件放到騰訊手機管家的 微雲網盤中,
打開騰訊手機管家——實用工具——微雲網盤
在微雲網盤中儲存就是真的丟不了了。
G. Android怎麼防止被系統,殺毒軟體殺死除了添加白名單。
只能添加白名單,選擇兼容效果好的殺軟
試試騰訊電腦管家,具有二合一功能,全新的二合一殺毒版電腦管家成功的將殺毒軟體與軟體管理、漏洞修復、系統優化等輔助安全功能融入到了殺毒軟體中,成為全球首款「殺毒+管理」二合一的雙模殺毒軟體。
H. 如何防止android app被kill
相較於/data/app下的應用,放在/system/app下的應用享受更多的特權,比如若在其Manifest.xml文件中設置persistent屬性為true,則可使其免受out-of-memory
killer的影響。如應用程序'Phone'的AndroidManifest.xml文件:
<application
android:name="PhoneApp"
android:persistent="true"
android:label="@string/dialerIconLabel"
android:icon="@drawable/ic_launcher_phone">
...
</application>
設置後app提升為系統核心級別,任何情況下不會被kill掉, settings->applications裡面也會屏蔽掉stop操作。
這樣設置前的log: Proc #19: adj=svc /B 4067b028 255:com.xxx.xxx/10001 (started-services)
# cat /proc/255/oom_adj
4
設置後的log: PERS #19: adj=core /F 406291f0 155:com.xxx.xxx/10001 (fixed)
# cat /proc/155/oom_adj
-12 # 這是CORE_SERVER_ADJ
註:init進程的oom_adj為-16(即SYSTEM_ADJ): cat /proc/1/oom_adj
Android相關部分分析:
在文件frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中有以下的代碼:
final
ProcessRecord addAppLocked(ApplicationInfo info) {
ProcessRecord
app = getProcessRecordLocked(info.processName, info.uid);
if
(app == null) {
app
= newProcessRecordLocked(null, info, null);
mProcessNames.put(info.processName,
info.uid, app);
updateLruProcessLocked(app,
true, true);
}
if
((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
==
(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
app.persistent
= true;
app.maxAdj
= CORE_SERVER_ADJ; //
這個常數值為-12。
}
if
(app.thread == null && mPersistentStartingProcesses.indexOf(app)
< 0) {
mPersistentStartingProcesses.add(app);
startProcessLocked(app,
"added application", app.processName);
}
return
app;
}
可
見要想成為core service (即app.maxAdj =
CORE_SERVER_ADJ(-12)),應用程序需要FLAG_SYSTEM和FLAG_PERSISTENT兩個標志,FLAG_SYSTEM指
的是應用位於/system/app下,FLAG_PERSISTENT就是指persistent屬性。
而對於frameworks/base/services/java/com/android/server/SystemServer.java,則調用
ActivityManagerService.setSystemProcess();
把自己的 app.maxAdj 設置成SYSTEM_ADJ,即-16。
原理:
Android中的進程是託管的,當系統進程空間緊張的時候,會依照優先順序自動進行進程的回收。由此帶來三個問題:
1)
回收規則: 什麼時候回收與回收哪一個?
2)
避免誤殺: 如何阻止被回收?
3)
數據恢復與保存: 被回收了怎麼辦?
Android將進程分為6個等級,它們按優先順序順序由高到低依次是:
1.前台進程(
FOREGROUND_APP)
2.可視進程(VISIBLE_APP
)
3.
次要服務進程(SECONDARY_SERVER )
4.後台進程
(HIDDEN_APP)
5.內容供應節點(CONTENT_PROVIDER)
6.空進程(EMPTY_APP)
特徵:
1.如果一個進程裡面同時包含service和可視的activity,那麼這個進程應該歸於可視進程,而不是service進程。
2.另外,如果其他進程依賴於它的話,一個進程的等級可以提高。例如,一個A進程里的service被綁定到B進程里的組件上,進程A將總被認為至少和B進程一樣重要。
3.系統中的phone服務被劃分到前台進程而不是次要服務進程.
在android中,進程的oom_adj值也就代表了它的優先順序。oom_adj值越高代表該進程優先順序越低。文件/init.rc中有以下屬性設置:
setprop
ro.FOREGROUND_APP_ADJ 0
setprop
ro.VISIBLE_APP_ADJ 1
setprop
ro.SECONDARY_SERVER_ADJ 2
setprop
ro.HIDDEN_APP_MIN_ADJ 7
setprop
ro.CONTENT_PROVIDER_ADJ 14
setprop
ro.EMPTY_APP_ADJ 15
/init.rc中,將PID為1的進程(init進程)的oom_adj設置為SYSTEM_ADJ(-16):
#
Set init its forked children's oom_adj.
write
/proc/1/oom_adj -16
查看本機設置:
cat /sys/mole/lowmemorykiller/parameters/adj
0,1,2,7,14,15
回收時機:
文件/init.rc中:
setprop
ro.FOREGROUND_APP_MEM 1536 // 6M
setprop
ro.VISIBLE_APP_MEM 2048 // 8M
setprop
ro.SECONDARY_SERVER_MEM 4096 // 16M
setprop
ro.HIDDEN_APP_MEM 5120 // 20M
setprop
ro.CONTENT_PROVIDER_MEM 5632 // 22.4M
setprop
ro.EMPTY_APP_MEM 6144 // 24M
這些數字也就是對應的內存閾值,一旦低於該值,Android便開始按順序關閉相應等級的進程。
注意這些數字的單位是page: 1 page = 4 kB。所以上面的六個數字對應的就是(MB): 6,8,16,20,22,24。
查看現在的內存閾值設置:
cat /sys/mole/lowmemorykiller/parameters/minfree
要想重新設置該值(對應不同的需求):
echo "1536,2048,4096,5120,15360,23040">/sys/mole/lowmemorykiller/parameters/minfree
這樣當可用內存低於90MB的時候便開始殺死"空進程",而當可用內存低於60MB的時候才開始殺死"內容供應節點"類進程。
具體的回收實現在ActivityManagerService.java中的函數trimApplications():
1.首先移除package已被卸載的無用進程;
2.基於進程當前狀態,更新oom_adj值,然後進行以下操作:
1)
移除沒有activity在運行的進程;
2)
如果AP已經保存了所有的activity狀態,結束這個AP。
3.
最後,如果目前還是有很多activities 在運行,那麼移除那些activity狀態已經保存好的activity。
更新oom_adj的值:
在ActivityManagerService.java文件的ComputeOomAdjLocked() 中計算出進程的oom_adj,例如:
if
(app == TOP_APP) {
//
The last app on the list is the foreground app.
adj
= FOREGROUND_APP_ADJ;
app.adjType
= "top-activity";
}
Android kernel中的low memory killer
Android的Low Memory Killer根據需要(當系統內存短缺時)殺死進程釋放其內存,源代碼在kernel/drivers/misc/lowmemorykiller.c中。簡單說,就是尋找一個最合適的進程殺死,從而釋放它佔用的內存。
最合適的進程是:
• oom_adj越大
• 佔用物理內存越多
一旦一個進程被選中,內核會發送SIGKILL信號將之殺死:
for_each_process(p)
{
……
if(selected
== NULL || p->oomkilladj
> selected->oomkilladj ||
(p->oomkilladj
== selected->oomkilladj && tasksize > selected_tasksize))
{
selected
= p;
}
}
if(selected
!= NULL) {
force_sig(SIGKILL,
selected);
}
查看LRU列表:adb shell mpsys activity
當activitydemo在前台時:
包含Service的進程的優先順序比較高,在computeOomAdjLocked中將其分為了兩小類:
static
final int MAX_SERVICE_INACTIVITY = 30*60*1000;
if
(now < (s.lastActivity+MAX_SERVICE_INACTIVITY)) {
if
(adj > SECONDARY_SERVER_ADJ) {
adj
= SECONDARY_SERVER_ADJ;
app.adjType
= "started-services";
app.hidden
= false;
}
}
if
(adj > SECONDARY_SERVER_ADJ) {
app.adjType
= "started-bg-services";
}
完全讓進程不被kill是不可能的,我們可以通過一些操作,使進程被kill的幾率變小:
1)
提高進程的優先順序:
*
後台操作採用運行於前台的Service形式,因為一個運行著service的進程比一個運行著後台activity的等級高;
*
按back鍵使得進程中的activity在後台運行而不是destory,需重載back按鍵(沒有任何activity在運行的進程優先被殺).
*
依賴於其他優先順序高的進程;
2)
強制修改進程屬性:
*
在進程中設置:setPersistent(true);
*
在Manifest文件中設置(如上)。
I. android後台服務保持,不被殺死
作者:閉關寫代碼
鏈接:https://www.hu.com/question/29826231/answer/71207109
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
強烈建議不要這么做,不僅僅從用戶角度考慮,作為Android開發者也有責任去維護Android的生態環境。現在很多Android開發工程師,主力機居然是iPhone而不是Android設備,感到相當悲哀。
從技術角度概括一下現在普遍的防殺方法
Service設置成START_STICKY,kill 後會被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣
通過 startForeground將進程設置為前台進程,做前台服務,優先順序和前台應用一個級別,除非在系統內存非常缺,否則此進程不會被 kill
雙進程Service:讓2個進程互相保護,其中一個Service被清理後,另外沒被清理的進程可以立即重啟進程
QQ黑科技:在應用退到後台後,另起一個只有 1 像素的頁面停留在桌面上,讓自己保持前台狀態,保護自己不被後台清理工具殺死
在已經root的設備下,修改相應的許可權文件,將App偽裝成系統級的應用(Android4.0系列的一個漏洞,已經確認可行)
Android系統中當前進程(Process)fork出來的子進程,被系統認為是兩個不同的進程。當父進程被殺死的時候,子進程仍然可以存活,並不受影響。鑒於目前提到的在Android-Service層做雙守護都會失敗,我們可以fork出c進程,多進程守護。死循環在那檢查是否還存在,具體的思路如下(Android5.0以下可行)
用C編寫守護進程(即子進程),守護進程做的事情就是循環檢查目標進程是否存在,不存在則啟動它。
在NDK環境中將1中編寫的C代碼編譯打包成可執行文件(BUILD_EXECUTABLE)。
主進程啟動時將守護進程放入私有目錄下,賦予可執行許可權,啟動它即可。
聯系廠商,加入白名單
------------------------------------------------------
TIP: 面對各種流氓軟體後台常駐問題,建議使用「綠色守護」來解決,可是殺掉那些第三方清理工具難以清除的後台程序
J. android怎麼實現進程不被殺死或殺死後自動重啟
android實現進程不被殺死或殺死後自動重啟的方法為:
1、service +broadcast 可以實現服務不被殺死,就是當service走ondestory的時候,發送一個自定義的廣播,當收到廣播的時候,重新啟動service;
2、至於開機啟動服務的話,得查下開機啟動的方法,其實也很簡單,開機的時候會有很多廣播(包括開機啟動廣播),可以自己寫個廣播接收器,收到廣播後啟動服務程序(備註:以前我實現開機啟動的時候,貌似把應用裝到內存才有效,裝到sd卡的話一直沒用。)