读取库伦值的目的是为了换算成电流,量化场景功耗用途
1.报错日志
/power_log/debuglogger$ adb shell dmesg | grep -Ei "avc.+.system_server"
[ 79.942272] logd.auditd: type=1400 audit(1744279324.832:7149): avc: denied { read } for comm="binder:1548_6" name="charge_counter" dev="sysfs" ino=55475 scontext=u:r:system_server:s0 tcontext=u:object_r:sysfs_batteryinfo:s0 tclass=file permissive=0
[ 79.942359] logd.auditd: type=1400 audit(1744279324.832:7150): avc: denied { read } for comm="binder:1548_6" name="temp" dev="sysfs" ino=55479 scontext=u:r:system_server:s0 tcontext=u:object_r:sysfs_batteryinfo:s0 tclass=file permissive=0
由于库伦值和电池温度节点属于都是 sysfs_batteryinfo默认不允许访问的,故我们需要配置节点域
因为上述配置的节点,如果直接按avc配置规则,一般会报如下 neverallow 异常,因为上述配置的节点都是 sysfs_batteryinfo默认不允许访问的,故我们需要配置节点域。
错误配置案例:allow system_server sysfs_batteryinfo:file { read open getattr };,直接无法编译成功,会提示neverallow
neverallow check failed at out_sys/soong/.intermediates/system/sepolicy/plat_sepolicy.cil/android_common/plat_sepolicy.cil:14894 from system/sepolicy/private/domain.te:1557
(neverallow base_typeattr_451 sysfs_batteryinfo (file (read open)))
<root>
allow at out_sys/soong/.intermediates/system/sepolicy/system_ext_sepolicy.cil/android_common/mssi_64_cn_armv82/system_ext_sepolicy.cil:2885
(allow system_server sysfs_batteryinfo (file (read getattr open)))
Failed to generate binary
Failed to build policydb
2.解决方案system/sepolicy/private/domain.te 去掉neverallow配置
哪里不允许修改为允许,例如新增 -system_server
# Platform must not have access to sysfs_batteryinfo, but should do it via health HAL
full_treble_only(`
neverallow {
coredomain
-shell
# For access to block device information under /sys/class/block.
-apexd
# Read sysfs block device information.
-init
# Generate uevents for health info
-ueventd
# Recovery uses health HAL passthrough implementation.
-recovery
# Charger uses health HAL passthrough implementation.
-charger
-incidentd
-system_app
-system_server
} sysfs_batteryinfo:file { open read };
')
system_server.te 添加读写权限
allow system_server sysfs_batteryinfo:dir { search };
allow system_server sysfs_batteryinfo:file { read open getattr };
3.代码读取库伦值示例
/**
* Get battery charge counter value
*/
private static final String BATTERY_CAPACITY_PATH
= "/sys/class/power_supply/battery/charge_counter";
public static int getBatteryCapacity() {
return getBatteryFileNode(BATTERY_CAPACITY_PATH) / 1000;
}
public static int getBatteryCapacity(Context context) {
BatteryManager batteryManager = (BatteryManager)
context.getSystemService(Context.BATTERY_SERVICE);
if (batteryManager == null) {
return -1;
}
return (int) batteryManager.getLongProperty(
BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER);
}
/**
* Get cpu temparature
*/
public static String getBatteryTemperature() {
String line = null;
String temp = null;
line = FileUtils.readFileNode("/sys/class/power_supply/battery/temp");
if (line != null) {
temp = line.trim();
} else {
temp = "-1";
}
return temp;
}
public static int getBatteryTemperature(Context context) {
Intent batteryIntent = context.registerReceiver(null,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
return batteryIntent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
}
4.刷机验证 system_server 进程正常读取charge_counter和temp
/codes/MTK_A15/alps$ adb shell dumpsys EngineService getBatteryCapacity
getBatteryCapacity=2946,getBatteryTemperature=290,getBatteryApiCapacity=2946000,getBatteryApiTemperature=290