Android添加一个按键流程及SELinux权限问题

最近做高通平台P版本遇到一个添加按键问题,驱动在底层添加了节点,后面就不管了,刚好借此机会搞一下添加案件的整个流程下面写下流程,以做笔记

1.驱动添加节点:节点就是驱动添加的文件 ,sys/class/ant_class/ant_hb_state sys/class/ant_class/ant_mb_state

在kernel\msm-4.4\include\uapi\linux\input-input-codes.h里面添加按键按下 弹起,这里面是16进制

// add for sar ant check by xiaopei at 20190520
#define KEY_ANT_HB_CONNECT         0x292
#define KEY_ANT_HB_UNCONNECT       0x293

#define KEY_ANT_MB_CONNECT         0x294
#define KEY_ANT_MB_UNCONNECT       0x295
// add for sar ant check by xiaopei at 20190520

2./frameworks/native/include/input/InputEventLabels.h

在这个数组static const InputEventLabel KEYCODES[] 里面添加自己定义的按键

    DEFINE_KEYCODE(CAPSENSE_DETECT2),
    DEFINE_KEYCODE(CAPSENSE_RELEASE0),
    DEFINE_KEYCODE(CAPSENSE_RELEASE1),
    DEFINE_KEYCODE(CAPSENSE_RELEASE2),
    // add by ronghui.wang for sarsensor end
    // add by qiuyongwei for ant test begin
    DEFINE_KEYCODE(ANT_CONNECT),
    DEFINE_KEYCODE(ANT_UNCONNECT),
    // add by qiuyongwei for ant test end
	// add by wangdonghai for ant_mb test begin
    DEFINE_KEYCODE(ANT_MB_CONNECT),
    DEFINE_KEYCODE(ANT_MB_UNCONNECT),
    // add by wangdonghai for ant_mb test end
    { NULL, 0 }
};

3.kl文件 很重要 不添加是检测不到按键的 

我添加的 按我们公司 都这么添加的 

./framewprk/base/data/keyboards/Generic.kl


# add by ronghui.wang for sarsensor begin
key 752 CAPSENSE_DETECT0
key 753 CAPSENSE_DETECT1
key 754 CAPSENSE_DETECT2
key 755 CAPSENSE_RELEASE0
key 756 CAPSENSE_RELEASE1
key 757 CAPSENSE_RELEASE2
# add by ronghui.wang for sarsensor end
#add by qiuyongwei ant_check
key 658 ANT_CONNECT
key 659 ANT_UNCONNECT
#add by wangdonghai ant_mb_check begin
key 660 ANT_MB_CONNECT
key 661 ANT_MB_UNCONNECT
#add by wangdonghai ant_mb_check end

下面是参考文章的.里面有怎么查找文件路径的方法:

kl文件的作用是把底层传上来的键值映射为Android键值,一般情况下,文件内容如下

1. key     233    CUSTOM_KEYCODE
2. 第一列表示 这行是普通的键值
3. 第二列表示 是linux 键值,即scancode
4. 第三列表示 android 键名

或者

key usage 0x0c0073 YOUTUBE
kl文件的命名

kl文件的命名是有规律可循的,每一个设备都会有一个Vendor ID 和一个Product ID 这是由设备厂商命名的,一般来说文件会被命名为如下所示内容,注意最后的Product ID:xxxx不能是0

1.Vendor_xxxx_Product_xxxx.kl
kl文件的优先级

按照Android标准,kl文件设备中如下所示顺序查找对应关系

1. /system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl  
2 ./system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl  
3. /system/usr/keylayout/DEVICE_NAME.kl  
4. /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl  
5. /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl  
6. /data/system/devices/keylayout/DEVICE_NAME.kl  
7. /system/usr/keylayout/Generic.kl  
8. /data/system/devices/keylayout/Generic.kl  
一般来说kl文件由厂家提供,但是有一些无良厂家不想修改,如果键值不冲突,可以直接在Generic.kl文件中更改。

Generic.kl文件在代码中的位置为

1./framewprk/base/data/keyboards/Generic.kl
添加自定义的kl文件

kl文件可以通过device.mk文件直接配置到系统中,具体的代码类似如下

PRODUCT_COPY_FILES += $(DEVICE_FOLDER)/configs/Vendor_000d_Product_0001.kl:/system/usr/keylayout/Vendor_000d_Product_0001.kl

4.keycodes.h文件  frameworks/native/include/android/keycodes.h

这个文件映射的是Android中的键值,这个键值和InputEventLabel.h文件中数组添加的键名有一个映射关系,Android也是借此实现了从Linux键值到Android键值的映射

修改这个文件很简单,只要在enum中添加如下值就好了

    // add by qiuyongwei for sarsensor begin
    AKEYCODE_ANT_CONNECT = 658,
    AKEYCODE_ANT_UNCONNECT = 659,
    // add by qiuyongwei for sarsensor end
	
	// add by wangdonghai for sarsensor begin 
    AKEYCODE_ANT_MB_CONNECT = 660,
    AKEYCODE_ANT_MB_UNCONNECT = 661,
    // add by wangdonghai for sarsensor end

5.KeyEvent.java

这个文件是最后一步,Andriod借此文件把键值从c语言转到java语言。 
此文件的位置在:./framework/base/core/java/android/view/KeyEvent.java

	
	// add by wangdonghai for sar_mb sensor begin
    public static final int KEYCODE_ANT_MB_CONNECT = 660;
    public static final int KEYCODE_ANT_MB_UNCONNECT = 661;
    // add by wangdonghai for sar_mb sensor end

6.在frameworks/base/core/res/res/values/attrs.xml添加如下

<attr name="keycode">里面添加

		<!-- add by wangdonghai for ant_mb check begin -->
        <enum name="KEYCODE_ANT_MB_CONNECT" value="660" />
        <enum name="KEYCODE_ANT_MB_UNCONNECT" value="661" />
        <!-- add by wangdonghai for ant_mb check end -->

7.     在Android的framework层的键值处理函数中,捕获按键,并进行相应处理。
在framework层的input系统中,加入对wifi按键的捕获。
添加的文件是:frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
添加的具体方法:在PhoneWindowManager.java的interceptKeyBeforeQueueing()函数中,捕获该键值,至于怎么处理处决您的业务处理了。

       //add by qiuyongwei for sar test end 
		//add by wangdonghai for sar_mb test begin
        else if(KeyEvent.KEYCODE_ANT_MB_CONNECT == keyCode) {
            Log.d(TAG,"KEYCODE_ANT_MB_CONNECT keycode");
			mAntConnectOrUnconnectNum += 1;
            if (mAntConnectOrUnconnectNum == 2) {
                sendAntConnectBroadcast(true);//!
                mAntConnectOrUnconnectNum = 0;
            } 
            return -1;
        }else if(KeyEvent.KEYCODE_ANT_MB_UNCONNECT == keyCode) {
            Log.d(TAG,"KEYCODE_ANT_MB_UNCONNECT keyCode ");
			mAntConnectOrUnconnectNum += 1;
            if (mAntConnectOrUnconnectNum == 2) {
                sendAntConnectBroadcast(false);//!
                mAntConnectOrUnconnectNum = 0;
            } 
            return -1;
        }
        //add by wangdonghai for sar_mb test end   

                      ------------------------------下面是另一个重点 app读驱动添加的节点,涉及SELinux权限--------------------------

8.下面就是上层app处理了,但是这里又有常见的难点来了。最开始的地方,驱动添加了节点,上层想读节点值,就需要SELinux了,这块有的公司有专门人搞 有的公司是驱动搞 有的公司是做系统的搞 最好了解一下 掌握了好

SELinux的话 之前我搞过简单的,参考这篇文章:https://blog.csdn.net/qq_25815655/article/details/90780805

Android O源码中 SELinux 相关文件位置

如下位置放置上下文定义文件及各种资源具体的访问策略。

/system/sepolicy/private/ system分区private

/system/sepolicy/public/ system分区public

/system/sepolicy/vendor/ vendor分区

/system/sepolicy/reqd_mask/

/vendor/xxx/sepolicy/ vendor分区

/device/xxx/sepolicy/ 厂商定制

/system/sepolicy/prebuilts/api/26.0/ 版本兼容

/build/make/target/board/generic/sepolicy/

/build/target/board/generic/sepolicy/

从上面来看 厂商定制的文件路径很清晰了 ,/device/xxx/sepolicy/ 厂商定制,高通:/device/qcom/sepolicy  mtk:/device/mediatek/sepolicy ,system里面的不要去改动,大牛除外,你懂里面的改动的自己可以改

我的报错信息:avc: denied { read } for name="ant_hb_state" dev="sysfs" ino=33473 scontext=u:r:system_app:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0

先说一下怎么判断是不是SELinux权限的问题,userdebug 版本开机后,可以通过adb命令来查看或设置SELinux模式(设置后需重启shell才真正生效,手机重启后恢复),可以用此方法排除问题:

adb shell getenforce,会返回 Enforcing 或 Permissive

adb shell setenforce 1或0,设置其为 Enforcing 或 Permissive()

adb shell setenforce 0关闭权限 你能读到文件了 ;adb shell setenforce 1打开权限检查 你读不到文件了 这就是SELinux权限的问题

下面我的问题解决方法

1.修改文件 device/qcom/sepolicy/vendor/common/system_app.te   device/qcom/sepolicy/system里面是google默认的 不能改

#add by wangdonghai for sar test begin
allow system_app sysfs_ant_mb_state:file { read open getattr write };
allow system_app sysfs_ant_hb_state:file { read open getattr write };
#add by wangdonghai for sar test end

这里特别说下,一般按照规则 allow scontex tcontex:tclass action 来改即可 即我这里本来写 all system_app sysfs file { read open getattr write}即可 不过这里添加后编译报错 :neverallow 不允许的权限

这里就需要自己添加类型 即我们不用sysfs这个scontext了

2.device/qcom/sepolicy/vendor/common/file_contexts  这里我们想读的文件是/sys/class/ant_class/ant_hb_state       /sys/class/ant_class/ant_mb_state 给他重新定义了一个scontext

# add by wangdonghai for sar test begin
/sys/class/ant_class/ant_mb_state            u:object_r:sysfs_ant_mb_state:s0
/sys/class/ant_class/ant_hb_state            u:object_r:sysfs_ant_hb_state:s0
# add by wangdonghai for sar test end

3.device/qcom/sepolicy/vendor/common/file.te里面添加

# add by wangdonghai for sar test
type sysfs_ant_mb_state, sysfs_type, fs_type;
type sysfs_ant_hb_state, sysfs_type, fs_type;

然后make -j16编译烧机 ok了此过程中有参考文章 主要是有同事指导 真心的非常感谢

 

下面是参考的文章链接

添加按键问题:http://blog.chinaunix.net/uid-30200982-id-5470930.html

                        https://blog.csdn.net/xct841990555/article/details/81067727

                        https://blog.csdn.net/u013894427/article/details/78088260

上面这3个链接看了 基本都一样 差异不大,这才说明这种方法正确哈

SELinux权限问题:https://blog.csdn.net/qq_25815655/article/details/90780805

这里其实看了很多文章 也没看出什么结果 只是懂一半添加方法 还有待研究 主要是同事指点的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值