基于qualcomm平台的呼吸灯配置

前言:

此篇blog直接切入主题教大家怎么去修改相应代码,配置相应的寄存器直至设备正常运行,至于原理之前有博客介绍了,不在这里多谈了。


应用层控制呼吸灯

  Android是基于Linux内核,设备的节点是设备驱动的逻辑文件,可以通过设备节点来访问设备驱动。但是由于Android 5.0及以上的版本,Google对源码环境普遍采用了SELINUX安全访问机制,APP及Framework层在默认情况下是无权限访问设备节点的。


解决办法有两种:以System APP或者System Server进程开放权限。

1)SEAndroid 为Sys设备节点开放访问(读或写)权限方法(如:sys/class/leds/red_aux/brightness) 

2)  SEAndroid为proc设备节点开放访问(读或写)权限方法(如:proc/touchscrren_feature/gesture_data)  


我们在这里以第一种方式修改操作呼吸灯设备节点为例进行说明,如红灯sys/class/leds/red_aux/brightness,为APP层system app进程开放访问权限(读或写)

1.APP层写节点之前,必须确保当前应用程序能够有权限去读写

否则是无法正常写入的,如果应用没有权限写设备节点,首先进入源码目录中system/core/rootdir/init.rc;

修改内容如下: 

         //开放节点让系统进程可以访问
      chown system system /sys/class/leds/red_aux/brightness
       //修改设备节点可读可写

     chmod 0666 /sys/class/leds/red_aux/brightness


2.然后进入/device/qcom/sepolicy/common

找到file.te文件按,加入以下的类型声明:

# leds file

type sysfs_ledred_leds, fs_type, sysfs_type;


3.在同一目录下找到file_contexts文件

绑定sysfs_ledred_leds到对应的实际节点,加入以下声明:

/sys/devices/soc/75b5000.i2c/i2c-7/7-0045/leds/red_aux/brightness u:object_r:sysfs_ledred_leds:s0


4.获取实际节点方法:

1)获取root权限 

2)切换到sys/class/leds 

3)ls -l 指令查看节点对应的实际挂载点

如red_aux  对应的实际节点查看是../../devices/soc/75b5000.i2c/i2c-7/7-0045/leds/red_aux/

注意:不同设备其对应的节点和实际挂载点会有所不同,根据各自的设备请自行查看。


5.再在该目录下找到syserem_app.te文件,加入以下权限声明:

allow system_app sysfs_ledred_leds:file rw_file_perms;

//rw_file_perms代表读写权限,该话的意思事允许systen_app进程能够拥有对sysfs_ledred_leds的这个字符设备的读写权限;如果system_server 则表示是system_server进程

allow system_app sysfs_ledred_leds:file { create open read setattr write };
注意:以上的sysfs_ledred_leds必须与file.te文件中声明的文件类型、名称必须一致。
/**
* 往文件里面写数据
* @param path 代表要写值的路径,即要写值得LED挂载节点路径
* @param value 要写的值
*/
private void write_int(String path, int value) {
String strColor = String.valueOf(value);
try {
BufferedWriter bufWriter = null;
bufWriter = new BufferedWriter(new FileWriter(path));
bufWriter.write(strColor);
Log.i(TAG,"strColor======"+strColor);
bufWriter.close();

catch (Exception e) {

e.printStackTrace();
Log.e(TAG, "can't write the " + path);
}

}


6.在AndroidMainefest.xml中配置

android:sharedUserId=”android.uid.system”;该步骤是必须的,因为在3步骤设置就是只运行系统APP进程来进行访问设备节点。

然后write_init("/sys/class/leds/red_aux/brightness", 255);既可以点亮的LED灯红色。

如果需要开放system server能够对节点权限进行控制,需要在/device/qcom/sepolicy/common目录下找到system_server.te文件,增加allow system_server sysfs_ledred_leds:file rw_file_perms;

该方法的缺点:需要在framework层添加随系统启动的service,增加代码量 优点是:可以自由控制哪些应用可以访问,哪些应用禁止访问已经开放的设备节点,可以更好的保护安全问题;2.framework和app层都可以访问该设备节点,不用再另外申请权限。

7.读写proc节点

1) 在alps/mediatek/common/sepolicy/file.te 定义selinux type: proc_quick_gesture,如下: type proc_quick_gesture, fs_type;

2)在 alps/mediatek/common/sepolicy/genfs_contexts,绑定proc_quick_gesture到对应的实际节点 genfscon proc /touchscreen_feature/gesture_data u:object_r:proc_quick_gesture:s0

3) 在alps/mediatek/common/sepolicy/common/system_app.te,申请权限 allow system_app proc_quick_gesture:file rw_file_perms;

4) 在AndroidManifest.xml,配置:android:sharedUserId="android.uid.system" 经过以上4步,system_app进程就具备权限(读或写)访问/proc/touchscreen_feature/gesture_data等节点


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程简述  Android是目前最为流行的移动操作系统之一,它的开发涉及到多个知识领域。本课程将深入介绍Android系统启动过程中的重要组成部分——init进程,并探讨与之相关的多项关键技术。我们还将提供实际的开发案例,以RK3399开发板为例,通过演示Android产品配置、init启动流程、selinux权限管理、init.rc启动脚本定制等实际案例,让学员深入理解这些技术在实际产品开发中的应用场景和实现方法,提高学员的实际开发能力和经验,从而更好地应对实际产品开发中遇到的问题和挑战。知识运用方向学习Android启动方面的知识,可以参与如下实际开发工作项:启动流程定制: 根据产品需求调整Android启动流程,包括修改init.rc脚本、修改启动顺序和等待时间、加入自定义服务等。属性系统定制: 通过Android属性系统定制化启动流程,例如增加产品版本信息、定制开机音量等。日志系统分析: 掌握日志的捕捉、分析和排错技术,在启动过程中,需要加入调试信息来方便开发人员进行调试,同时需要进行日志的优化,避免日志输出过多占用过多的系统资源。selinux安全策略定制:在Android系统中,selinux是一种安全机制,用于保护系统的敏感资源和数据。在实际开发中,可能需要对selinux策略进行定制,以确保系统的安全性和稳定性。课程内容主要内容简述1, RK3399 开发板操作这部分内容重点介绍如何在FIreFly开发板上将Android 10系统运行起来, 包含编译FireFly的Android源码下载和编译, 镜像烧录运行,内核和模块编译,以及RK3399内核启动init进程的过程。2, 产品定制这部分讲解获取到方案商或者原厂提供的源码后, 如何定制一个新的产品,产品配置文件和模型, 原始代码中的配置文件和定制化东西3, Android日志代码编写之前讲过Android的日志系统, 并没涉及到代码编写, 这个部分重点讲解C/C++, java代码编写日志的API和代码4, 属性系统在Android中,属性使用的非常频繁的,可以用来作为进程间通信,也可以用于一些行为控制, 这个部分会重点介绍属性系统框架, API接口, 属性文件等知识点5,selinux进程对文件进行访问时,Android 4.3就开始集成了selinux权限管控, 如果需要启动某个脚本或者服务, selinux的配置就避免不了,并且Android8之后, Android系统对进程访问的权限管控的非常严格。6, init.rc脚本Android定义的一种脚本, 改脚本是有init进程启动, 是非常重要的一个脚本, 会包含系统中的其他很多脚本, 在我们系统开发时, 我们经常通过这个脚本进行一些定制化动作。7, init进程代码分析想要了解一个系统,就必须对源码进行分析和理解, 这个章节,带大家去跟读init进程代码, 这样,换了另外一个Android版本,完全就可以去读代码, 知道有什么变化。 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值