Android下开机自启动C程序

原创 2015年11月18日 16:51:41

本文简单介绍下在Android开机自启动C程序方法,在C程序由于某种原因退出时,并能重新启动,在不使用rild的功能的条件下,如果使用rild功能,则更改一下相应的服务即可,或者自己添加一个简单的服务。

1.把Android源码hardware/ril/rild/rild.c 替换成如下:

#define LOG_TAG "RILD"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <utils/Log.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <cutils/properties.h> //property_set()

#define	PPPD_SERVICE_NAME "pppd_gprs"
#define FIFO_NAME "/system/bin/Sh_fifo" 
#define INDEX_INIT 25  //多少秒数接收不到C程序的响应后重启C程序
#define COUNT_MAX  5   //多少次重启C程序不成功后重启系统
static int Index=INDEX_INIT;
static int count=0;
void *read_thread(void *arg)
{
	int fd;
	fd=open(FIFO_NAME,O_RDONLY);//打开命名管道
	if(fd<0)
	{
		ALOGW("open %s error!",FIFO_NAME);
	}
	while(1)
	{
		int recv=0;
		read(fd,&recv,sizeof(recv));
		if(recv!=0)
		{
			Index=recv;
			count=0;
		}
	}
	return NULL;
}
void *check_thread(void *arg)
{
	while(1)
	{
		Index--;
		if(Index<=0)
		{
			Index=INDEX_INIT;
			count++;
			property_set("ctl.stop", PPPD_SERVICE_NAME);//异常停止pppd_gprs
			int err = property_set("ctl.start", PPPD_SERVICE_NAME);//设置pppd_gprs属性为启动
			if (err < 0) {
				ALOGW("Can not restart server!");
			}
			if(count>COUNT_MAX)
			{
				system("reboot");
				count=0;
			}
			ALOGD("restart pppd_gprs...\n");
		}
//		ALOGD("---count:%d Index:%d----\n",count,Index);
		sleep(1);
	}
	return NULL;
}
int main(int argc, char *argv[])
{
	pthread_t read_tid;
	pthread_t check_tid;
	int ret=mkfifo(FIFO_NAME,S_IRUSR|S_IWUSR);//创建命名管道
	if(ret!=0)
	{
		ALOGW("mkfifo %s error!",FIFO_NAME);
	}
	
	sleep(15);
	int err = property_set("ctl.start", PPPD_SERVICE_NAME);//设置pppd_gprs属性为启动
	if (err < 0) {
		ALOGW("Can not start server!");
	}
	else
	{
		ALOGD("server started...");
	}
	
	pthread_create(&read_tid,NULL,read_thread,NULL);  //创建读取数据线程
	pthread_create(&check_tid,NULL,check_thread,NULL);  //创建检测线程
	while(1){
		sleep(0x00ffffff);
	}
	return 0;
}

 

 

2.把Android源码hardware/ril/rild/Android.mk 替换成如下:

  # Copyright 2006 The Android Open Source Project

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

  LOCAL_SRC_FILES:= rild.c


  LOCAL_SHARED_LIBRARIES := \
   libcutils \
   libdl

  LOCAL_LDLIBS += -lpthread
  LOCAL_MODULE:= rild
  LOCAL_MODULE_TAGS := optional

  include $(BUILD_EXECUTABLE)


 3.在out/target/product/ut4412/root/init.rc中添加如下代码

  on boot  (在这条语句下面)
   #hslong by add 2015.11.18
   chmod 777 /system/etc/hsl_sh
   chmod 777 /system/bin/server
  ...
  service ril-daemon /system/bin/rild
   class main
  #    socket rild stream 660 root radio
  #    socket rild-debug stream 660 radio system
   user root
   group radio cache inet misc audio sdcard_rw qcom_oncrpc qcom_diag log (在这条语句下面)
  
  #hslong by add 2015.11.18
  service pppd_gprs /system/bin/c_test
   class main
   user root
   group radio cache inet misc
   disabled
   oneshot

 

4.把编译好的程序放到/system/bin 下面
 
  测试代码如下:
  Android.mk

 # Copyright 2006 The Android Open Source Project

   LOCAL_PATH:= $(call my-dir)
   include $(CLEAR_VARS)
   LOCAL_LDLIBS+=-lpthread
   LOCAL_LDFLAGS := -ldl
   LOCAL_SRC_FILES :=c_test.c


   LOCAL_SHARED_LIBRARIES := \
    libcutils \
    libdl

   LOCAL_MODULE:= c_test   
   LOCAL_MODULE_TAGS := optional

   include $(BUILD_EXECUTABLE)


c_test.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pthread.h>

/************************************************************
 *函数名称:	int main(int argc, char *argv[])
 *函数功能:	主函数
 *函数参数:	无
 *函数返回:	无
 ***********************************************************/
int main(int argc, char *argv[])
{
	int fifo_fd;      //声明与自启动代码通信命名管道描述符
	pthread_t tid;    //服务线程描述符

	if((fifo_fd=open(FIFO_NAME,O_WRONLY))<0)
	{
		perror("open fifo error!\n");
		exit(-1);
	}
	
	pthread_create(&tid,NULL,thread,NULL);      //创建服务线程
	pthread_detach(tid);                        //服务线程分离

	while(1){
		int data=20;
		write(fifo_fd,&data,sizeof(data));
		sleep(10);
	}
	return 0;
}


 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

一种较方便在Android中添加开机自启动的守护进程的方法

运用本方法的前提是你已经把android源码的sdk编译出来了。在你的Android源码目录下存在这两个目录: ./out/target/product/generic/ramdisk.img 和...

Android 开机自启动示例程序

Android 开机自启动示例程序。使用广播方式接受,采用Android自带存储SharedPreferences存储开机自启动的设置。 本文源码:点击 1、先加上权限 2、需要...

Android系统开机启动C可执行文件

在工作中有一个需求是android手机开机启动一个C可执行文件,起初尝试是将在android源码里面写一个bash脚本,然后在脚本里面执行/data目录下的可执行文件,然后将系统烧写进手机,开机后将可...

在android系统上写C语言程序--开机启动该程序不进入安卓系统

今天要写的这篇博文意义重大,也是网上很少有的,这是在我工作中学会的一项技术,当然,它也是由简单的问题组合而来的。如何在安卓中写C语言程序,调试安卓驱动,测试程序的的一项重要技能,下面我就不说废话了,直...

Android::开机自启动C程序

之前一篇博文介绍了shell脚本文件的开机启动,地址是http://blog.chinaunix.net/uid-12845622-id-3054126.html,不过有些操作并不好通过shell去执...
  • Kaiwii
  • Kaiwii
  • 2012-06-21 09:22
  • 2415

Android系统init.rc分析

Android系统init.rc分析 在 Android中使用启动脚本init.rc,可以在系统的初始化过程中进行一些简单的初始化操作。这个脚本被直接安装到目标系统的根文件系统中,被 i...
  • Kaiwii
  • Kaiwii
  • 2012-06-21 09:19
  • 2896

Android如何配置init.rc中的开机启动进程(service)

开篇:为什么写这篇文章 先说下我自己的情况,我是个普通的大四学生,之前在学校一直做Android应用开发,找实习的时候也一直想找相关的工作,来到现在这家公司以后,由于业务调整,被领导安排去做底层开发,...

arm Linux 如何自动检测并mount SD卡,以及如何得知已经mount

一、土八路做法: SD 卡一旦插入系统,内核会自动在/dev/下创建设备文件:sdcard。 但有时可能时用户在拨出卡前并没有umount的话,第二次插卡进去后系统创建的就不是sdcard设备文件了...

如何让A20,android开机自动启动C程序

1,修改 android/device/    init.sun7i.rc 增加: ........(略) #add by jiangdou     chmod 777 /system/bin/he...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)