android daemon 程序,(转)Android App Daemon

一直没空把App Daemon的原理整理一下,见不少人在问原理,我这里就把整个流程大概的说一下。

关于进程守护,从接触Android没多久就一直想实现,网上给出的方案也是各种各样,有双服务方式,有利用系统定时器方式的等等等等,但我都有过尝试,最终都没有达到自己想要的结果。后来想到自己以前在搞linux的时候用到子进程来处理一些任务,而Android正是基于linux的,觉得这样的话应该是可行的。最初直接在JNI的c代码中fork出一个子进程出来,然后在子进程中加一个while(1),再在while中sleep并打开一个指定的service,这样一个最简单的守护完成了。但是后来测试发现,虽然能实现功能,不过使用adb shell查看进程(命令: ps | grep com.coolerfall….),发现fork出来的进程的VSIZE(进程虚拟地址空间大小)和RSS(进程正在使用的物理内存的大小)都很大,而且UI线程有时候会出现莫名其妙的问题,于是进程守护也就暂时放下了。

后来由于项目需求,又不得不开始折腾进程守护。一次在看开源项目afwall(android上的流量防火墙),发现其中的命令是直接使用linux命令行的方式在执行的,这才想起linux可以直接编译一个可执行的二进制文件,然后在命令行中直接执行。看了看Android.mk的文档,加入include $(BUILD_EXECUTABLE)可以让c文件编译成在Android上运行的二进制文件,最后把以前的代码直接拿过来,一切OK了。

原理分析:

int main(int argc, char *argv[])

{

int i;

pid_t pid;

if ((pid = fork()) < 0)

{

exit(EXIT_SUCCESS);

}

else if (pid == 0)

{

/* child process become session leader */

setsid();

/* change work directory */

chdir("/");

for (i = 0; i < 3; i ++)

{

close(i);

}

while(1)

{

sleep(interval);

LOGD(LOG_TAG, "check the service once");

/* start service */

start_service(package_name, service_name);

}

}

else

{

/* parent process, do nothing */

}

}

由于要在shell中直接执行,因此这里使用int main(int argc, char *argv[]),让可执行文件有入口。frok出子进程之后,让子进程成为新的会话的领头进程,并与其父进程的会话组和进程组脱离,紧接着就是在子进程中定时去启动服务,这样一个简单的进程守护就OK了。 其中start_service为启动一个Service。

/* start daemon service */

static void start_service(char *package_name, char *service_name)

{

/* get the sdk version */

int version = get_version();

pid_t pid;

if ((pid = fork()) < 0)

{

exit(EXIT_SUCCESS);

}

else if (pid == 0)

{

if (package_name == NULL || service_name == NULL)

{

LOGE(LOG_TAG, "package name or service name is null");

return;

}

char *p_name = str_stitching(package_name, "/");

char *s_name = str_stitching(p_name, service_name);

LOGD(LOG_TAG, "service: %s", s_name);

if (version >= 17 || version == 0)

{

int ret = execlp("am", "am", "startservice",

"--user", "0", "-n", s_name, (char *) NULL);

LOGD(LOG_TAG, "result %d", ret);

}

else

{

execlp("am", "am", "startservice", "-n", s_name, (char *) NULL);

}

LOGD(LOG_TAG , "exit start-service child process");

exit(EXIT_SUCCESS);

}

else

{

waitpid(pid, NULL, 0);

}

}

这里说明下:execlp执行后,如果没有错误则不返回,有错时才有返回值,因此又fork了一个子进程,然后在子进程中启动指定的Service。其次是Android SDK版本小于17的执行命令有所不同,17及以上命令为:execlp("am", "am", "startservice", "--user", "0", "-n", s_name, (char *) NULL), 17以下:execlp("am", "am", "startservice", "-n", s_name, (char *) NULL)。获取version比较简单。

#include

/**

* Get the version of current SDK.

*/

int get_version()

{

char value[8] = "";

__system_property_get("ro.build.version.sdk", value);

return atoi(value);

}

由于编译出来的是可执行的二进制文件,所以调用就不像so库那样了。需要将可执行文件放在assets中,并在执行的时候将其copy至/data/data/packagename/app_bin文件夹下,然后在java中这样调用。

String cmd = "/data/data//app_bin/daemon"

Runtime.getRuntime().exec(cmd);

进程守护大致的原理就是这样了,只要搞清楚了原理,其实是进程守护并不复杂。 ps: 并不是所有手机都能用此方法实现进程守护,有的手机(如小米),自带清理进程会清理掉应用相关的所有进程。5.x以上可参考MarsDaemon。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是卫星的有效载荷?

直接执行特定卫星任务的仪器、设备或分系统就是卫星的有效载荷。 有效载荷是指航天器上装载的为直接实现航天器在轨运行要完成的特定任务的仪器、设备、人员、试验生物及试件等。 有效载荷的种类很多&#xff0c;即使是同一种类型的有效载荷&#xff0c;性能差别也很大。 返回型…

升级鸿蒙系统如何退出,华为鸿蒙2.0系统升级了怎么退回EMUI11系统-操作教程详解...

华为鸿蒙2.0系统升级了怎么退回EMUI11系统&#xff1f;很多用户升级了又不知道如何才能退回到原来的系统&#xff0c;下面就让老铁下载小编为大家带来&#xff0c;2.0系统升级退回EMUI11系统操作教程详解。这次开启华为鸿蒙2.0系统手机开发者beta版公测招募的机型有华为P40 、P…

OpenFlow和SDN的历史和原理介绍

OpenFlow相关的历史、新闻&#xff1a;http://blog.csdn.net/jincm13/article/details/7825754 起源与发展 【https://36kr.com/p/5035985】   OpenFlow起源于斯坦福大学的Clean Slate项目组 [1] 。CleanSlate项目的最终目的是要重新发明英特网&#xff0c;旨在改变设计已略…

可见性得以保障,并不意味着_战略模式并不意味着春天!

可见性得以保障,并不意味着是的&#xff0c;所以可以说您正在编写一个Spring MVC应用程序&#xff0c;然后您决定&#xff1a;“我想做一些单独的封装算法&#xff0c;这些算法可以互换来执行特定的行为”。 对此的经典回应是“您需要一个战略模式男孩&#xff01;”。 所以&a…

小米miuiVS华为鸿蒙,华为鸿蒙2.0 vs 小米MIUI 12.5

原标题&#xff1a;华为鸿蒙2.0 vs 小米MIUI 12.5不久前有媒体在视频中展示了鸿蒙2.0和苹果IOS14两个操作系统下App的启动速度&#xff0c;结果是鸿蒙2.0完胜IOS14。此后不久&#xff0c;该媒体发布了华为鸿蒙2.0和小米MIUI 12.5对比视频。同上次一样&#xff0c;这次依然是选择…

传播时延(propagation delay)与发送时延(transmission delay)

原文&#xff1a; http://wzw19191.blog.sohu.com/135110823.html 传播时延(propagation delay)这个概念&#xff0c;是指电磁信号或者光信号在传输介质中传输的时延&#xff0c;而在光纤或者铜线中&#xff0c;光信号和电磁信号的传播速度都在20万公里/秒以上&#xff0c;在传…

具有MicroProfile配置的可配置JAX-RS ExceptionMapper

当您使用JAX-RS创建REST服务时&#xff0c;通常要么不返回任何内容&#xff08;例如HTTP 201/2/4等&#xff09;&#xff0c;要么返回某些数据&#xff08;可能采用JSON格式&#xff08;因此HTTP 200&#xff09;&#xff0c;或者返回某些异常/错误&#xff08;例如HTTP 4xx或5…

video.js android,VideoJS + HTML5自动播放失败,适用于Android 2.3+和IOS 4+

我的VideoJS和HTML5项目针对更新的Web浏览器(较新版本的FireFox和Chrome)以及移动浏览器(Android2.3 和IOS4 )。VideoJS HTML5自动播放失败&#xff0c;适用于Android 2.3和IOS 4我希望所有视频在“准备就绪”之后自动播放。我尝试了几种方法(在下面的方法中提到过)&#xff0…

EPS(Evolved Packet System,演进的分组系统)

EPS&#xff08;Evolved Packet System&#xff0c;演进的分组系统&#xff09;是3GPP标准委员会在第4代移动通信中出现的概念。可以认为EPSUE&#xff08;User Equipment&#xff0c;用户设备&#xff09;LTE&#xff08;4G接入网部分&#xff09;EPC&#xff08;Evolved Pack…

lottie android min sdk,跳一个Lottie无法回调开始播放动画事件的坑

一、背景介绍项目背景是在界面中弹出一个浮层动画&#xff0c;同时播放一个音效。二、当前实现实现思路比较简单&#xff1a;继承一个DialogFragment&#xff0c;在相关的生命周期方法onViewCreated中调用startLottieAnim进行动画播放&#xff0c;同时监听lottie动画播放的回调…

Ad-hoc

Ad-hoc这个词来源于拉丁语&#xff0c;在百度上解释为“for this purpose only”&#xff0c;在wiki上解释为“for this”&#xff0c;其中文在wiki上被解释成包含特设的、特定目的的&#xff08;地&#xff09;、即席的、临时的、将就的、专案的”这么多种含义。在wireless ne…

掌握Java 11的Constantdynamic

为了使JVM对动态语言更具吸引力&#xff0c;该平台的第七版已将invokedynamic引入了其指令集。 Java开发人员通常不会注意到此功能&#xff0c;因为它隐藏在Java字节码中。 简而言之&#xff0c;通过使用invokedynamic &#xff0c;可以将方法调用的绑定延迟到第一次调用之前。…

android5.0 v4a,【图】多图讲解V4A提高G5音效详细步骤(G5音效可以更棒的)

首先感谢论坛前辈&#xff0c;看着你们介绍的方法&#xff0c;我把G5应有的音效搞出来了&#xff0c;效果提升非常明显。(看清了&#xff0c;如果不是非常明显&#xff0c;我也不会费这么大劲在这儿做讲解)。特记录和总结过程如下&#xff1a;1. 安装一键ROOT。2. 安装虚拟按…

feeder link

feeder link&#xff1a; 从一个设在指定的固定点上的地球站到一个空间站&#xff0c;或从一个空间站到一个设在某固定点的地球站的无线电链路&#xff0c;用于除卫星固定业务以外的空间无线电通信业务的

2021年春季学期期末统一考试 中国法制史 试题

2021年7月 一、单项选择题&#xff08;每小题2分&#xff0c;共20分&#xff09; 1.商朝法律制度的总称叫做( )。 A.禹刑 B.汤刑 C.汤诰 D.九刑 2.战国时期改“法”为“律”的人是( )。 A.韩非 B.赵鞅 C.商鞅 D.屈原 3.秦始皇和李斯等人取消了世卿世禄分封制&#xff0c;在全国…

怎么在html中加入pjax,pjax加载多说的三种方法

多说官方提供的方法&#xff1a;http://dev.duoshuo.com/docs/50b344447f32d30066000147这里不进行说明&#xff0c;请进入上述链接进行查看。效果说明&#xff1a;进入文章页需要点击按钮&#xff0c;多说评论才会加载出来。方法二民间高手不满足方法一那种需要按一次才能加载…

2021年春季学期期末统一考试 高级财务会计 试题

试卷代号&#xff1a; 1039 2021年7月 注意事项 一、将你的学号、姓名及分校&#xff08;工作站&#xff09;名称填写在答题纸的规定栏内。考试结束后&#xff0c;把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考人收完考卷和答题纸后才可离开考场。 二、仔细读懂题…

Multi-commodity Flow Problem

多物网络流问题&#xff08;Multi-commodity Flow Problem&#xff09;是多种物品&#xff08;或货物&#xff09;在网络中从不同的源点流向不同的汇点的网络流问题。 定义

2021年春季学期期末统.考试 公司概论 试题

试卷代号&#xff1a; 1040 2021年7月 注意事项 一、将你的学号、姓名及分校&#xff08;工作站&#xff09;名称填写在答题纸的规定栏内。考试结束后&#xff0c;把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考人收完考卷和答题纸后才可离开考场。 二、仔细读懂题…

生产替代物料_一种替代的多生产者方法

生产替代物料最近在InfoQ上&#xff0c;Aliasei Papou发表了一篇关于他的一些实验的文章 &#xff0c;该实验在线程之间进行了高性能的消息交换。 本文中有许多示例&#xff0c;但我将重点介绍多生产者案例。 文章显示的一种优化方法是&#xff0c;如果您知道初始化时拥有的生产…