android ndk-android NDK fork一个守护service的进程保证它被杀后能重新启动

问题描述

android NDK fork一个守护service的进程保证它被杀后能重新启动

java 端启动一个demoService,demoService启动时就会通过AIDL 启动另外一个进程的guardService
>
android:process="com.gdut.persistentservice.guradService"
>

    </service>
 public int onStartCommand(Intent intent, int flags, int startId) {
        if(intent==null)return super.onStartCommand(intent, flags, startId);
        String action = intent.getAction();
        if(action==null)return super.onStartCommand(intent, flags, startId);
        log.d("demoService: onStartCommand:"+action);
        if(action.equals(START_NATIVATE)){
            bindAidlService(this);
        }
        return super.onStartCommand(intent, flags, startId);
    }

在guardService 里通过 JNI 去fork 一个子进程,并且在子进程里启动一个线程,去监控service
我这里为了方便debug观察,就只在fork 出来的父进程 和子进程,都启动一个线程,都去循环打log,观察他们的运行情况,能否在长按home键出来的多任务界面划掉后,能否继续运行

 void *thread_run(void* arg){
    int count =20;//*((int*)arg);
    LOGD("native thread count:%d",count);
    for(int i=0;i<count;i++){
        LOGD("native thread run:%d",i);
        sleep(1);
    }
}

void *fork_thread_run(void* arg){
    int count =20;//*((int*)arg);
    LOGD("native thread count:%d",count);
    for(int i=0;i<count;i++){
        LOGD("native fork thread run:%d",i);
        sleep(1);
    }
}

void start_thread(){
    pid_t fpid;
    fpid = fork();
    if(fpid<0){
        LOGD("native fork error");
    }else if(fpid == 0){
        LOGD("native fork child");
        pthread_t id;
        int count=10;
        pthread_create(&id,NULL,fork_thread_run,(void*)&count);
    }else{
        LOGD("native fork parent");
        pthread_t id;
        int count=10;
        pthread_create(&id,NULL,thread_run,(void*)&count);
    }
}

发现,当程序安装进去后第一次运行,划掉改任务后,子进程的log会继续打,其他进程全被停止了。但是第二次运行,发现子进程会fatal,看NDK 的log,
backtrace:
#00 pc 0003806c /system/lib/libc.so (nanosleep+8)
#01 pc 00021a8f /system/lib/libc.so (sleep+38)
#02 pc 00000d65 /data/app/com.gdut.persistentservice-1/lib/arm/libserviceguard.so (fork_thread_run(void*)+44) //00000d65运行的是sleep(1)
#03 pc 000137ab /system/lib/libc.so (__pthread_start(void*)+30)
#04 pc 0001188b /system/lib/libc.so (__start_thread+6)

发现死在 sleep 方法这里,换成 usleep 也是会死。这里我百思不得其解啊,求高人指点迷津,还是我这种fork 出一个进程再开线程的写法不对啊,求指引明路

解决方案

兄弟,android NDK fork一个守护service的进程保证它被杀后能重新启动 你搞出来了吗 能不能指点我一下啊

解决方案二:

兄弟,android NDK fork一个守护service的进程保证它被杀后能重新启动 你搞出来了吗 能不能指点我一下啊

时间: 2024-12-23 18:35:10

android ndk-android NDK fork一个守护service的进程保证它被杀后能重新启动的相关文章

Ubuntu&amp;amp;nbsp;Android&amp;amp;nbsp;NDK

1.下载NDK:http://developer.android.com/sdk/ndk/index.html 2.下载完成后解压到某一目录,我的是在        zhangweia@ubuntu:~/android/android-ndk-r4b$ pwd /home/zhangweia/android/android-ndk-r4b zhangweia@ubuntu:~/android/android-ndk-r4b$ echo $HOME /home/zhangweia 3.配置NDK的

android图文介绍NDK安装及简单jni demon的实现

1.背景 android NDK可以用来编译android的native方法,也可以将c和c++的代码编译成.so文件,让android程序运行. 2.NDK安装(linux环境) (1)下载对应的ndk版本,在shell里输入如下命令 gedit ~/.bashrc (2)打开bash文件,添加下载的ndk路径 NDKROOT=/home/CORPUSERS/28852262/android-ndk-r9c export PATH=$NDKROOT:$PATH (3)输入如下命令,然后重启sh

Android中的NDK编程学习

Android应用程序访问android的根文件系统中的文件时,由于应用程序的权 限限制,无法访问这些文件,怎么办? 这时就要用到NDK编程了,既用 C/C++代码实现访问系统文件,并将其生成本地库,供android中的java代码调用 ,这样就可以在java代码中通过调用C/C++编写的库的接口来实现对系统文件的 访问. 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇 难度较大. 2. 在NDK中调用第三方C/

Android JNI 和 NDK

  1.Android NDK  一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言.但这并不等同于"第三方应用只能使用Java".在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,"Java+C&quo

android service-Android 是否可以建立一个无activity的service呢

问题描述 Android 是否可以建立一个无activity的service呢 请问Android是有无方法建立一个无activity的service呢,并且安装之后可以执行oncreate()函数,如果有请大神指导,,, 解决方案 首先,service本来就没有界面. service分为两种,一种是普通的service,另一种是IntentService. 普通的service不会专门启动一个单独的线程,它与所在的应用在同一个进程中.它也不是一个新的线程,不能在里面直接处理耗时操作,比如网络请

聊天-Android开发中遇到了一个问题,求大神解决下。

问题描述 Android开发中遇到了一个问题,求大神解决下. 我现在将别人写好的聊天软件,根据我自己的需要,剔除了很多不用的activity和功能,然后当成Library.我遇到的问题是,我现在只有进入到这个聊天界面才能够收到信息和来信息的提示,如果我不进入,我就没法得到来消息的提示,请问我该怎么解决呢? 解决方案 就想QQ的离线消息一样?后台起一个Service接收信息,有信息了就在消息通知栏里放一个消息. 解决方案二: 这个问题可能涉及到通知提醒的内容,建议你先看一下android是如何实现

【Android】 Android Service生命周期及用法

原文来自: 首先我们要知道Service具体是干什么的,什么时候用到?以及它的生命周期等. Service概念及用途: Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那 我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了,又比

android开发教程之开机启动服务service示例_Android

个例子实现的功能是:1,安装程序后看的一个Activity程序界面,里面有个按钮,点击按钮就会启动一个Service服务,此时在设置程序管理里面会看的有个Activity和一个Service服务运行2,如果手机关机重启,会触发你的程序里面的Service服务,当然,手机启动后是看不到你的程序界面.好比手机里面自带的闹钟功能,手机重启看不到闹钟设置界面只是启动服务,时间到了,闹钟就好响铃提醒. 程序代码是: 首先要有一个用于开机启动的Activity,给你们的按钮设置OnClickListener

【Android】Android Service 服务

参考网址:http://blog.csdn.net/ithomer/article/details/7364024 一. Service简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Activity的级别差不多,但不能自己运行只能后台运行,并且可以和其他组件进行交互.service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后