Android组件保活,service保活

首先介绍一下android的进程. Android 进程分为两种 :其一,java层的进程,也就是在虚拟机里运行的进程,他们的父进程是zygote进程,我们平时调用的AM里面的类似getrunningprocess()方法,返回的就是这类进程信息,这类进程很容易被杀死。其二,native层的原生进程
也就是linux c的进程,这类进程比较安全,其中父进程是init进程的更加安全,很难杀死,在linux里叫守护进程,像surfaceflinger(控制界面呈现)进程,一旦启动会在底层一直运行。

那么 我们的目的就是要写一个守护进程 实时监视自己app java层进程的情况 如果被杀死 就立即创建。

首先是最重要的守护程序代码
linuxC的 带注释

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
/**
*守护进程的名字"/proc/pid/status"文件的第一行 linux内核把所有进程信息的节点映射在了"/proc"下
*注意不同android版本 status里进程名字格式可能不一样
*楼主的4.0.3是下面这行 具体的自己到/proc里看一下
**/
char *procdeam = "Name: com.gy.textndk";
//判断进程是否还在运行
int ifprocrun(char *rootpath)
{
DIR *dir;
struct dirent *ptr; //遍历文件夹需要dirent结构体
int bufsize = strlen(procdeam);

if((dir = opendir(rootpath)) == NULL)
{
perror("dir opened failed\n");
exit(1);
}

//遍历"/proc"下所有文件夹
while((ptr = readdir(dir)) != NULL)
{
if(ptr->d_type == 4)
{
char path[128];
memset(path,'\0',sizeof(path));
strcpy(path,rootpath);
strcat(path,"/");
strcat(path,ptr->d_name);
strcat(path,"/status");
//判断是否存在"status" 文件
if(access(path,F_OK) != -1)
{
int fd = open(path,O_RDONLY);
char tmp_buf[bufsize];
read(fd,tmp_buf,bufsize);
close(fd);
printf(tmp_buf,"\n");
//判断进程名是否相等
if(strcmp(tmp_buf,procdeam) == 0)
{
printf("-----------------proc is running------------------\n");
return 1;
}
}
}
}
return 0;
}
int main()
{
int i;
int fd;
//1.创建子进程,结束父进程,子进程由init接管成为守护进程
pid_t pid = fork();
if(pid<0)
exit(1);
else if(pid>0)
exit(0);
//设置新的 session
setsid();
//2.关闭所有fd管道
for(i=0;i<=48608;i++)
{
close(i);
}
//3.改变工作目录到跟文件夹
chdir("/");
//4.umask
umask(0);
//5.do sth
while(1)
{

if(ifprocrun("/proc") == 0)
{
//调用app_process 的命令 "com.gy.Autostart_Activity"这个实在manifest里注册的 intent-filter action
//自己定义 这样AMS才能根据action启动你app组件 类似注册表
system("am start -a com.gy.Autostart_Activity");
}
sleep(10); //10s判断一次 自己定
}
}

上面这个程序不能用arm-linux-gcc编译
因为不支持 android新版的 程序调用接口,用 ndk-build命令编译 源码放在名叫的jni目录下

接下来就是实现把编译好的linux
c守护程序打包进apk并在安装时将其释放到data目录下,便于运行。

首先将编译好的linux
c程序放进assets文件夹

下面就是java层释放assets资源文件并且运行的代码,涉及jni

package com.gy.textndk;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.widget.TextView;
import android.os.Bundle;

public class HelloJni extends Activity
{
/** Called when the activity is first created. */
private static String TAG = "gy";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
/* Create a TextView and set its content.
* the text is retrieved by calling a native
* function.
*/
TextView tv = new TextView(this);
tv.setText( stringFromJNI() );
setContentView(tv);
StringBuilder sb = new StringBuilder();
sb.append(getAppPrivateDir(this)).append("/gyarmdeomproc");
copyAsset(HelloJni.this, "gyarmdeomproc", sb.toString());
startproc();
}
/* A native method that is implemented by the
* 'hello-jni' native library, which is packaged
* with this application.
*/
public native String stringFromJNI();
/* This is another native method declaration that is *not*
* implemented by 'hello-jni'. This is simply to show that
* you can declare as many native methods in your Java code
* as you want, their implementation is searched in the
* currently loaded native libraries only the first time
* you call them.
*
* Trying to call this function will result in a
* java.lang.UnsatisfiedLinkError exception !
*/
public native String unimplementedStringFromJNI();

public native int startproc();
/* this is used to load the 'hello-jni' library on application
* startup. The library has already been unpacked into
* /data/data/com.example.hellojni/lib/libhello-jni.so at
* installation time by the package manager.
*/
static {
System.loadLibrary("hello-jni");
}

//文件复制
public static boolean copyStream(InputStream in, OutputStream out) {
Log.d(TAG, "copyStream("+ in + " ," + out+ ")");
try {
byte[] buf = new byte[8192];
int len;
while ((len = in.read(buf)) > 0)
out.write(buf, 0, len);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}

//获得app私有文件夹路径
public static String getAppPrivateDir(Context ctx) {
File dataDir = ctx.getDir("data", Context.MODE_PRIVATE);
return dataDir.getAbsolutePath();
}

//拷贝assets资源文件到data私有文件夹下
public static boolean copyAsset(Context ctx, String assetFile,
String saveToFile) {
Log.d(TAG, "copyAssets(" + assetFile + " -> " + saveToFile);
File outputFile = new File(saveToFile);
if (outputFile.exists()) {
return true;
}
// init output stream(file)
OutputStream out;
try {
out = new FileOutputStream(outputFile);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
return false;
}
boolean copyResult = false;
InputStream in = null;
try {
in = ctx.getAssets().open(assetFile);
copyResult = copyStream(in, out);
Log.d(TAG, "copy " + assetFile + " - " + copyResult);
} catch (IOException e1) {
e1.printStackTrace();
} finally {
// close input stream(file)
try {
if (in != null)
in.close();
} catch (IOException e) {
}
}
// close output stream (file)
try {
if (out != null)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
// return copy result
// add file execute permission
File fs = new File(saveToFile);
try {
//这句很重要 赋予文件可执行权限 不然文件无法执行
fs.setExecutable(true, true);
} catch (Exception e) {
e.printStackTrace();
}
Log.d(TAG, "copyAsset() return " + copyResult);
return copyResult;
}
}

最后 是jni的c代码 很简单 直接调用

/*
* deomproc.c
*
* Created on: 2015年2月9日
* Author: gy

#include <jni.h>
#include <unistd.h>
#include <stdlib.h>
JNIEXPORT jint JNICALL Java_com_gy_textndk_HelloJni_startproc()
{
system("/data/data/com.gy.textndk/app_data/gyarmdeomproc");
}

时间: 2024-08-09 22:46:31

Android组件保活,service保活的相关文章

Android 组件之Service解析

原创文章,转载请注明 http://blog.csdn.net/leejizhou/article/details/50866875 李济洲的博客 Service是Android四大组件之中的一个.Service主要作用于后台,能够进行一些后台的操作,它没实用户界面.它跟Activity比較类似,某种意义上能够理解为"Service是没实用户界面的Activity",那么我们什么时候须要使用Service呢?比如:音乐App正在播放音乐我们想切换到阅读App又不想让音乐停止就会用到Se

Android组件之Service浅谈

Service是Android中的四大组件之一,和windows中的服务是类似,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序Service,手机中有的程序的更新,服务的推送.Android系统中,Service与Activity类似,都需要AndroidManifest.xml文件中配置,而且生命周期有点类似.Service不像Activity在前台运行,而是默默的在后台默默的工作,简单粗暴点理解就是男主内女主外,分工明确. Service生命周期 s

Android四大组件之Service

服务(Service) 是一种在后台运行,没有界面的组件,由其他组件调用开始.Android 中的服务和 Windows 中的服务是类似的东西,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序. 服务(Service)的实现 1. 定义一个类EchoService并继承自Service,重写 onCreate(). onStart(Intent intent, int startId). onBind(Intent intent). onUnbind(Intent intent).

Android开发四大组件之Service(实例篇)

关于Service的开发详解已经在上一篇:Android开发四大组件之Service(详解篇)讲的很清楚了,本篇主要对Service的开发实例做下讲解. 程序运行效果图: 程序代码: BindService: package com.jph.servicedemo; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; /**

Android 四大组件之Service(上)

1.Service简介 Service是Android四大组件中最与Activity相似的组件,他们都代表可执行的程序.Service一直运行于后台,不会与用户交互,可用来处理一些耗时的任务(比如:后台播放音乐,I/O操作等).它的创建.配置与Activity基本相似,下面将详细介绍Android Service的开发. 2.创建.配置Service 2.1 定义一个继承Service类的子类 2.2 在AndroidManifest.xml中配置该Service 需要注意的是 Service和

Android 四大组件之 Service(二)

这里主要介绍Service组件的使用. 1.定义一个继承Service的子类 如下: package com.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class defaultService extends Service { int mStartMode; // indicates how to behave if the serv

Android四大组件之Service的介绍

Service的基本认识 Service是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件.Service可由其他应用组件启动,而且即使用户切换到其他应用,Service仍将在后台继续运行.Service主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态. Service和Activity很相似,但是区别在于:Service一直在后台运行,没有用户界面,所以不会到前台,如果Service被

Android 四大组件之Service详解

                   Android四大组件之Service详解    来这实习已经10多天了,今天整理整理学习时的Android笔记.正所谓好记性不如烂笔头,今天来说说service组件. service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的. Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个

深入剖析Android四大组件(二)——Service服务之启动与绑定

如果说Activity通常都会提供一个用户界面UI的话,那么服务则不会提供任何用户界面,尽管如此,服务的作用仍然非常重要,它为我们提供了一种类似守护线程的手段来维持一些希望在退出以后仍然能持续运行的程序. 1.服务 既然服务的作用如此重要,本篇主要讲解如何使用服务和声明应用程序服务,下一节讲解怎么高效率的运用服务. ①何为服务 服务是一个应用程序组件,它在后台执行运行时间比较长的操作,不提供用户界面.它可以被其他应用程序组件启动或停止,并且当用户切换到另一个应用程序时,它仍然在后台持续的运行.另

Android组件系列----Android Service深入解析

花了周末两天的时间,整理了一下作为Android四大组件之一的Service的基础知识,通过这篇文章,应该可以明白:对Service的理解.在什么地方使用.怎么使用.要注意哪些问题等. [本文主要内容] 一.Service的基本概念(四大组件之一)二.定义(启动)一个Service 1.如何定义(启动)一个Service: 2.停止一个started服务有两种方法 3.onStartCommand方法的返回值 三.IntentService 1.IntentService的引入 2.Intent