创建Android守护进程实例(底层服务)

  

<强>前言

  

Android底层服务,即运行在linux下的进程,是Android系统运行的基础,完成Android或者说计算机最基本的功能,比如连接服务(包括WIFI, BT等等),比如Android的亚行功能,比如存储监控等等。没有这些底层服务,上层也就没有了对应的功能。

  

Android底层服务往往是常驻内存,时刻运行完成任务。底层服务进程,往往具有更多的权限,可能和驱动通信,可能和linux内核通信,可能需要操作系统核心运行文件以及节点等等,所以,底层服务,可以帮你完成更多计算机基本功能。

  

本文所使用的AOSP是基于Android 8.1。阅读文本需要对Android的架构,编译系统,AOSP工程和SeAndroid有基本认识。

  

<>强创建守护进程

  

<>强创建目录编写代码

  

<>强创建目录

  

我们在Android系统通用守护进程目录下创建我们的守护进程,当然你也可以在其它目录下放置你的守护进程。

  
  

/系统/核心/

     

在上面的目录下,创建守护进程的文件夹nativeservice,那么,我们的守护进程就存在如下目录,下文中称简称目录代表如下目录。

  
  

/系统/核心/nativeservice/

     

<强>编写代码

  

在目录中创建主代码文件native_main。cpp。另外,我们需要编译,那么就需要可文件,创建一个Android。可文件。这时,目录架构就是如下这个样子

  

创建Android守护进程实例(底层服务)

  

<强>编写Android.mk

  

我在代码中尽可能的注释清楚重要语句的作用,读者如果对Android AOSP编译不了解的,可以查阅更多可语法的资料学习。

        #版权2013 Android开源项目   #当前路径   LOCAL_PATH:=$(调用my-dir)   #清除历史变量   包括美元(CLEAR_VARS)      # # # nativeservice # # #      #待编译的源码文件   LOCAL_SRC_FILES:=\   native_main。cpp \      common_c_includes:=\   仿生\   系统/核心/include/sysutils \   #引用一些函数库   common_shared_libraries:=\   libsysutils \   libcutils \   liblog \   libutils \   libbinder \   libbase      LOCAL_C_INCLUDES:=\   $ (common_c_includes)      #守护进程的名字   LOCAL_MODULE:=nativeservice   LOCAL_CFLAGS:=- wall -Wno-unused-parameter -Werror   LOCAL_SHARED_LIBRARIES:=\   $ (common_shared_libraries)   LOCAL_MODULE_TAGS:=可选      #编译守护进程,也就是可执行文件   #编译后,在/系统/bin/下,变多了nativeservice可执行文件。   包括美元(BUILD_EXECUTABLE)      之前      

<强>编写native_main.cpp

  

在Linux中,一个开机启动的服务,执行完后会自动退出,而我们是守护进程,那么就需要一直运行。让程序一直运行有很多种方法。在native_main。cpp中贴出了三种方式,它们分别是epoll,有名管道(FIFO)和循环。

  

epoll的方式是Android系统比较常见的方式,系统的电池状态变化,USB接口状态变化等守护进程便是通过epoll的方式,实时鉴定并读取新状态。

  

有名管道,在IPC通信中比较简单,便捷,适合轻量级任务。

  

循环,这个是最老套的方式。

  

三种方式在native_main。cpp都贴出来了,本文侧重使用有名管道(FIFO)的方式,鉴于篇幅过长,其它方式就一笔带过了,如果读者对epoll等较为兴趣的,可以自行查阅更多资料学习。

  

下面是native_main。cpp的代码,请认真看注释哦。
  

     ////创建familyyuan用户alt="创建Android守护进程实例(底层服务)">

  

在/构建//目标/产品/核心。可文件添加nativeservice,当然不限制添加在这个文件,很多厂商的工程,也会增加自己的PRODUCT_PACKAGES配置可文件。

  

<>强配置开机启动

  

至此,编译整个工程,守护进程也可以被编译了,这个时候,刷到手机是否就可以运行了呢?不会的,我们还需要让守护进程在手机开机的时候运行起来,且运行中进程死掉的话,也需要重新启动守护进程。方法如下

  

在核心系统//rootdir/init。rc文件中添加如下代码

        服务healthd/系统/bin/healthd   类核心   至关重要的   群根系wakelock   #我们的代码开始   服务nativeservice/系统/bin/nativeservice   类主要#主要类,属于主要的服务会开机被运行,且死掉会重启   集团系统#属于系统组   # #用户系统以系统用户启动,不设置以根用户启动   seclabel u r: nativeservice: s0 # SeAndroid SContext,域是nativeservice   restorecon nativeservice   #我们的代码结束   服务控制台/系统/bin/sh

创建Android守护进程实例(底层服务)