系统优化 - 去除电池电量监测管理功能
- 去除电池电量监测管理功能,去除电量提示功能。
- 需要去除电池电量对升级功能的影响,如低电量时无法进行系统升级。
- 车机平台不需要电池电量监测管理,电池管理模块对界面显示和系统功能交互的部分都需要屏蔽。
1.电池状态栏
/frameworks/base/packages/SystemUI/res/layout/system_icons.xml
<!--电池图标的部分:-->
<com.android.systemui.BatteryMeterView android:id="@+id/battery"
android:layout_height="14.5dp"
android:layout_width="9.5dp"
+++ android:visibility="gone" 电池
android:layout_marginBottom="@dimen/battery_margin_bottom"/>
<!--电池电量百分比的部分:-->
<com.android.systemui.BatteryLevelTextView android:id="@+id/battery_level_text"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:gravity="center"
android:layout_gravity="center_vertical"
android:textColor="#ffffff"
android:textSize="@dimen/battery_level_text_size"
android:layout_marginStart="7dp"/>
/frameworks/base/packages/SystemUI/res/layout/status_bar.xml
从布局来看,电池的显示属于status_bar.xml,包含了system_icons.xml布局
<include layout="@layout/system_icons"/>
Android4.4 隐藏状态栏图标(电池,信号,时间):只要在每个icon上加android:visibility=“gone”
2.移除设置中电池选项
Android6.0 移除设置中电池选项,只要关注setting app下有关电池的xml和代码
- 注释电池相关模块 /packages/apps/Settings/AndroidManifest.xml
<meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
android:resource="@id/battery_settings" />
- 注释电池相关模块 /packages/apps/Settings/res/xml/dashboard_categories.xml
<dashboard-tile
android:id="@+id/battery_settings"
android:title="@string/power_usage_summary_title"
android:fragment="com.android.settings.fuelgauge.PowerUsageSummary"
android:icon="@drawable/ic_settings_battery" />
- 移除电池注册模块 /packages/apps/Settings/src/com/android/settings/SettingsActivity.java
// registerReceiver(mBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
//unregisterReceiver(mBatteryInfoReceiver);
在这个代码下搜R.id.battery_settings把这个相关代码也移除
3.关于手机里面的状态信息中移除电池相关
- 注释 /packages/apps/Settings/res/xml/device_info_status.xml
<Preference android:key="battery_status"
style="?android:attr/preferenceInformationStyle"
android:title="@string/battery_status_title"
android:summary="@string/device_info_not_available"
android:persistent="false" />
<Preference android:key="battery_level"
style="?android:attr/preferenceInformationStyle"
android:title="@string/battery_level_title"
android:summary="@string/device_info_not_available"
android:persistent="false" />
- 注释相关代码 /packages/apps/Settings/src/com/android/settings/deviceinfo/Status.java
@@ -89,8 +89,8 @@ public class Status extends PreferenceActivity {
private String mUnavailable;
private Preference mUptime;
- private Preference mBatteryStatus;
- private Preference mBatteryLevel;
+ // private Preference mBatteryStatus;
+ // private Preference mBatteryLevel;
private Preference mBtAddress;
@@ -131,8 +131,8 @@ public class Status extends PreferenceActivity {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
- mBatteryLevel.setSummary(Utils.getBatteryPercentage(intent));
- mBatteryStatus.setSummary(Utils.getBatteryStatus(getResources(), intent));
+ // mBatteryLevel.setSummary(Utils.getBatteryPercentage(intent));
+ // mBatteryStatus.setSummary(Utils.getBatteryStatus(getResources(), intent));
@@ -166,8 +166,8 @@ public class Status extends PreferenceActivity {
mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
addPreferencesFromResource(R.xml.device_info_status);
- mBatteryLevel = findPreference(KEY_BATTERY_LEVEL);
- mBatteryStatus = findPreference(KEY_BATTERY_STATUS);
+ // mBatteryLevel = findPreference(KEY_BATTERY_LEVEL);
+ // mBatteryStatus = findPreference(KEY_BATTERY_STATUS);
mBtAddress = findPreference(KEY_BT_ADDRESS);
4.电池低电量告警提示
通过发送intent ACTION_BATTERY_CHANGED,也就是电池电量只要变化就检查是否需要低电量告警,并且实现挪到了PowerUI中。
frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
public void start() {
......
//注册intent, 主要关注的是ACTION_BATTERY_CHANGED消息。
// Register for Intent broadcasts for...
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
}
当电池电量发生变化的时候,BatteryService就会发送 ACTION_BATTERY_CHANGED的 intent.
接着如下函数就会被调用:
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
......
mBatteryStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS,
BatteryManager.BATTERY_STATUS_UNKNOWN);
......
if (!plugged
&& (bucket < oldBucket || oldPlugged)
&& mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN
&& bucket < 0) {
showLowBatteryWarning();
......
}
}
};
如果不想要显示低电量对话框, 只要不调用showLowBatteryWarning()即可。
5.关闭低电提醒
- 关闭/打开低电压声音提醒
修改setting provider中的def_power_sounds_enabled配置项。文件地址如下:
android/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
将def_power_sounds_enabled的值改为0即关闭低电提示。将值改为1时表示打开提示。
- 修改低电提示音文件
修改setting provider中的def_low_battery_sound配置项。文件地址如下:
android/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
- 修改低电提示音阈值
修改低电提示音阈值可以修改如下文件android/frameworks/base/core/res/res/values/config.xml中如下两个值:
<!-- Display low battery warning when battery level dips to this value -->
<integer name="config_lowBatteryWarningLevel">15</integer>
<!-- Close low battery warning when battery level reaches this value -->
<integer name="config_lowBatteryCloseWarningLevel">20</integer>
6.framework层
电池图标具体的实现显示和更新分别在两个自定义View中实现:BatteryMeterView和BatteryLevelTextView
在原生的实现中: BatteryMeterView这个类来监听电池状态的变化的,是一个被BatteryController类所管理的ImageView。 BatteryController通过监听android.intent.action.BATTERY_CHANGED广播以从 BetteryService中获取电量信息,并根据电量信息画一个电池图标在画布上。
- 电池服务的源码结构
Framework\base\services\java\com\android\server
- SystemServer.java
创建BatteryServices、PowerManagerService、ActivityManagerService - BatterySevices.java
监听底层上报的battery事件,广播电池发生改变的消息
Framework\base\services\java\com\android\server\am
- ActivityManagerService.java
创建BatteryStatsService - BatteryStatsService.java
统计和记录电池参数的信息
Framework\base\services\java\com\android\server\power
- PowerManagerService.java
监听电池发生变化的广播消息,并调节系统的电源状态,例如亮屏
Framework\base\core\java\com\internal\os
- BatteryStatsImpl.java
统计和记录电池参数的信息,并通知其他模块
System\core\healthd
- healthd.cpp
创建uevent socket,监听内核上报的内核事件 - BatteryMonitor.cpp
初始化本地电池数据结构,将power_supply路径下属性节点路径填充进去, - BatteryMonitor.h
- BatteryPropertiesRegistrar.cpp
创建电池属性监听器,并将其注册到Android的系统服务中 - BatteryPropertiesRegistrar.h
- 用户层
用户层则是在BatteryService.java中通过广播的方式将如下一些电池相关的属性上报给上层app使用。
frameworks/base/services/java/com/android/server/BatteryService.java
BatteryService 在SystemServer.java 中创建,BatteryService是在系统启动的时候就跑起来的,为电池及充电相关的服务,主要作了如下几件事情: 监听 UEvent、读取sysfs 中的状态 、发出广播Intent.ACTION_BATTERY_CHANGED通知上层