关闭

Android下开机自启动C程序

标签: Linuxandroidc语言开机启动service
3110人阅读 评论(0) 收藏 举报
分类:

本文简单介绍下在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;
}


 

 

0
0
查看评论

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

在工作中有一个需求是android手机开机启动一个C可执行文件,起初尝试是将在android源码里面写一个bash脚本,然后在脚本里面执行/data目录下的可执行文件,然后将系统烧写进手机,开机后将可执行文件放入手机/data目录里面,然后重启,最终的结果是没有成功。 需求一直在这里,后来将尝试别的...
  • bingjia103126
  • bingjia103126
  • 2017-06-06 14:47
  • 712

在 Android 中调用二进制可执行程序(native executable )

前几天有需要在java代码中调用二进制程序,就在网上找了些资料,写点东西记录下。 Android 也是基于linux 的系统,当然也可以运行二进制的可执行文件。只不过Android 限制了直接的方式只能安装运行apk文件。虽然有NDK可以用动态链接库的方式来用C的二进制代码,但毕竟不方便。至少我们可...
  • liujian885
  • liujian885
  • 2009-12-01 09:36
  • 9579

在Android上运行C语言编写的可执行程序

Android设备上的应用程序大都是用java语言编写的,但有时我们需要用C语言进行一些底层的开发,但我们一般的PC机CPU都是Intel x86架构,而大多数移动设备CPU都是ARM架构,因此在Linux上编译运行的可执行程序是不能直接在Android手机上运行的,但是我们可以在PC机上...
  • u4y5k9013
  • u4y5k9013
  • 2014-02-23 22:30
  • 4791

Python 实现Android打包并安装后启动

这个周末,学会了Python并写了一个打包的脚本,可以很方便的打包并安装。因为刚开始使用Python,不知道Python怎么面向对象,面向过程的写,一个流程走下来,之后深入学习后可以写的方便修改一点。主要功能介绍:1. 自动从Git拉取代码 `git pull` 或 `git clone`。2. 执...
  • u014099894
  • u014099894
  • 2016-08-07 23:51
  • 2070

(OK) Android 添加 开机启动 脚本

(OK) Android 添加 开机启动 脚本
  • ztguang
  • ztguang
  • 2016-07-15 23:30
  • 888

Android 开机自启动示例程序

Android 开机自启动示例程序。使用广播方式接受,采用Android自带存储SharedPreferences存储开机自启动的设置。 本文源码:点击 1、先加上权限 2、需要的广播接收注册(如果还要启动服务,也先注册)
  • qq_16064871
  • qq_16064871
  • 2015-11-01 09:00
  • 12404

Android::开机自启动C程序

之前一篇博文介绍了shell脚本文件的开机启动,地址是http://blog.chinaunix.net/uid-12845622-id-3054126.html,不过有些操作并不好通过shell去执行,也不好做成JNI动态库由上层调用,这时,可能这篇博文就能帮上你,本文以创建文件夹为例,实现开机自...
  • Kaiwii
  • Kaiwii
  • 2012-06-21 09:22
  • 2524

Android下开机自启动C程序【转】

来自:http://blog.csdn.net/hanbo622/article/details/49909415 本文简单介绍下在Android开机自启动C程序方法,在C程序由于某种原因退出时,并能重新启动,在不使用rild的功能的条件下,如果使用rild功能,则更改一下相应的服务即可,或者...
  • chenyefei
  • chenyefei
  • 2016-10-26 22:26
  • 204

安卓程序自启动的办法

千古文章一大抄,不过就是很少有个起作用的。 下面就是真正的 能够随系统启动的app的AndroidManifest.xml内容 ...
  • glunoy
  • glunoy
  • 2016-05-24 18:30
  • 5664

android 编译C程序 在android下可执行

Android编译环境本身比较复杂,且不像普通的编译环境:只有顶层目录下才有Makefile文件,而其他的每个component都使用统一标准Android.mk. Android.mk文件本身是比较简单的,不过它并不是我们熟悉的Makefile,而是经过了Android自身编译系统的很多处理,因此...
  • zlcchina
  • zlcchina
  • 2013-10-23 16:41
  • 3349
    个人资料
    • 访问:329502次
    • 积分:4253
    • 等级:
    • 排名:第8505名
    • 原创:92篇
    • 转载:0篇
    • 译文:1篇
    • 评论:15条
    关于我
    籍贯:河北邯郸
    工作:嵌入式软件工程师
    学校:石家庄职业技术学院
      点击(扫一扫)QQ群交流


      点击邮件和我交流

      点击QQ和我交流
    和我qq交谈 和我qq交谈
      点击查看微博

    博客公告
    博客专栏
    最新评论