1:根据rc语法格式添加新增service:

service btwlansn /vendor/bin/btwlansnclass mainuser rootgroup rootdisabledoneshot

启动btwlansn服务

并加上点kernel日志

on property:sys.boot_completed=1start qcom-post-bootstart qti-testscriptswrite /dev/kmsg "btwlansn starting"start btwlansnwrite /dev/kmsg "btwlansn started"

说明下如上:
class main 中 class 包括core main late_start等,可以不设置。默认default
user root 中 用户属性,默认root,一般给root即可,权限最大
group root 中 所属组,默认root
disabled 即通过class不能启动,只能start screencap 这种name的方式启动
oneshot只运行一次

服务启动

on property:sys.boot_completed=1
start btwlansn

2.添加对应的te文件,获取执行权限

#wifilearner daemon
/(vendor|system/vendor)/bin/btwlansn       u:object_r:vendor_shell_exec:s0

添加了服务的权限,使用的是现成的te文件,没有进行新建,vendor_shell.te在这个路径下:
/system/sepolicy/public/vendor_shell.te
我们查看下这个te文件给的权限:

type vendor_shell, domain;
type vendor_shell_exec, exec_type, vendor_file_type, file_type;allow vendor_shell vendor_shell_exec:file rx_file_perms;
allow vendor_shell vendor_toolbox_exec:file rx_file_perms;#Use fd from shell when vendor_shell is started from shell
allow vendor_shell shell:fd use;#adbd: allow `adb shell /vendor/bin/sh` and `adb shell` then `/vendor/bin/sh`
allow vendor_shell adbd:fd use;
allow vendor_shell adbd:process sigchld;
allow vendor_shell adbd:unix_stream_socket { getattr ioctl read write };allow vendor_shell devpts:chr_file rw_file_perms;
allow vendor_shell tty_device:chr_file rw_file_perms;
allow vendor_shell console_device:chr_file rw_file_perms;
allow vendor_shell input_device:dir r_dir_perms;
allow vendor_shell input_device:chr_file rw_file_perms;

vendor_shell这个te文件我是在哪里找到的呢?在这个路径下:
vendor/qcom/proprietary/FactoryAPP/FactoryInterface/sepolicy/ato_version/qcom/non_plat/file_contexts
cat一下,只保留了有用的信息:

/(vendor|system/vendor)/bin/ftmdaemon           u:object_r:vendor_shell_exec:s0

所以我直接用了这个,参照ftmdaemon来的,当然其他路径下的te也是可以的,只要权限满足你的要求。
测试时先关闭SELinux

adb root
adb shell setenforce 0

我们进入dev/kmsg查看一下日志,如果发现类似的日志,就表明有异常:

type=1400 audit(1511821362.996:9): avc: denied { search } for pid=540 comm=“init” name=“nfc” dev=“sda45” ino=1310721 scontext=u:r:vendor_init:s0 tcontext=u:object_r:nfc_data_file:s0 tclass=dir permissive=0

解释一下添加规则:

  1. scontext=u:r:vendor_init 表示目标te文件是 vendor_init.te
  2. tcontext=u:object_r:nfc_data_file 表示是哪个进程需要。这样说明是 nfc_data_file 需要
  3. tclass=dir 表示操作种类。这里表示 dir
  4. avc: denied { search } 表示缺失的权限 search

所以可以根据日志来添加权限

3.将新添加的服务加入到我们编译的img里

添加方法:
在vendor/qcom/proprietary / common/config/device-vendor.mk中添加如下语句:

PRODUCT_PACKAGES += $(MAC)
#MAC
MAC := btwlansn

同样的,还在vendor/qcom/proprietary / common/config/device-vendor-qssi.mk里加入相同的添加:

PRODUCT_PACKAGES += $(MAC)
#MAC
MAC := btwlansn

说了这么多,我们的服务在哪里呢?

4.编写服务,是一个cpp文件:

vendor/qcom/proprietary / btwlansn/btwlansn.cpp

#include <stdio.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>#include<android/log.h>#define LOG_TAG "debug"
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, fmt, ##args)
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, fmt, ##args)
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, fmt, ##args)#define CMD_LENGTH       (128)
#define STR_LENGTH      (16)
#define BT_MAC_LENGTH       (12)
#define WIFI_MAC_LENGTH         (12)
#define PCBA_SN_START   0X00
#define WHOLE_SN_START  0X20
#define BT_MAC_START    0Xa0
#define WIFI_MAC_START  0Xc0#define CONFIG_FIILE_PATH   "/mnt/vendor/persist/factory/customNv/CUSTOM_PRODUCT_INFO"
#define BT_MAC_PATH         "/mnt/vendor/persist/bt_mac/bt_macaddress"
#define WIFI_MAC_PATH       "/mnt/vendor/persist/qca6390/wlan_mac.bin"
int main()
{FILE*  fp = NULL;char     buf[STR_LENGTH + 1] = {0};char    cmd_str[CMD_LENGTH] = {0};LOGI("====btwlansn entered===");fp = fopen(CONFIG_FIILE_PATH,"r");if(fp == NULL){LOGI("file not exist error\n");return -1;}/* write WIFI MAC to the config file */system("mkdir /mnt/vendor/persist/qca6390/");fseek(fp,WIFI_MAC_START,SEEK_SET);memset(buf,0,STR_LENGTH + 1);fread(buf,1,WIFI_MAC_LENGTH,fp);printf("WiFi mac:%s\r\n",buf);memset(cmd_str,0,CMD_LENGTH);sprintf(cmd_str,"echo  'Intf0MacAddress=%s\nEND' > %s",buf,WIFI_MAC_PATH);system(cmd_str);system("rmmod wlan");system("insmod /vendor/lib/modules/qca_cld3_qca6390.ko");
//  system("svc wifi disable");
// system("svc wifi enable");/* write BT MAC to the config file and setprop to the system */fseek(fp,BT_MAC_START,SEEK_SET);memset(buf,0,STR_LENGTH + 1);fread(buf,1,BT_MAC_LENGTH,fp);system("mkdir /mnt/vendor/persist/bt_mac");memset(cmd_str,0,CMD_LENGTH);sprintf(cmd_str,"echo %c%c:%c%c:%c%c:%c%c:%c%c:%c%c > %s",buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10],buf[11],BT_MAC_PATH);printf("Bt mac:%s\r\n",cmd_str);system(cmd_str);system("chmod 777 /mnt/vendor/persist/bt_macaddress");memset(cmd_str,0,CMD_LENGTH);sprintf(cmd_str,"setprop ro.vendor.bt.bdaddr_path %s",BT_MAC_PATH);system(cmd_str);system("svc bluetooth disable");system("svc bluetooth enable");return 0;
}

如上是将指定CUSTOM_PRODUCT_INFO文件中的信息读取到另外一个规定的或者自己创建的文件中。
解释一下两个函数:

  1. int fseek(FILE *stream, long int offset, int whence) 设置流 stream
    的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。

    • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
    • offset – 这是相对 whence 的偏移量,以字节为单位。
    • whence – 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一

    SEEK_SET文件的开头 SEEK_CUR 文件指针的当前位置 SEEK_END 文件的末尾

  2. size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
    从给定流 stream 读取数据到 ptr 所指向的数组中。

ptr – 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
size – 这是要读取的每个元素的大小,以字节为单位。
nmemb – 这是元素的个数,每个元素的大小为 size 字节。
stream – 这是指向 FILE 对象的指针,该 FILE对象指定了一个输入流。

说明几个define的由来:

  • #define CONFIG_FIILE_PATH “/mnt/vendor/persist/factory/customNv/CUSTOM_PRODUCT_INFO”
    这个是固定的信息及地址,在安卓系统起来后,会将几个信息读取到这个文本里,这些信息里包括wifi mac和bt mac等。
  • #define WIFI_MAC_PATH “/mnt/vendor/persist/qca6390/wlan_mac.bin” 在vendor/qcom/opensource/wlan/qcacld-3.0/Android.mk这个路径下有将out目录下的bin文件拷到指定目录下:
$(shell mkdir -p $(TARGET_FW_PATH); ln -sf $(TARGET_MAC_BIN_PATH)/wlan_mac.bin $(TARGET_FW_PATH)/wlan_mac.bin)

TARGET_MAC_BIN_PATH := /mnt/vendor/persist
TARGET_FW_PATH:/out/target/product/kona/vendor/firmware/wlan/qca_cld/qca6390$
注意:虽然上面代码存在bt的,但是写bt mac代码就不进行解释了

5.在同路径下编写Andriod.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := btwlansn
LOCAL_PROPRIETARY_MODULE := true
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := btwlansn.cpp
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES)
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
include $(BUILD_EXECUTABLE)

解释一下:也是引用网上的介绍

LOCAL_PATH := $(call my-dir)

一个 Android.mk文件的开头必须从定义这个变量开始,这个变量用于在开发过程中定位 Android.mk文件在项目中的路径;my-dir是一个宏函数,由系统提供,调用这个函数会返回当前文件所在目录的路径

include $(CLEAR_VARS)

这个 CLEAR_VARS变量是系统提供的,它指向一个特殊的 GNU Makefile文件,它会清除很多 LOCAL_XXX的变量(如:LOCAL_MODULE、LOCAL_SRC_FILES、LOCAL_STATIC_LIBRARIES等);为什么要清除?因为很多的控制文件都是在单个 GUN make中生成的,这些变量都是GUN make中的全局变量,如果不清除,上一次构建的数据信息会影响下一次的构建

LOCAL_MODULE := btwlansn

该命令用于为每一个模块定义其名称,这个名称必须是唯一且不包含空格;在构建过程中,系统会自动为模块加上前缀,如:btwlansn 生成的模块为 libbtwlansn.so
PS:如果模块名为libbtwlansn,那么生成的模块还是 libbtwlansn.so

LOCAL_SRC_FILES := btwlansn.cpp

该命令用于列举编译模块需要的 C/C++源文件,同时不要列举头文件和包含文件,因为系统在构建的过程中自动计算这些文件的依赖,我们只需要列举出正确的C/C++源文件就行

include $(BUILD_EXECUTABLE)

BUILD_EXECUTABLE是系统的提供的一个变量,它指向 GUN Makefile的一个脚本,这个脚本会收集你定义的所有 LOCAL_XXX形式的变量,然后根据这些变量构建 .so动态库。其他的变量还有:BUILD_EXECUTABLE(构建静态库)

在自启动的.rc文件中添加服务相关推荐

  1. ASP.NET 5系列教程 (四):向视图中添加服务和发布应用到公有云

    向视图中添加服务 现在,ASP.NET MVC 6 支持注入类到视图中,和VC类不同的是,对类是公开的.非嵌套或非抽象并没有限制.在这个例子中,我们创建了一个简单的类,用于统计代办事件.已完成事件和平 ...

  2. Android开发过程中在sh,py,mk文件中添加log信息的方法

    Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...

  3. 基于visual c++之windows核心编程代码分析(64)现有的exe文件中添加自己的代码

    我们进行信息安全编程的时候,经常需要向exe文件插入自己的源代码, 我们如何在代码中实现呢.请见代码与注释讲解 #include <iostream.h> #include <win ...

  4. java pdf添加透明水印_如何在PDF文件中添加透明水印

    原标题:如何在PDF文件中添加透明水印 有些文件添加水印,但是又不想水印影响文件的使用有时候会设置透明水印,那么PDF怎么设置透明水印呢,应该有很多的小伙伴们都很好奇应该怎么做吧,接下来就为大家分享一 ...

  5. 向对象中添加数据_在RMarkdown编译HTML文件中添加数据下载按钮

    介绍一个工具包, 主要是用来解决我平常写文档时文档和结果分离的问题. 它可以在 RMarkdown 输出的 HTML 文件中添加下载数据的按钮, 而不需要运行 shiny 模式. 安装 install ...

  6. Latex标题页上标和脚注的处理方法 如何在latex文件中添加footnote

    我们看看TeX怎么在文中加脚注的. 一般格式是: \footnote[num]{内容} 其中[num]是可选项, 如果省略, 则自动给该页脚注排序, 从1开 始标号. footnote只能用于普通正文 ...

  7. java pdf添加透明水印_如何使用PDF编辑工具在PDF文件中添加透明水印

    PDF 文件在修改编辑的时候会使用到 PDF 编辑工具,不管是工 作中还是生活中,都会使用到 PDF 文件,当我们需要给 PDF 文件添 加透明水印时,该怎么操作呢,是不是有很多的小伙伴也很好奇, 那 ...

  8. Maven在pom文件中添加资源插件后,src/main/resource目录中的文件编译后不拷贝解决方法。

    在pom文件中添加以下资源插件后 <!--添加的资源插件--> <build><resources><resource><directory> ...

  9. 想要在PDF文件中添加便贴,不妨用迅捷PDF编辑器

    pdf文档是一个比较特别的文档,他编辑起来会比较麻烦,不是普通的办公软件就可以实现的,向WPS他们编辑的话就需要花钱,但是也有PDF编辑器可以做到,比如小编见天说的迅捷PDF编辑器一样,他的功能确定很 ...

最新文章

  1. centos6.2关于tomcat远程不能访问的问题处理过程
  2. asp.net控件开发基础(21)
  3. [转]js 取得 Unix时间戳(Unix timestamp)
  4. 轻松搞定对容器实例日志设置定期清理和回卷
  5. 生生世世 —— schedule 的轮回(七)
  6. Swift翻译之-Swift语法入门 Swift语法介绍
  7. 【搜索引擎】lucene事务
  8. uva live 2326 - Moving Tables
  9. 建立唯一索引后mysql策略_【MySQL】MySQL索引背后的之使用策略及优化【转】
  10. 最大频偏和最大相位偏移_振荡器的相位噪声模型
  11. 虚拟化实验室推进计算机网络专业实践教学的解决方案
  12. 虚拟机与ubuntu(一):VirtureBox虚拟机安装和ubuntu14搭建
  13. 计算机机房安全设计规范,弱电机房建设规范要求
  14. Github客户端下载(安卓系统)
  15. FFmpeg硬件加速
  16. 制作后台管理系统首页
  17. Eharts在Android 9.0 webview中 不显示 空白 问题解决方案
  18. LeetCode:390.消除游戏
  19. Python爬音乐--qq
  20. Hilary Stagg 不死传说

热门文章

  1. 狼人杀与血染钟楼的【JAVA面向对象】————类和对象
  2. Quorumpeps 群体感应数据库简介
  3. SPSS并行配置不正确
  4. 【五校联考2015 9.5】我才不是萝莉控
  5. 计算机毕业设计springboot酒店客房管理系统8yj0v源码+系统+程序+lw文档+部署
  6. 计算机网络基础案例启示,《计算机网络基础及典型案例》理工大学出版社.pdf...
  7. 店长必看:如何利用微信会员管理系统做好店铺营销和管理?
  8. 2019 第四季UWA STAR——在社区偶遇优秀的他
  9. pygame 外星人飞船开发摘要
  10. 正使用其他防病毒提供程序