Android下怎么写一个永远不会被KILL掉的进程/服务?也就是不受系统垃圾回收机制(内存管理)影响.

xqhrs232 2011-03-12 11:26:36
Android下怎么写一个永远不会被KILL掉的进程/服务?也就是不受系统垃圾回收机制(内存管理)影响.
...全文
29726 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzqqian 2013-11-29
  • 打赏
  • 举报
回复
好文,必须顶!!!
hcgeng 2013-11-11
  • 打赏
  • 举报
回复
godwanglong 2013-04-14
  • 打赏
  • 举报
回复
mark 明天上班看
mfkxk298 2012-09-27
  • 打赏
  • 举报
回复
没看明白,application的值还是会被清空
qwrqweertrewr 2012-09-07
  • 打赏
  • 举报
回复
我想将phone进程停止,把president这项改成了false,烧到机器里面之后,显示“通讯录服务停止”,进程也起不来了。我又将president改成true,烧到机器里,还是起不来,是为什么?
qwrqweertrewr 2012-09-06
  • 打赏
  • 举报
回复
谢谢楼主的分享~可为什么我在dumpsys activity命令中找不到oom_adj?看不到进程的优先级~?
xiazhiyous 2012-07-16
  • 打赏
  • 举报
回复
楼主,怎么实现用户手动杀死服务后,让服务继续运行,实现相应的逻辑代码
akwood1 2012-01-17
  • 打赏
  • 举报
回复
感谢楼主和各位分享。慢慢研究。
xqhrs232 2011-12-25
  • 打赏
  • 举报
回复
怎样使一个Android应用不被杀死?(整理)
http://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.html
xqhrs232 2011-04-20
  • 打赏
  • 举报
回复


Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\Administrator>adb shell
# dumpsys activity
dumpsys activity

Sticky broadcasts:
* Sticky action android.media.RINGER_MODE_CHANGED:
Intent: act=android.media.RINGER_MODE_CHANGED flg=0x70000000
Bundle[{android.media.EXTRA_RINGER_MODE=2}]
* Sticky action android.intent.action.BATTERY_CHANGED:
Intent: act=android.intent.action.BATTERY_CHANGED flg=0x60000000
Bundle[{icon-small=17302169, present=true, scale=100, level=85, technology=Li-ion, status=2, voltage=8536, plugged
=1, health=2, temperature=250}]
* Sticky action android.net.thrott.THROTTLE_ACTION:
Intent: act=android.net.thrott.THROTTLE_ACTION
Bundle[{level=-1}]
* Sticky action android.net.thrott.POLL_ACTION:
Intent: act=android.net.thrott.POLL_ACTION
Bundle[{cycleRead=0, cycleStart=1294358400000, cycleEnd=1297036800000, cycleWrite=0}]

Activity stack:
* TaskRecord{45f1a690 #2 A com.android.launcher}
clearOnBackground=true numActivities=1 rootWasReset=false
affinity=com.android.launcher
intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/co
m.android.launcher2.Launcher}
realActivity=com.android.launcher/com.android.launcher2.Launcher
lastActiveTime=3094388 (inactive for 1411s)
* Hist #0: HistoryRecord{45efe298 com.android.launcher/com.android.launcher2.Launcher}
packageName=com.android.launcher processName=com.android.launcher
launchedFromUid=0 app=ProcessRecord{45f1ab80 968:com.android.launcher/10010}
Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launch
er/com.android.launcher2.Launcher }
frontOfTask=true task=TaskRecord{45f1a690 #2 A com.android.launcher}
taskAffinity=com.android.launcher
realActivity=com.android.launcher/com.android.launcher2.Launcher
base=/system/app/Launcher2.apk/system/app/Launcher2.apk data=/data/data/com.android.launcher
labelRes=0x7f0c0002 icon=0x7f020048 theme=0x7f0d0000
stateNotNeeded=true componentSpecified=false isHomeActivity=true
configuration={ scale=1.0 imsi=0/0 loc=md_US touch=3 keys=2/1/2 nav=3/1 orien=2 layout=35 uiMode=17 seq=2}
launchFailed=false haveState=false icicle=null
state=RESUMED stopped=false delayedResume=false finishing=false
keysPaused=false inHistory=true persistent=false launchMode=2
fullscreen=true visible=true frozenBeforeDestroy=false thumbnailNeeded=false idle=true
waitingVisible=false nowVisible=true

Running activities (most recent first):
TaskRecord{45f1a690 #2 A com.android.launcher}
Run #0: HistoryRecord{45efe298 com.android.launcher/com.android.launcher2.Launcher}

mPausingActivity: null
mResumedActivity: HistoryRecord{45efe298 com.android.launcher/com.android.launcher2.Launcher}
mFocusedActivity: HistoryRecord{45efe298 com.android.launcher/com.android.launcher2.Launcher}
mLastPausedActivity: HistoryRecord{45f0ee48 com.KT.NDKOpenGL_AppSwitch/.NDKOpenGL_AppSwitch}

mCurTask: 5

Running processes (most recent first):
App #12: adj=vis /F 45e23f30 963:com.android.inputmethod.latin/10022 (service)
com.android.inputmethod.latin.LatinIME<=ProcessRecord{45de0768 894:system/1000}
PERS #11: adj=sys /F 45de0768 894:system/1000 (fixed)
App #10: adj=fore /F 45f1ab80 968:com.android.launcher/10010 (top-activity)
App # 9: adj=bak /B 45e26a20 970:com.android.settings/1000 (bg-empty)
App # 8: adj=bak+1/B 45e15af0 1029:android.process.media/10004 (bg-empty)
App # 7: adj=bak+2/B 45df5ae8 1101:com.android.quicksearchbox/10015 (bg-empty)
App # 6: adj=bak+3/B 45de2d80 1087:com.android.providers.calendar/10023 (bg-empty)
App # 5: adj=bak+4/B 45fe5548 1076:com.android.bluetooth/10020 (bg-empty)
App # 4: adj=bak+5/B 45fd7ea8 1058:com.android.email/10017 (bg-empty)
App # 3: adj=bak+6/B 45f2d398 1019:com.android.deskclock/10000 (bg-empty)
App # 2: adj=bak+7/B 45ef5280 1116:com.android.protips/10025 (bg-empty)
App # 1: adj=empty/B 45ebfa58 1109:com.android.music/10024 (bg-empty)
App # 0: adj=empty/B 45e64e20 999:android.process.acore/10005 (bg-empty)

PID mappings:
PID #894: ProcessRecord{45de0768 894:system/1000}
PID #963: ProcessRecord{45e23f30 963:com.android.inputmethod.latin/10022}
PID #968: ProcessRecord{45f1ab80 968:com.android.launcher/10010}
PID #970: ProcessRecord{45e26a20 970:com.android.settings/1000}
PID #999: ProcessRecord{45e64e20 999:android.process.acore/10005}
PID #1019: ProcessRecord{45f2d398 1019:com.android.deskclock/10000}
PID #1029: ProcessRecord{45e15af0 1029:android.process.media/10004}
PID #1058: ProcessRecord{45fd7ea8 1058:com.android.email/10017}
PID #1076: ProcessRecord{45fe5548 1076:com.android.bluetooth/10020}
PID #1087: ProcessRecord{45de2d80 1087:com.android.providers.calendar/10023}
PID #1101: ProcessRecord{45df5ae8 1101:com.android.quicksearchbox/10015}
PID #1109: ProcessRecord{45ebfa58 1109:com.android.music/10024}
PID #1116: ProcessRecord{45ef5280 1116:com.android.protips/10025}

Time since processes crashed:
Process com.KT.NDKOpenGL_AppSwitch uid 10046: last crashed 1112183 ms ago

mHomeProcess: ProcessRecord{45f1ab80 968:com.android.launcher/10010}
mConfiguration: { scale=1.0 imsi=0/0 loc=md_US touch=3 keys=2/1/2 nav=3/1 orien=2 layout=35 uiMode=17 seq=2}
mConfigWillChange: false
mSleeping=false mShuttingDown=false
#

xqhrs232 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 deagis 的回复:]
感谢楼主的分享
通过楼主的知识和这篇文章
http://blog.sina.com.cn/s/blog_4d66a3cb0100prfe.html
总算实现了目标。通过在androidmanifest.xml中的application标签中加入android:persistent="true"属性后的确就能够达到保证该应用程序所在进程不会被LMK杀死。但有个前提就是应用程序必须是系统应用,也……
[/Quote]

同样也感谢你的分享!!!
deagis 2011-04-19
  • 打赏
  • 举报
回复
感谢楼主的分享
通过楼主的知识和这篇文章
http://blog.sina.com.cn/s/blog_4d66a3cb0100prfe.html
总算实现了目标。通过在androidmanifest.xml中的application标签中加入android:persistent="true"属性后的确就能够达到保证该应用程序所在进程不会被LMK杀死。但有个前提就是应用程序必须是系统应用,也就是说应用程序不能采用通常的安装方式。必须将应用程序的apk包直接放到/system/app目录下。而且必须重启系统后才能生效。
除了一般的几种优先级外,还存在着coreserver,system这样的永远不会被LMK回收的优先级。系统中的电话应用就是coreserver优先级的。
通过查看源代码可以知道,只有应用程序的flag同时为FLAG_SYSTEM和FLAG_PERSISTENT时,才会被设置为coreserver优先级

if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
== (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
app.persistent = true;
app.maxAdj = CORE_SERVER_ADJ;
}

FLAG_SYSTEM在应用程序apk放在/system/app下时会被设置。所以才会出现只设置android:persistent="true"仍然会被杀死的情况。
测试时发现,将应用程序放到/system/app后不重启系统,仍然会被识别为普通的进程。当系统重新启动时,会在一开始就启动该进程并把它优先级设置为coreserver。
通过dumpsys activity命令能够很明显的看出其中差别。
Running processes (most recent first):
App # 3: adj= 2/1 ProcessRecord{30858c20 1877:com.android.email/10014} (started-services)
PERS # 2: adj=-100/0 ProcessRecord{308fb390 1713:system/1000} (fixed)
App # 1: adj= 0/0 ProcessRecord{30908198 1794:android.process.acore/10005} (top-activity)
PERS # 0: adj= -12/0 ProcessRecord{3090d488 1789:xiao.xiong.test/10026} (fixed)
而且adj=-12时,这个进程通过ddms手动stop后会立即启动
xqhrs232 2011-03-16
  • 打赏
  • 举报
回复
常见的100个linux守护进程


http://sunyu.blog.51cto.com/744725/320647
xqhrs232 2011-03-16
  • 打赏
  • 举报
回复
今天总算写成功了一个守护进程并实现开机运行,开始加载不了服务原来是因为SERVICE NAME用的太长了,超过了16的限制
xqhrs232 2011-03-15
  • 打赏
  • 举报
回复
android下的RIL通信就是一个通过守护进程用SOCKET来通信的例子!!!
qthsrs232 2011-03-15
  • 打赏
  • 举报
回复
android使用socket使底层和framework通信

http://fanwei51880.blog.163.com/blog/static/32406740201011150240981/
xqhrs232 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 freshui 的回复:]
写不出来的。
这么厉害的东西,只有固件开发才可能实现,应用就不要去琢磨了。
[/Quote]

简单的守护进程应该可以写的!!!
xqhrs232 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xqhrs232 的回复:]
说说守护进程
http://farsight.blog.51cto.com/1821374/379944
[/Quote]



守护进程又称精灵进程(daemon),一般在系统启动时开始,而在系统关闭时终止。没有控制终端,运行在后台。在linux系统中有很多这类进程。

下面说一下如何创建一个守护进程。

(1) 使用umask修改文件的屏蔽字,为文件赋予跟多的权限,因为继承来的文件可能某些权限被屏蔽,从而失去某些功能,如读写。
(2) 调用fork函数创建一个子进程,而父进程退出。
(3) 调用settid创建一个新会话,当前进程为会话组长,并且关闭控制终端。
(4) 修改进程工作目录为根目录,chdir(“/”).
(5) 关闭不需要的从父进程继承过来的文件描述符。
(6) 打开/dev/null,null也称黑洞设备,就是写入或读出什么都没有效果。代开这个设备是文件具有0,1,2三个文件描述符,但是对标准输入,标准输出,标准出错的操作都没有效果。这部分内容不是必须的。

下面使用一个例程说一下这个过程。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/resource.h>

int main()
{

pid_t pid;
struct rlimit r;
int i;

//XXX step 1:set umask
umask(0);

//XXX setp 2:fork
if((pid = fork()) < 0)
{
perror("fork");
exit(0);
}
else if(pid != 0)
{
exit(0);
}

//XXX step 3:setsid
setsid();

//XXX step 4:chdir
chdir("/");

//XXX step 5:close all open file descriptors
if(r.rlim_max == RLIM_INFINITY)
{
r.rlim_max = 1024;
}
for(i = 0; i < r.rlim_max; i++)
{
close(i);
}

while(1)
{

}
return 0;
}

上面便是一个守护进程的创建过程,可是一些书或网络上写守护进程,会在第三步和第四步之间添加这样一点代码。

if((pid = fork()) < 0)
{
perror("fork");
exit(0);
}
else if(pid != 0)
{
exit(0);
}

很多学生就会问,为什么要创建两次进程呢,这是因为第三步结束后,进程创建了一个新的会话组,并成为会话组长,而会话组长可能获得控制终端,如果获得了控制终端那么或这个进程就不是守护进程了。所以添加了这几句代码,让进程失去会话组长的身份,从而没有获得控制终端的权限。



xqhrs232 2011-03-15
  • 打赏
  • 举报
回复
将自己的程序永久写入Android的/system/bin的方法

http://hi.baidu.com/mcu99/blog/item/954a511085280509203f2e3a.html


Android模拟器运行之后,/system目录即为只读属性。如果想把自己的程序传到该目录下运行,就会发现无法成功。当然,使用adb remount命令可以暂时去除它的只读限制,可以向里面传文件,但是一旦重启Android模拟器,再次使用adb shell进入模拟器终端时就会发现,自己传进去的文件在重启之后被清除掉了。

当然,你可以把文件传到/data文件夹下,这个文件夹不用remount就可写,而且重启模拟器之后自己的文件也不会被清空。但是如果我想做一个较为底层的程序,或者开机启动的程序,每次开机在/data下启动总是显得怪怪的。最好能让自己编写的程序也能享受到Android自带的那些程序的地位,每次运行在system/bin目录下。这可以通过把自己的程序代码加在Android源码中,然后重新make的方法实现。

首先根据你工程的性质,在Android源码的相应位置建立一个文件夹。比如我的这个程序如果和硬件有关的话,可以在hardware下建立一个叫做my_hardware的文件夹,然后把自己的程序源码放在里面,比如叫hard.c。

再给这个程序写一个makefile文件,好让make的时候可以自动找到你的程序并对它进行编译。起名字叫做Android.mk,这个名字不能随便起,否则make不认识。把这个Android.mk和hard.c都放在my_hardware下面。

# Android.mk文件内容举例
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
hard.c
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE:= myhard
include $(BUILD_EXECUTABLE)

做好这些之后,回到总的Android源码目录下,然后执行make,如果你之前已经make过了,那么这个过程会很快,几分钟吧。因为和上一次make相比,源码改动很少,只是加了1个文件夹和2个文件而已。如果你这是第一次make,那么会比较慢,或许大约要1-2个小时,速度应该也和机器配置有关。

make成功之后,运行emulator模拟器,用adb shell进入模拟器终端,cd /system/bin,就可以找到你的程序了(注意名字是myhard,不是hard,也不是my_hardware,这里产生的程序名字由上面程序中红色字体的那一行控制)。而且再次启动之后也不会丢失。


freshui 2011-03-15
  • 打赏
  • 举报
回复
写不出来的。
这么厉害的东西,只有固件开发才可能实现,应用就不要去琢磨了。
加载更多回复(10)

80,267

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧