安卓从入门到进阶第六章(dumpsys初探)
我希望文章是给出一个思路,让你能够跟着这个,找到框架,然后自行分析,总结,得到知识。
阅读代码,是需要长时间的训练,从问题出发,就跟从项目出发一样,在实战当中,倒逼自己提升,思考。
这一章分享一个小知识,关于自动亮屏的定位策略。
默认的配置值在
frameworksbasepackagesSettingsProvidersrccomandroidproviderssettings
文件
DatabaseHelper.java
loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
R.bool.def_screen_brightness_automatic_mode);
这里配置值位置:
frameworksbasepackagesSettingsProviderresvalues
defaults.xml
配置着默认值:
true
这样子我们就知道了,代码中检索使用这个
SCREEN_BRIGHTNESS_MODE信息了。
我们可以在设置和下拉状态栏,只需要将设置值传入系统即可,后续的动作都在系统中处理。检索这个 SCREEN_BRIGHTNESS_MODE,会找到整个的关联。
具体的文件为:
frameworksbaseservicescorejavacomandroidserverdisplay
AutomaticBrightnessController.java(监听光感传感器,在变化后响应)
和
DisplayPowerController.java(这里贴一段关键的逻辑,自动亮屏获取值,然后返回brightness,然后设置下去。)
这里直接就会走到设置屏幕亮度的。整个上层只是设置开关,整体逻辑都是驱动和服务处理。如果需要分析这里的故障:
编译版本时候,需要开启AutomaticBrightnessController.java 中的
private static final boolean DEBUG = false;
private static final boolean DEBUG_PRETEND_LIGHT_SENSOR_ABSENT = false;
改成
private static final boolean DEBUG = true;
private static final boolean DEBUG_PRETEND_LIGHT_SENSOR_ABSENT =true;
再将DisplayPowerController.java
private static final boolean DEBUG = false;
private static final boolean DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT = false;
改成
private static final boolean DEBUG = true;
private static final boolean DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT = true;
整体的代码流程为:自动亮屏开启后,AutomaticBrightnessController会收到变化回调,在回调后,触发handleLightSensorEvent。
随后会调用到DisplayPowerController里面,从AutomaticBrightnessController.config进行更新,然后获取最新的亮度值,赋值到brightness=getAutomaticScreenBrightness,然后动态更新:
如果你可以调试,那就直接在这里下断点,分析就好了。
具体调试,参考 安卓从入门到进阶第四章(调试方法),如果你对这块知识感兴趣,记得实战,跟着这个框架,进行阅读,分析。
关于上一章遗留的问题,下一章进行讲解。也就是 系统不断的弹出一个界面,我想知道是谁拉起来的,该怎么分析呢?
我们下一节来讲这个,具体会说一些关于binder的知识(忽略细节,直接关注核心),可以先看看这个文章( 文中的zygote拼错了,不要在意)
安卓从入门到进阶第二篇(框架流程)
后台回复 精华获取去年一年的精彩 PDF。
推荐你读: