android关闭背光

news/2024/9/23 6:28:16/

android关闭背光

  • Android11
  • 方法1(可能关不完还是会有点亮):
  • 方法2(这个涉及系统权限):
    • 2.1调试:
    • 2.2处理问题:
      • 2.2.1 处理核心代码
      • 2.2.2 验证 遇到问题
      • 2.2.3 验证 遇到问题检查要操作文件得权限:
      • 2.2.4 检查Slinux权限
    • 2.3 解决问题
      • 2.3.1 文件权限得处理
      • 2.3.2 Slinux权限处理
        • 2.3.2 .1 查看缺少什么权限
        • 2.3.2 .2 缺什么权限添加什么权限
        • 2.3.2 .3.1 解决Neverallow(会引起失败项,如果有这方面限制得直接跳转 2.3.2 .3.2)
        • 2.3.2 .3.2 解决Neverallow,并添加自定义type(不会引起失败项)
        • 2.3.2 .4 查看文件是否为快捷
      • 2.3.3 这样修改后同时也导致了一个新的问题(状态栏亮度条,调节失效)

Android11

方法1(可能关不完还是会有点亮):

import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;try{int brightness_val = Settings.System.getInt(context.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS);}catch(SettingNotFoundException e){e.printStackTrace();}

按照这个方案,设置屏幕亮度,系统亮度只会变暗,并不会完全关闭背光,所以就有了方案2

方法2(这个涉及系统权限):

2.1调试:

  1. adb root;

  2. adb remount;

  3. adb shell

  4. echo 0 > /sys/class/backlight/***/brightness 屏幕亮度完全关闭这就是我们需要得功能

2.2处理问题:

到此测试完成后,拿到这个功能后我脑子就闪过这是一个文件,既然文件,内容修改,那一定就能想到File流处理(现在还不确定是否有效):

2.2.1 处理核心代码

import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import java.io.PrintStream;
import java.io.FileNotFoundException;
import android.os.Handler;private static final String PRODUCTINFO_DIR = "/sys/class/backlight/***";private File BOOT_VERSION_FILE = new File(PRODUCTINFO_DIR, "brightness");/*核心方法  start*/private boolean modifyFile(int string,String path) {PrintStream stream=null;try {stream=new PrintStream(path);stream.print(string);android.util.Log.d(TAG,"Write brightness success!");return true;} catch (FileNotFoundException e) {android.util.Log.d(TAG,"Write brightness faile!");e.printStackTrace();} finally {Log.d(TAG, "Write brightness close.");stream.close();}return false;}/*核心方法   end*//* 调用  start*/int  brightness_val =0;//获取当前亮度,try{brightness_val=  Settings.System.getInt(mContext.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS);}catch(SettingNotFoundException e){e.printStackTrace();}final int  brightness_val_put = brightness_val;//临时关闭背光亮度,为全灭modifyFile(0,"/sys/devices/platform/***/backlight/***/brightness");//500ms 后屏幕亮起new Handler().postDelayed(new Runnable() {public void run(){//将临时亮度还原modifyFile(brightness_val_put,"/sys/class/backlight/***/brightness");}}, 500);/* 调用     end*/

2.2.2 验证 遇到问题

编译后push 进手机验证,没有任何效果。打印log查看一下
adb logcat -v time

08-13 09:32:51.911 W/System.err(15160): java.io.FileNotFoundException: /sys/class/backlight/***/brightness: open failed: EACCES (Permission denied)
08-13 09:32:51.911 W/System.err(15160): 	at libcore.io.IoBridge.open(IoBridge.java:492)
08-13 09:32:51.912 W/System.err(15160): 	at java.io.FileOutputStream.<init>(FileOutputStream.java:236)
08-13 09:32:51.912 W/System.err(15160): 	at java.io.FileOutputStream.<init>(FileOutputStream.java:125)
08-13 09:32:51.912 W/System.err(15160): 	at java.io.PrintStream.<init>(PrintStream.java:215)
08-13 09:32:51.915 W/System.err(15160): Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
08-13 09:32:51.915 W/System.err(15160): 	at libcore.io.Linux.open(Native Method)
08-13 09:32:51.915 W/System.err(15160): 	at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
08-13 09:32:51.915 W/System.err(15160): 	at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
08-13 09:32:51.915 W/System.err(15160): 	at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
08-13 09:32:51.916 W/System.err(15160): 	at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7806)
08-13 09:32:51.916 W/System.err(15160): 	at libcore.io.IoBridge.open(IoBridge.java:478)

怎么办呢,去网上搜索了一番说是缺少某些权限(进入源码里查看,以下权限都添加了,并不是这个得原因,还是记录一下吧万一以后遇到呢)

检查是否在 AndroidManifest.xml 文件中添加了以下两个权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
如果用的Android 10.0及以上的Android设备,请动态申请权限,并在 AndroidManifest.xml中application标签内加上android:requestLegacyExternalStorage="true"
<application...android:requestLegacyExternalStorage="true"...>...
</application>

2.2.3 验证 遇到问题检查要操作文件得权限:

  1. adb root;

  2. adb remount;

  3. adb shell

  4. ls -lZ >/sys/class/backlight/***/brightness

-rw-rw-r-- 1 system system u:object_r:sysfs:s0  4096 2021-08-13 10:13 /sys/class/backlight/***/brightness

0664(-rw-rw-r–),权限不够?那我们尝试将此文件的权限更改一下,执行第5步,
5. chmod 666 /sys/class/backlight/***/brightness
验证一下,还是没有效果。

2.2.4 检查Slinux权限

  1. adb root;

  2. adb remount;

  3. adb shell setenforce 0;

再次尝试,验证ok,

2.3 解决问题

经过测试,与文件的权限和Slinux均有关系。

2.3.1 文件权限得处理

grep -nr “/sys/class/backlight/xxx/brightness”

device\xxx\mpool\module\display\main.rc
找到如下代码:

chmod 0664 /sys/class/backlight/***/brightness

将其改为

chmod 666  /sys/class/backlight/xxx/brightness

编译进手机查看文件权限处理,是否生效

  1. adb root;

  2. adb remount;

  3. adb shell

  4. ls -lZ >/sys/class/backlight/xxx/brightness

-rw-rw-rw-- 1 system system u:object_r:sysfs:s0  4096 2021-08-13 10:13 /sys/class/backlight/xxx/brightness

文件权限,已解决,

2.3.2 Slinux权限处理

2.3.2 .1 查看缺少什么权限

  1. adb root;

  2. adb remount;

  3. adb shell setenforce 0;

  4. adb shell cat /proc/kmsg | grep avc 得到以下log

<38>[11151.737068] c0 type=1400 audit(1628831973.735:4146): avc: denied { write } for comm="进程名" name="brightness" dev="sysfs" ino=24255 scontext=u:r:system_app:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1
<38>[11151.737427] c0 type=1400 audit(1628831973.735:4147): avc: denied { open } for comm="进程名" path="/sys/class/backlight/xxx/brightness" dev="sysfs" ino=24255 scontext=u:r:system_app:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1
<38>[11151.739510] c0 type=1400 audit(1628831973.735:4148): avc: denied { getattr } for comm="进程名" path="/sys/class/backlight/xxx/brightness" dev="sysfs" ino=24255 scontext=u:r:system_app:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1

2.3.2 .2 缺什么权限添加什么权限

device\xxx\mpool\module\app\msepolicy\vendor\system_app.te
添加如下代码:
allow system_app sysfs:file { write open getattr };

编译,得时候报错,报错信息如下:

libsepol.report_failure: neverallow on line 97 of system/sepolicy/private/coredomain.te (or line 36549 of policy.conf) violated by allow system_app sysfs:file { write };
libsepol.report_failure: neverallow on line 514 of system/sepolicy/public/app.te (or line 9969 of policy.conf) violated by allow system_app sysfs:file { write };
libsepol.check_assertions: 2 neverallow failures occurred
Error while expanding policy

原因是 Google 不允许应用进程写 sysfs 类型的文件

2.3.2 .3.1 解决Neverallow(会引起失败项,如果有这方面限制得直接跳转 2.3.2 .3.2)

system/sepolicy/public/app.te
system/sepolicy/prebuilts/api/28.0/public/app.te
(这两个文件都需要修改内容必须保持一致否则也会编译不过)

Write to various pseudo file systems.
--neverallow { appdomain -bluetooth -nfc }
++neverallow { appdomain -bluetooth -nfc  -system_app}sysfs:dir_file_class_set write;

到此为止整个方案结束,如果担心失败项的继续往下看!!!!!

2.3.2 .3.2 解决Neverallow,并添加自定义type(不会引起失败项)

device\sprd\mpool\sepolicy\system\public\file.te
sysfs_xxx(可以自定义)

++type sysfs_xxx, fs_type,sysfs_type;

device\sprd\mpool\sepolicy\system\private\file_contexts

++ /sys/class/backlight/xxx/brightness      u:object_r:sysfs_xxx:s0

device\xxx\mpool\module\app\msepolicy\vendor\system_app.te

-- allow system_app sysfs:file { write open  getattr };
++ allow system_app sysfs_xxx:file { write open  getattr};

编译验证,还是没有效果

2.3.2 .4 查看文件是否为快捷

执行 2.3.2 .1 操作,log如下:

<36>[ 1019.507778] c3 type=1400 audit(1628852975.491:879): avc: denied { write } for comm="xxx.xxx" name="brightness" dev="sysfs" ino=24255 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0 app=xxx.xxx.xxx
<36>[   57.933396] c1 type=1400 audit(1628852013.903:148): avc: denied { open } for comm="xxx.xxx" name="brightness" dev="sysfs" ino=24255 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0 app=xxx.xxx.xxx
<38>[   92.602822] c1 type=1400 audit(1628843243.579:316): avc: denied { getattr } for comm="xxx.xxx" name="brightness" dev="sysfs" ino=24255 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1 app=xxx.xxx.xxx

在 device\xxx\mpool\module\app\msepolicy\vendor\platform_app.te 添加

++ allow platform_app sysfs_xxx:file { write open  getattr};

编译还是无效,不是说缺什么权限加什么权限吗?怎么会没效果呢。

通过adb命令进入sys/class/leds这个目录下用ls -l发现
/sys/class/backlight/只是devices/platform/xxx/backlight/xxxx创建得软连接

130|A70:/ #  ls -l  /sys/class/backlight/
total 0
lrwxrwxrwx 1 root root 0 2021-08-14 20:27 xxx-> ../../devices/platform/xxx/backlight/xxxx

修改以下代码:
device\xxx\mpool\sepolicy\system\private\file_contexts

-- /sys/class/backlight/xxx/brightness      u:object_r:sysfs_xxx:s0
++/sys/devices/platform/xxx/backlight/xxx/brightness     u:object_r:sysfs_xxx:s0

编译验证ok。结束!!!!!!!!!!!!!!!!!!!!!!

2.3.3 这样修改后同时也导致了一个新的问题(状态栏亮度条,调节失效)

调节状态栏亮度条,打印avc log抛出一下异常

<36>[  188.094015] c0 type=1400 audit(1629299395.023:344): avc: denied { read write open getattr } for comm="进程名" path="/sys/devices/platform/xxx/backlight/xxx/brightness" dev="sysfs" ino=23184 scontext=u:r:hal_light_default:s0 tcontext=u:object_r:sysfs_xxx:s0 tclass=file permissive=0

根据缺什么权限就加什么权限的原则
device\xxx\mpool\module\light\msepolicy\vendor\hal_light_default.te
allow hal_combined_default sysfs_xxx:file { read write open getattr };

编译验证还是没反应重上面操作,调节状态栏亮度条,打印avc log还是抛出异常:

<36>[  188.094015] c0 type=1400 audit(1629299395.023:344): avc: denied { read write open getattr } for comm="进程名" path="/sys/devices/platform/xxx/backlight/xxx/brightness" dev="sysfs" ino=23184 scontext=u:r:hal_combined_default:s0 tcontext=u:object_r:sysfs_xxx:s0 tclass=file permissive=0

\device\xxx\mpool\sepolicy\vendor\hal_combined_default .te

allow hal_combined_default sysfs_demo:file { read write open getattr };

验证,ok
结束!!!!!!!!!!!!!!!!!!!


http://www.ppmy.cn/news/871317.html

相关文章

Android屏幕背光调整机制

扩展一个硬件&#xff08;比如LED、蓝牙、传感器等&#xff09;&#xff0c;至少需要硬件、驱动、驱动交互模块。至于系统的层面如何把系统库加入自己的体系里面去&#xff0c;就是操作系统自己的事了。这里分析一下以背光调整为例Android。 源码在这里&#xff1a;http://code…

Android背光系统实现

&#xff08;一&#xff09;Lights应用层 SystemUI——系统应用&#xff0c;其主要功能&#xff1a;状态栏信息显示、通知面板、截图/壁纸/屏保服务等&#xff1b; 代码&#xff1a; packages/apps/Settings/src/com/android/settings/BrightnessPreference.java frameworks/…

LCD背光调节实验

目录 LCD 背光调节简介硬件原理分析实验程序编写编译下载验证编写Makefile 和链接脚本编译下载 不管是使用显示器还是手机&#xff0c;其屏幕背光都是可以调节的&#xff0c;通过调节背光就可以控制屏幕的亮度。在户外阳光强烈的时候可以通过调高背光来看清屏幕&#xff0c;在光…

Android 系统背光设置

一、一般设置 1、手动设置背光API // 修改当前Activity界面的窗口亮度 private void setScreenLight(int brightness) {WindowManager.LayoutParams lp getWindow().getAttributes();lp.screenBrightness Float.valueOf(brightness) * (1f / 255f);getWindow().setAttribut…

背光

关于液晶显示模块使用的背光源&#xff0c;有几种类型的产品&#xff1a;1、LED背光&#xff1b;2、EL背光&#xff1b;3、CCFL背光。LED背光&#xff0c;其具有 操作简单实用、使用奉命长&#xff0c;功耗低、亮度高等优点。 下面介绍一下LED背光源&#xff1a; 1、可选多种色…

手机背光显示

简介 移动设备如智能手机、电子阅读器和手表在当今世界正变得无处不在。这就需要准确的光学工程的来优化手机功能的性能&#xff0c;如相机系统、传感器和显示器。 手机显示的一个关键设计目标是在它的面积和视角范围内实现均匀的照明。另外&#xff0c;它应该具有高的光学效…

LCD背光,功耗,电池总结

问题&#xff1a;屏半亮&#xff0c;出现闪屏 解决方案&#xff1a;背光驱动中使用spin_lock_irqsave和spin_unlock_irqrestore防止多cpu竞争。 问题 如何让Android进入待机睡眠状态&#xff08;测试LCD电流&#xff09;&#xff1f; 在终端中用如下命令&#xff1a; echo …

2023-07-13 Fitz完成PDF转TXT

Fitz完成PDF转TXT 前言 1、本机为Inspiron 5005&#xff0c;为64位&#xff0c;所用操作系统为Windos 10。所使用开发环境为Anaconda和jupyter notebook。 2、本教程主要实现了安装Anaconda和jupyter notebook&#xff0c;使用Fitz完成PDF转TXT。 Anaconda和Jupyter notebook简…