首页 > 其他分享 >Android R Settings关于屏保/PowerManagerService欺骗系统不让其进入休眠状态

Android R Settings关于屏保/PowerManagerService欺骗系统不让其进入休眠状态

时间:2024-08-05 11:17:16浏览次数:7  
标签:java Settings private public 屏保 sleep fake android Android

//屏保设置界面
./packages/apps/Settings/src/com/android/settings/dream/DreamSettings.java

//和PowerManagerService 建立联系
./frameworks/base/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java

//系统时钟屏保 继承了DreamService
./packages/apps/DeskClock/src/com/android/deskclock/Screensaver.java

./packages/apps/DeskClock/src/com/android/deskclock/ScreensaverActivity.java

public static final String SCREENSAVER_ENABLED = "screensaver_enabled";

adb shell settings get secure screensaver_enabled 
0 false(never)

如何替换activityt退出(finish)的动画

    private void textFinish() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //finish();
                finishAndRemoveTask();//使用这个
            }
        }, 0);
    }
    
    //复写finishAndRemoveTask
    @Override
    public void finishAndRemoveTask() {
        super.finishAndRemoveTask();
        overridePendingTransition(0, R.anim.dream_activity_close_exit);
    }

//R.anim.dream_activity_close_exit
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="1.0"
    android:toAlpha="0.0"
    android:duration="100" />

android 屏保 (PowerManager & DreamService)

android 系统休眠过程四个状态,分别是SCREEN_BRIGHT,SCREEN_DIM,SCREEN_DREAM,SLEEP

思路1:不让系统进入后面两个状态,保持在SCREEN_DREAM,然后发送广播,操作屏幕背光--->我把它叫做假休眠(fake_sleep_mode)
(或者保持在SCREEN_DREAM后,拉起一个服务,在界面上添加一个的window,window上面布局随意,点击之后移除)

+++ b/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
@@ -140,6 +140,8 @@ public final class PowerManagerService extends SystemService
     private static final int MSG_CHECK_FOR_LONG_WAKELOCKS = 4;
     // Message: Sent when an attentive timeout occurs to update the power state.
     private static final int MSG_ATTENTIVE_TIMEOUT = 5;
+    // Message: enter fake sleep mode
+    private static final int MSG_FAKE_SLEEP_MODE = 6;//add text

     // Dirty bit: mWakeLocks changed
     private static final int DIRTY_WAKE_LOCKS = 1 << 0;
@@ -1722,6 +1724,9 @@ public final class PowerManagerService extends SystemService
         }
     }

+    //fake sleep mode flag
+    private int fake_sleep_init = 0;//add text
+


private void updateUserActivitySummaryLocked(long now, int dirty) {
    ...
    if (Integer.MAX_VALUE == screenOffTimeout) {
                    mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
                    //Slog.d(TAG, "set mUserActivitySummary USER_ACTIVITY_SCREEN_BRIGHT never sleep " + nextTimeout);
                }

                if (mUserActivitySummary != 0 && nextTimeout >= 0) {
                    scheduleUserInactivityTimeout(nextTimeout);
                }
            } else {
                mUserActivitySummary = 0;
            }

            //add text
            if(mUserActivitySummary == 1 && fake_sleep_init > 0){
                fake_sleep_init = 0;
                Slog.d(TAG, "fake_sleep_init: reset");
            }
            //add text
    ...
}

    @SuppressWarnings("deprecation")
    private boolean goToSleepNoUpdateLocked(long eventTime, int reason, int flags, int uid) {
        if (DEBUG_SPEW) {
            Slog.d(TAG, "goToSleepNoUpdateLocked: eventTime=" + eventTime
                    + ", reason=" + reason + ", flags=" + flags + ", uid=" + uid);
        }

        //add text
        int fake_sleep_mode = SystemProperties.getInt("persist.sys.fake_sleep_enable", 0);
        if (fake_sleep_mode == 0) {
            if (fake_sleep_init == 0) {
                Message fake_msg = mHandler.obtainMessage(MSG_FAKE_SLEEP_MODE);
                fake_msg.setAsynchronous(true);
                mHandler.sendMessage(fake_msg);
                fake_sleep_init++;
            }
            return false;
        }
        //add text

        if (eventTime < mLastWakeTime
                || getWakefulnessLocked() == WAKEFULNESS_ASLEEP
                || getWakefulnessLocked() == WAKEFULNESS_DOZING
                || !mSystemReady
                || !mBootCompleted) {
            return false;
        }

        Trace.traceBegin(Trace.TRACE_TAG_POWER, "goToSleep");
        try {
            reason = Math.min(PowerManager.GO_TO_SLEEP_REASON_MAX,
                    Math.max(reason, PowerManager.GO_TO_SLEEP_REASON_MIN));
            Slog.i(TAG, "Going to sleep due to " + PowerManager.sleepReasonToString(reason)
                    + " (uid " + uid + ")...");

            mLastSleepTime = eventTime;
            mLastSleepReason = reason;
            mSandmanSummoned = true;
            mDozeStartInProgress = true;
            setWakefulnessLocked(WAKEFULNESS_DOZING, reason, eventTime);
            ...
}          

    private final class PowerManagerHandlerCallback implements Handler.Callback {
        @Override
        public boolean handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_USER_ACTIVITY_TIMEOUT:
                    handleUserActivityTimeout();
                break;
            ...             
                //add text
                case MSG_FAKE_SLEEP_MODE:
                    //发送广播去关闭背光
                    Slog.d(TAG, "Fake sleep mode , entering clock screen...");
                    Intent intent  = new Intent("sys.android.fake.sleep.action");
                    intent.setPackage("com.android.settings");
                    mContext.sendBroadcastAsUser(intent,UserHandle.ALL);
                    break;
                //add text
  

修改Android 休眠逻辑使系统关屏而不进入休眠

Android 系统全局监听touch事件,在背光关闭的情况下.

./frameworks/base/core/java/android/view/WindowManagerPolicyConstants.java

    // TODO: move this to a more appropriate place.
    interface PointerEventListener {
        /**
         * 1. onPointerEvent will be called on the service.UiThread.
         * 2. motionEvent will be recycled after onPointerEvent returns so if it is needed later a
         * copy() must be made and the copy must be recycled.
         **/
        void onPointerEvent(MotionEvent motionEvent);
    }
    
+++ b/frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -1149,7 +1149,7 @@ public class WindowManagerService extends IWindowManager.Stub
             String[] args, ShellCallback callback, ResultReceiver result) {
         new WindowManagerShellCommand(this).exec(this, in, out, err, args, callback, result);
     }
-
+    private static Context t_context;
     private WindowManagerService(Context context, InputManagerService inputManager,
             boolean showBootMsgs, boolean onlyCore, WindowManagerPolicy policy,
             ActivityTaskManagerService atm, Supplier<SurfaceControl.Transaction> transactionFactory,
@@ -1159,6 +1159,7 @@ public class WindowManagerService extends IWindowManager.Stub
         mGlobalLock = atm.getGlobalLock();
         mAtmService = atm;
         mContext = context;
+        t_context = context;
         mIsPc = mContext.getPackageManager().hasSystemFeature(FEATURE_PC);
         mAllowBootMessages = showBootMsgs;
         mOnlyCore = onlyCore;
@@ -6805,6 +6806,8 @@ public class WindowManagerService extends IWindowManager.Stub

     MousePositionTracker mMousePositionTracker = new MousePositionTracker();

+    private static int x_init = 0;

     private static class MousePositionTracker implements PointerEventListener {
         private boolean mLatestEventWasMouse;
         private float mLatestMouseX;
@@ -6825,6 +6827,13 @@ public class WindowManagerService extends IWindowManager.Stub
             } else {
                 synchronized (this) {
                     mLatestEventWasMouse = false;
+                    //add text
+                    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN && x_init == 0){
+                        android.util.Log.d("tag","motionEvent---ACTION_DOWN.");
+                        mContext.sendBroadcast(new Intent("sys.android.fake.sleep.awake.action"));//发送广播点亮背光
+                        x_init++;
+                    }
+                    //add text
                 }
             }
         }


./frameworks/base/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java:39:
class SystemGesturesPointerEventListener implements PointerEventListener {

./frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java:6808:   
 private static class MousePositionTracker implements PointerEventListener {
 
./frameworks/base/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java:37:
public class TaskTapPointerEventListener implements PointerEventListener {    

Android 系统全局监听

标签:java,Settings,private,public,屏保,sleep,fake,android,Android
From: https://www.cnblogs.com/kato-T/p/18342858

相关文章

  • android10.0(Q) MTK 6765 user版本打开root权限
    前言相比较Android8.1、9.0而言,Android10.0版本的root变得相当麻烦,10.0中引入了动态分区机制,同样的要想完全adbroot,需要fastboot解锁,然后关闭verity才能adbremount成功。我尝试和之前一样修改fstab.in.mt6765中的ro和rw初始值,容易导致无法正常开机,在......
  • Android中毛玻璃效果的两种实现
    Android中毛玻璃效果主要有两种实现方式。1.使用JAVA算法FastBlur实现方法1先将图片缩小,然后放大图片,再设置为控件背景以达到更模糊的效果,同时也提升模糊算法的处理效率。2.使用Android自带类RenderScript实现方法2模糊半径只能设置1-25。对比下来同样的模糊半径,方法1的模......
  • Android activity主题设置
    主题配置<stylename="MainThemeCamera"parent="Theme.AppCompat.DayNight.NoActionBar"><itemname="android:windowBackground">@color/black</item><itemname="android:windowTranslucentStatu......
  • Android mvvm使用流程
    Androidmvvm使用流程一.几种常见架构模式对比1.MVC(Model-View-Controller)MVC模式的优点在于模块化、可扩展性和可维护性,但缺点是控制器和视图之间的耦合度较高。2.MVP(Model-View-Presenter)模式Presenter同时持有Model和View对象,缺点是V层与P层还是有一定的耦合度3.MVVM(Model-View......
  • 自定义导航栏兼容ios和android
    <template>  <view class="content">    <!--距离顶部的距离刚好留出状态栏即可即statusBarHeight-->    <view class="topNav" :style="{height:navHeight+'px',paddingTop:statusBarHeight+'px'}">      <......
  • Android ImageProxy 到 byteArray 并通过套接字发送
    我正在尝试将ImageProxy转换为byteArray,以通过套接字将其发送到python服务器。我正在使用Camerax,这是我的图像分析:mageAnalysisimageAnalysis=newImageAnalysis.Builder().setTargetResolution(newSize(720,640))......
  • 【转载】在Android中使用Rust:Rust与Android的结合
    声明:处于学习目的转载本文,若文章侵犯原作者权益,联系本人立即删除,联系方式:[email protected]文章转载于:https://developer.baidu.com/article/detail.html?id=3011246 简介:本文将介绍如何在Android平台上使用Rust编程语言,以及Rust与Android的结合所带来的优势和挑战。我们将探......
  • Android Studio开发学习(七、蓝牙模块java)
    引言    上篇我们已经介绍了蓝牙模块相关布局,所以,今天我们来学习一下功能实现,如何打开关闭蓝牙。(这里DataActivity为蓝牙列表点击设备名连接后跳转界面函数,这里暂时没有设置,只是默认空白界面)先来介绍一下蓝牙相关概念        蓝牙是一种无线技术标准,用于短......
  • Android最全8万字Fragment面试题及参考答案(持续更新)
    目录什么是Fragment?Fragment和Activity之间的关系是什么?为什么要使用Fragment而不是直接使用多个Activity?Fragment是如何被添加到Activity中的?如何从Activity中移除一个Fragment?Fragment可以嵌套吗?如何实现?如何获取当前Activity中的Fragment?如何通过FragmentManager......
  • Android开发 - Fragment 类详解
    Fragment是什么Fragment是Android开发中的一种模块化组件,一个抽象类,允许开发者将一个Activity分解成多个独立的、可重用的部分。每个Fragment都有自己的生命周期和用户界面,可以独立管理自己的UI和行为,它们可以动态地添加、移除或替换,从而提高应用程序的灵活性和可维护......