注意:fork类进程守护只适合大部分4.3之前系统
这里需要解释下为什么4.3之前可行,之后不可行
在源码activitymanagerservice中
4.3之前代码为:
Process.killProcessQuiet(pid);
4.3之后代码为:
Process.killProcessQuiet(app.pid);
Process.killProcessGroup(app.info.uid, app.pid);
由于4.3之后谷歌管理进程通过了组的方式,fork出来的进程都会被分到一个组中,所以增加了killProcessGroup代码,杀掉当前组中的所有进程。
fork分析
参考链接:Linux中fork()函数详解
C代码
#include <jni.h>
#include <string.h>
#include <JNIDemo.h>
#include <android/log.h>
#include <unistd.h>
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)//打印android日志
static char TAG[] = "Native.init"; //日志tag
jint Java_com_demo_ndk_so_JNIDemo_whileFork(JNIEnv * env, jobject thiz) {
int pid = fork();
if (0 == pid) //我是子进程
{
while (1) {
//在这里面实现需要的逻辑,在android4.3之前的系统,程序关闭过后子进程不会被kill掉
LOGD("儿子正在循环/n");
sleep(1);
}
} else if (0 > pid) //错误的fork
{
LOGD("error in fork!");
} else { //我是父进程
LOGD("我是孩子他爹/n");
}
return 0;
}
JAVA代码
package com.demo.ndk.so;
public class JNIDemo {
static{
System.loadLibrary("JNIDemo");
}
public static native int whileFork();
}