PMS电源管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lf12345678910/article/details/52911679

http://blog.csdn.net/gaugamela/article/details/52838654

Binderservice : IPowerManager.stub

Localservice : PowerManagerInternal

1、初始化

PMS是在systemserver的startBootstrapServices创建的

 public static void main(String[] args) {
        new SystemServer().run();
    }

private void run() {

// Start services.
        try {
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
        } 

}

(1)、mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);//startBootstrapServices();//PowerManagerService.onstart(); 

(2)、mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());// startOtherServices();

(1)  PMS构造函数分析:

public PowerManagerService(Context context) {
        super(context);
        mContext = context;
        mHandlerThread = new ServiceThread(TAG,
                Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
        mHandlerThread.start();//开启新的消息线程
        mHandler = new PowerManagerHandler(mHandlerThread.getLooper());//独有的消息循环处理中心

        synchronized (mLock) {
            mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
            mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display");
            mDisplaySuspendBlocker.acquire();
            mHoldingDisplaySuspendBlocker = true;
            mHalAutoSuspendModeEnabled = false;
            mHalInteractiveModeEnabled = true;

            mWakefulness = WAKEFULNESS_AWAKE;

            nativeInit();
            nativeSetAutoSuspend(false);
            nativeSetInteractive(true);
        }
    }

    @Override
    public void onStart() {
        publishBinderService(Context.POWER_SERVICE, new BinderService());
        publishLocalService(PowerManagerInternal.class, new LocalService());


        Watchdog.getInstance().addMonitor(this);
        Watchdog.getInstance().addThread(mHandler);
    }

(2)、systemReady

<code class="hljs lasso has-numbering"><span class="hljs-comment">//这里持锁,意味者内部所有函数必须在规定事件内执行完毕</span>
    <span class="hljs-comment">//否则watchDog将会检测到错误</span>
    synchronized (mLock) {
        mSystemReady <span class="hljs-subst">=</span> <span class="hljs-literal">true</span>;
        mAppOps <span class="hljs-subst">=</span> appOps;

        <span class="hljs-comment">//注意下面的对象都是从LocalServices取出的,从之前PMS加入LocalServices的流程来看</span>
        <span class="hljs-comment">//下面取出的实际上应该是继承抽象类的实际子类</span>
        <span class="hljs-comment">//因此大概可以理解LocalServices的作用了,以抽象类名为key,保存实际的子类</span>
        <span class="hljs-comment">//以key取出子类对象时,子类退化为抽象类,于是得到了实际对象,但仅能利用父类的接口</span>
        <span class="hljs-comment">//整个设计演变为面向接口的编程</span>

        <span class="hljs-comment">//从注释来看,与doze有关</span>
        mDreamManager <span class="hljs-subst">=</span> getLocalService(DreamManagerInternal<span class="hljs-built_in">.</span>class);
        <span class="hljs-comment">//显示管理相关</span>
        mDisplayManagerInternal <span class="hljs-subst">=</span> getLocalService(DisplayManagerInternal<span class="hljs-built_in">.</span>class);
        <span class="hljs-comment">//Window管理相关</span>
        mPolicy <span class="hljs-subst">=</span> getLocalService(WindowManagerPolicy<span class="hljs-built_in">.</span>class);
        <span class="hljs-comment">//电源管理相关</span>
        mBatteryManagerInternal <span class="hljs-subst">=</span> getLocalService(BatteryManagerInternal<span class="hljs-built_in">.</span>class);

        <span class="hljs-comment">//这里获取PowerManager就是为了方便获取下面三个系统属性</span>
        PowerManager pm <span class="hljs-subst">=</span> (PowerManager) mContext<span class="hljs-built_in">.</span>getSystemService(Context<span class="hljs-built_in">.</span>POWER_SERVICE);
        mScreenBrightnessSettingMinimum <span class="hljs-subst">=</span> pm<span class="hljs-built_in">.</span>getMinimumScreenBrightnessSetting();
        mScreenBrightnessSettingMaximum <span class="hljs-subst">=</span> pm<span class="hljs-built_in">.</span>getMaximumScreenBrightnessSetting();
        mScreenBrightnessSettingDefault <span class="hljs-subst">=</span> pm<span class="hljs-built_in">.</span>getDefaultScreenBrightnessSetting();

        <span class="hljs-comment">//Sensor相关</span>
        SensorManager sensorManager <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> SystemSensorManager(mContext, mHandler<span class="hljs-built_in">.</span>getLooper());

        <span class="hljs-comment">//系统电量统计有关</span>
        mBatteryStats <span class="hljs-subst">=</span> BatteryStatsService<span class="hljs-built_in">.</span>getService();

        <span class="hljs-comment">// The notifier runs on the system server's main looper so as not to interfere</span>
        <span class="hljs-comment">// with the animations and other critical functions of the power manager.</span>
        mNotifier <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> Notifier(Looper<span class="hljs-built_in">.</span>getMainLooper(), mContext, mBatteryStats,
                mAppOps, createSuspendBlockerLocked(<span class="hljs-string">"PowerManagerService.Broadcasts"</span>),
                mPolicy);

        <span class="hljs-comment">//无线充电检测相关</span>
        mWirelessChargerDetector <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> WirelessChargerDetector(sensorManager,
                createSuspendBlockerLocked(<span class="hljs-string">"PowerManagerService.WirelessChargerDetector"</span>),
                mHandler);
        mSettingsObserver <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> SettingsObserver(mHandler);

        <span class="hljs-comment">//lightService相关</span>
        mLightsManager <span class="hljs-subst">=</span> getLocalService(LightsManager<span class="hljs-built_in">.</span>class);
        mAttentionLight <span class="hljs-subst">=</span> mLightsManager<span class="hljs-built_in">.</span>getLight(LightsManager<span class="hljs-built_in">.</span>LIGHT_ID_ATTENTION);

        <span class="hljs-comment">// Initialize display power management.</span>
        <span class="hljs-comment">//调用DisplayManagerService内部的LocalService的函数</span>
        <span class="hljs-comment">//创建出DisplayBlanker和DisplayPowerController</span>
        mDisplayManagerInternal<span class="hljs-built_in">.</span>initPowerManagement(
                mDisplayPowerCallbacks, mHandler, sensorManager);

        <span class="hljs-comment">//定义一堆BroadcastReceiver</span>
        <span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span>

        <span class="hljs-comment">//利用mSettingsObserver监听一堆数据库字段的变化</span>
        <span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span>

        <span class="hljs-comment">//VR相关</span>
        IVrManager vrManager <span class="hljs-subst">=</span>
                (IVrManager) getBinderService(VrManagerService<span class="hljs-built_in">.</span>VR_MANAGER_BINDER_SERVICE);
        try {
            vrManager<span class="hljs-built_in">.</span>registerListener(mVrStateCallbacks);
        } catch (RemoteException e) {
            Slog<span class="hljs-built_in">.</span>e(<span class="hljs-built_in">TAG</span>, <span class="hljs-string">"Failed to register VR mode state listener: "</span> <span class="hljs-subst">+</span> e);
        }

        <span class="hljs-comment">//从资源文件中读取大量配置信息</span>
        readConfigurationLocked();

        <span class="hljs-comment">//读取数据库字段,保存到本地变量中</span>
        <span class="hljs-comment">//必要时会进行一些实际的操作,例如设置feature到native层的动态库</span>
        updateSettingsLocked();

        mDirty <span class="hljs-subst">|=</span> DIRTY_BATTERY_STATE;

        <span class="hljs-comment">//更新全局的电源状态</span>
        updatePowerStateLocked();
    }</code>

2、对外接口(功能)

(1)、报告用户活动----userActivity

(2)、休眠模式---gotoSleep

3、WakeLock机制---休眠和唤醒

"/sys/android_power/acquire_partial_wake_lock" "/sys/android_power/release_wake_lock"

“/sys/power/wake_lock” “/sys/power/wake_unlock” 

    mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
            mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display");
            mDisplaySuspendBlocker.acquire();

上层的wakelock都是操作 updateSuspendBlockerLocked 里的mDisplaySuspendBlocker.acquire();和mDisplaySuspendBlocker.release();

DisplayPowerController:管理显示设备的power状态,主要功能是播放屏幕状态变化的动画,通过回调的方式和PowerManagerService交互

(Callbacks.onStateChange)PowerManagerService

猜你喜欢

转载自blog.csdn.net/lf12345678910/article/details/52911679
PMS
今日推荐