Android下怎么写一个永远不会被KILL掉的进程/服务?也就是不受系统垃圾回收机制(内存管理)影响. 如何实现一个不会被杀死的进程http://ophonesdn.com/forum/archiver/tid-56.html 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 提高Android Service 优先级的方法http://dev.wo.com.cn/bbs/redirect.jsp?tid=10700&goto=lastpost android加守护进程。txt http://wenku.baidu.com/view/8c6314707fd5360cba1adbc1.html 说说守护进程 http://farsight.blog.51cto.com/1821374/379944 将自己的程序永久写入Android的/system/bin的方法http://hi.baidu.com/mcu99/blog/item/954a511085280509203f2e3a.htmlAndroid模拟器运行之后,/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.cLOCAL_PRELINK_MODULE := falseLOCAL_MODULE:= myhardinclude $(BUILD_EXECUTABLE)做好这些之后,回到总的Android源码目录下,然后执行make,如果你之前已经make过了,那么这个过程会很快,几分钟吧。因为和上一次make相比,源码改动很少,只是加了1个文件夹和2个文件而已。如果你这是第一次make,那么会比较慢,或许大约要1-2个小时,速度应该也和机器配置有关。make成功之后,运行emulator模拟器,用adb shell进入模拟器终端,cd /system/bin,就可以找到你的程序了(注意名字是myhard,不是hard,也不是my_hardware,这里产生的程序名字由上面程序中红色字体的那一行控制)。而且再次启动之后也不会丢失。 守护进程又称精灵进程(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); }很多学生就会问,为什么要创建两次进程呢,这是因为第三步结束后,进程创建了一个新的会话组,并成为会话组长,而会话组长可能获得控制终端,如果获得了控制终端那么或这个进程就不是守护进程了。所以添加了这几句代码,让进程失去会话组长的身份,从而没有获得控制终端的权限。 android使用socket使底层和framework通信http://fanwei51880.blog.163.com/blog/static/32406740201011150240981/ android下的RIL通信就是一个通过守护进程用SOCKET来通信的例子!!! 常见的100个linux守护进程 http://sunyu.blog.51cto.com/744725/320647 今天总算写成功了一个守护进程并实现开机运行,开始加载不了服务原来是因为SERVICE NAME用的太长了,超过了16的限制 Microsoft Windows XP [版本 5.1.2600](C) 版权所有 1985-2001 Microsoft Corp.C:\Documents and Settings\Administrator>adb shell# dumpsys activitydumpsys 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/com.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.launcher/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# 怎样使一个Android应用不被杀死?(整理)http://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.html 谢谢楼主的分享~可为什么我在dumpsys activity命令中找不到oom_adj?看不到进程的优先级~? 我想将phone进程停止,把president这项改成了false,烧到机器里面之后,显示“通讯录服务停止”,进程也起不来了。我又将president改成true,烧到机器里,还是起不来,是为什么? 没看明白,application的值还是会被清空 新手求教 测试Android中Bluetooth的功能 请教webview 2.2真机下崩溃的原因 Android源码编译出现错误 android播放.mp4文件时怎么消除原唱,跟KTV里K歌时消除原声类似的效果? 在Android平台下得到自己的地理位置!!!!! 安卓webview加载的网页如何放大 求android项目使用maven的意义? 手机C/S软件如何验证用户 android开发中客户端数据上传到服务器上 android 下 代码如何实现apk静态安装 关于Android手机NFC的使用
http://farsight.blog.51cto.com/1821374/379944
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,这里产生的程序名字由上面程序中红色字体的那一行控制)。而且再次启动之后也不会丢失。
守护进程又称精灵进程(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);
}很多学生就会问,为什么要创建两次进程呢,这是因为第三步结束后,进程创建了一个新的会话组,并成为会话组长,而会话组长可能获得控制终端,如果获得了控制终端那么或这个进程就不是守护进程了。所以添加了这几句代码,让进程失去会话组长的身份,从而没有获得控制终端的权限。
http://sunyu.blog.51cto.com/744725/320647
(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
#
http://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.html