android 背光控制,Android P背光策略分析(一)

本文深入探讨Android 9.0系统中背光控制的处理,包括初始化、手动及自动背光调节。从DisplayManagerService的启动开始,详细阐述了背光服务的创建、初始化流程,以及PowerManagerService如何参与背光控制,最终通过DisplayPowerController进行实际的背光调整。
摘要由CSDN通过智能技术生成

本文主要讲述android 9.0系统对背光的处理,文章分为三点讲述:

1.背光的初始化

2.手动背光调节

3.自动背光调节

一.初始化

1.1 服务的启动(DisplayManagerService)

SystemServer是Android进入Launcher前的最后准备。由其名称就可以看出,它提供了众多由JAVA语言编写的“系统服务”。

一旦我们在init.rc中为Zygote指定了启动参数--start-system-server,那么Zygote Init就会调用startSystemServer来进入SystemServer。

/**

* The main entry point from zygote.

*/

public static void main(String[] args) {

new SystemServer().run();

}

private void run() {

try {

......

// Initialize the system context.

createSystemContext();

// Create the system service manager.

mSystemServiceManager = new SystemServiceManager(mSystemContext);

mSystemServiceManager.setStartInfo(mRuntimeRestart,

mRuntimeStartElapsedTime, mRuntimeStartUptime);

LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);

// Prepare the thread pool for init tasks that can be parallelized

//SystemServerInitThreadPool.get();

} finally {

traceEnd(); // InitBeforeStartServices

}

// Start services.

try {

traceBeginAndSlog("StartServices");

startBootstrapServices();

startCoreServices();

startOtherServices();

SystemServerInitThreadPool.shutdown();

} catch (Throwable ex) {

Slog.e("System", "******************************************");

Slog.e("System", "************ Failure starting system services", ex);

throw ex;

} finally {

traceEnd();

}

.......

// Loop forever.

Looper.loop();

throw new RuntimeException("Main thread loop unexpectedly exited");

}

大部分的服务的起点都在systemserver,背光的服务也不例外。首先创建SystemServiceManager,并将该对象放入一个静态类LocalServices中,这样在systemserver进程中可以直接调用各种静态类中的服务了。然后会调用startBootstrapServices方法,在startBootstrapServices()中启动DisplayManagerService。

private void startBootstrapServices() {

......

// Power manager needs to be started early because other services need it.

// Native daemons may be watching for it to be registered so it must be ready

// to handle incoming binder calls immediately (including being able to verify

// the permissions for those calls).

traceBeginAndSlog("StartPowerManager");

mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);

traceEnd();

......

// Display manager is needed to provide display metrics before package manager

// starts up.

traceBeginAndSlog("StartDisplayManager");

mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);

traceEnd();

......

}

进入SystemServiceManager的startService

public void startService(@NonNull final SystemService service) {

// Register it.

mServices.add(service);

// Start it.

long time = SystemClock.elapsedRealtime();

try {

service.onStart();

} catch (RuntimeException ex) {

throw new RuntimeException("Failed to start service " + service.getClass().getName()

+ ": onStart threw an exception", ex);

}

warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");

}

进入DisplayManagerService的构造方法中,可以看出只是构造一个包含handler的环境

public DisplayManagerService(Context context) {

this(context, new Injector());

}

@VisibleForTesting

DisplayManagerService(Context context, Injector injector) {

super(context);

mInjector = injector;

mContext = context;

mHandler = new DisplayManagerHandler(DisplayThread.get().getLooper());

mUiHandler = UiThread.getHandler();

mDisplayAdapterListener = new DisplayAdapterListener();

mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false);

Resources resources = mContext.getResources();

mDefaultDisplayDefaultColorMode = mContext.getResources().getInteger(

com.android.internal.R.integer.config_defaultDisplayDefaultColorMode);

float[] lux = getFloatArray(resources.obtainTypedArray(

com.android.internal.R.array.config_minimumBrightnessCurveLux));

float[] nits = getFloatArray(resources.obtainTypedArray(

com.android.internal.R.array.config_minimumBrightnessCurveNits));

mMinimumBrightnessCurve = new Curve(lux, nits);

mMinimumBrightnessSpline = Spline.createSpline(lux, nits);

PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);

mGlobalDisplayBrightness = pm.getDefaultScreenBrightnessSetting();

mCurrentUserId = UserHandle.USER_SYSTEM;

}

将该服务添加到SystemServiceManager的内部列表中后,就会服务的onStart方法:

public void onSta

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值