Android framework 问题记录

发布于:2025-05-22 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、休眠唤醒,很快熄屏

1.1 问题描述

机器休眠唤醒后,没有按照约定的熄屏timeout 进行熄屏,很快就熄屏(约2s~3s左右)

1.2 原因分析:

抓取相关log,打印休眠背光 相关调用栈

//具体打印调用栈直接从网上找即可,这里checkout了,就随便贴一个
//在frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java的isBeingKeptAwakeLocked 函数里 加入如下
Log.e("TAG", Log.getStackTraceString(new Exception("Stack trace")));

根据打印调用栈 对比正常情况,可以得知多出如下打印

java.lang.Throwable
  at com.android.server.power.PowerManagerService.isBeingKeptAwakeLocked(PowerManagerService.java:2909)
  at com.android.server.power.PowerManagerService.isItBedTimeYetLocked(PowerManagerService.java:2887)
  at com.android.server.power.PowerManagerService.updateWakefulnessLocked(PowerManagerService.java:2843)
  at com.android.server.power.PowerManagerService.updatePowerStateLocked(PowerManagerService.java:2152)
  at com.android.server.power.PowerManagerService.userActivityInternal(PowerManagerService.java:1698)
  at com.android.server.power.PowerManagerService.onFlip(PowerManagerService.java:1086)
  at com.android.server.power.PowerManagerService.$r8$lambda$q7dp6tNnllSjuO6t2c5KypV49H8(Unknown Source:0)
  at com.android.server.power.PowerManagerService$$ExternalSyntheticLambda1.accept(Unknown Source:8)
  at com.android.server.power.FaceDownDetector.faceDownDetected(FaceDownDetector.java:297)
  at com.android.server.power.FaceDownDetector.onSensorChanged(FaceDownDetector.java:284)
  at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:886)
  at android.os.MessageQueue.nativePollOnce(Native Method)
  at android.os.MessageQueue.next(MessageQueue.java:335)
  at android.os.Looper.loopOnce(Looper.java:161)
  at android.os.Looper.loop(Looper.java:288)
  at com.android.server.SystemServer.run(SystemServer.java:922)
  at com.android.server.SystemServer.main(SystemServer.java:618)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:568)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1023)

排查onSensorChanged中的faceDownDetected

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) return;
        if (!mActive || !mIsEnabled) return;

        final float x = event.values[0];
        final float y = event.values[1];
        mCurrentXYAcceleration.updateMovingAverage(x * x + y * y);
        mCurrentZAcceleration.updateMovingAverage(event.values[2]);

        // Detect movement
        // If the x, y acceleration is within the acc threshold for at least a length of time longer
        // than the time threshold, we set moving to true.
        final long curTime = event.timestamp;
        if (Math.abs(mCurrentXYAcceleration.mMovingAverage - mPrevAcceleration)
                > mAccelerationThreshold) {
            mPrevAcceleration = mCurrentXYAcceleration.mMovingAverage;
            mPrevAccelerationTime = curTime;
        }
        final boolean moving = curTime - mPrevAccelerationTime <= mTimeThreshold.toNanos();

        // If the z acceleration is beyond the gravity/z-acceleration threshold for at least a
        // length of time longer than the time threshold, we set isFaceDownForPeriod to true.
        final float zAccelerationThreshold =
                mFaceDown ? mZAccelerationThresholdLenient : mZAccelerationThreshold;
        final boolean isCurrentlyFaceDown =
                mCurrentZAcceleration.mMovingAverage < zAccelerationThreshold;
        final boolean isFaceDownForPeriod = isCurrentlyFaceDown
                && mZAccelerationIsFaceDown
                && curTime - mZAccelerationFaceDownTime > mTimeThreshold.toNanos();
        if (isCurrentlyFaceDown && !mZAccelerationIsFaceDown) {
            mZAccelerationFaceDownTime = curTime;
            mZAccelerationIsFaceDown = true;
        } else if (!isCurrentlyFaceDown) {
            mZAccelerationIsFaceDown = false;
        }


        if (!moving && isFaceDownForPeriod && !mFaceDown) {
        	//已知是这个导致的,把这个func注释后,现象就消失了.
        	//关注原因,是因为G-sensor导致的,关注到调试时,板子并非按整机方式进行放置,x、y会出现问题,
        	//最终导致执行了faceDownDetected,因而导致了亮屏后快速熄屏。
            faceDownDetected();
        } else if (!isFaceDownForPeriod && mFaceDown) {
            unFlipDetected();
        }
    }

1.3 解决方案:

如1.2中所述,如果G-sensor 方向不正确,有可能会导致该问题,建议调整/校准g-sensor,而不是修改framework中的代码。