这段时间没事,主要是主管太垃圾,没有合理的安排下属,导致我很闲,刚好,我利用这段时间可以好好学习下android。

今天看了android的init这部分,我自己想能不能自己写个守护进程在andorid启动后就运行起来,这样可以更深刻了解android的init的相关知识,只是看书印象不深刻。

总结了下,大致分成两步完成:

1)编写守护进程相关code,写Android.mk,编译android code,生成守护进程的可执行文件。

2)修改init.rc的相关内容,在init.rc中调用守护进程。

第一步:

守护进程准备写个隔60s记录写文件的进程,这个code主要从网上其它地方copy过来的,因为这里主要是想说明init中如何调用可执行文件,对代码不是很关心。

/*

* init_daemon.cpp

*/

#include <unistd.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>

void init_daemon(void)
{
int pid;
int i;
if(pid=fork())
exit(0); //是父进程,结束父进程
else if(pid< 0)
exit(1); //fork失败,退出
//是第一子进程,后台继续执行
setsid(); //第一子进程成为新的会话组长和进程组长
//并与控制终端分离
if(pid=fork())
exit(0); //是第一子进程,结束第一子进程
else if(pid< 0)
exit(1); //fork失败,退出
//是第二子进程,继续
//第二子进程不再是会话组长
for(i=0;i< NOFILE;++i) //关闭打开的文件描述符
close(i);

chdir("/"); //改变工作目录到/
umask(0); //重设文件创建掩模
return;
}


/*

* mark_log.cpp

*/

#include <stdio.h>
#include <time.h>

void init_daemon(void);//守护进程初始化函数

int main(int nargs,char *args)
{
FILE *fp;
time_t t;
init_daemon();//初始化为Daemon

while(1)//每隔一分钟向test.log报告运行状态
{
sleep(60);//睡眠一分钟
if((fp=fopen("/test.log","a")) >=0){
t=time(0);
fprintf(fp,"Im here at %sn",asctime(localtime(&t)) );
fclose(fp);
}
}
return 0;
}


/*

* Android.mk

*/

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
init_deamon.cpp \
mark_log.cpp

LOCAL_MODULE:= marklog

include $(BUILD_EXECUTABLE)

上述三个文件都放在framework文件夹下的marklog文件夹下(marklog是新建的文件夹)。


第二步:修改init.rc

在init.rc的最后添加

service marklog /system/bin/marklog
class core
disabled
oneshot

表示marklog为一个service,然后在适当地方启动这个service,我是在on post-fs-data section中添加

“start marklog”

当然修改init.rc的方法很多,不是仅限于上面。


然后编译android,生成kernel和rootfs,重新烧kernel和rootfs,android起来了ps -ef就可以看到有marklog进程,并且每隔一分钟会在test.log中记录信息。




更多相关文章

  1. android中解析文件的三种方式
  2. Android AIDL 跨进程服务 Proxy/Stub
  3. Android如何获取多媒体文件信息
  4. [置顶] Android中对Log日志文件的分析
  5. 分享自己在项目中对android文件系统的一些认识
  6. 无废话Android之android下junit测试框架配置、保存文件到手机内
  7. Android动态加载外部jar包及jar包中图片等资源文件
  8. 关于Android初级逻辑思考(续)——android文件夹讲解
  9. Android中的线程与进程之间的关系简单解释

随机推荐

  1. 大赞!分享一个数据科学利器 PyCaret,几行代
  2. 最近工程师怎么都在写公众号?这玩意到底能
  3. 如何实现本地代码和远程的实时同步
  4. 我不是盘神!PanDownload 作者被抓捕,一代神
  5. kubernetes高可用集群安装(二进制安装、v1
  6. 如何用Python,制作疫情可视化大屏?
  7. 太香了!推荐6个Python数据分析神器!!
  8. 用Python手写五大经典排序算法,看完这篇终
  9. 动态气泡图,拿走不谢!
  10. 谷歌家的验证码怎么了?搞他!