Android 重启与关机的实现源码分析

Posted 王睿丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 重启与关机的实现源码分析相关的知识,希望对你有一定的参考价值。

1、代码实现

🔺说明:
应用层:

 android:sharedUserId="android.uid.system"	除了声明系统权限,还需要系统签名APK
<uses-permission android:name="android.permission.REBOOT"/> 申请重启权限

框架层:因为PowerManagerl类的reboot()、shutdown不对外公开,所以我们在Android Framework层进行实现!

通过JNI技术让上层代码底层代码产生联系,就可以实现重启与关机!

1.1、重启

public static void doreboot(Context context) {
   IPowerManager mPowerManager = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));
   try{
        mPowerManager.reboot(false, null, true);
        Log.d("TAG","重启成功");
   }catch (Exception e){
        Log.d("TAG","重启失败");
        e.printStackTrace();
   }
}

1.2、关机

public static void doshutdown(Context context) {
   IPowerManager mPowerManager = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));
   try{
        mPowerManager.shutdown(false, null, false);
        Log.d("TAG","关机成功");
   }catch (Exception e){
        Log.d("TAG","关机失败");
        e.printStackTrace();
   }
}

2、源码分析

2.1、重启

2.1.1、源码

   /**
     * Reboot the device.  Will not return if the reboot is successful.
     * <p>
     * Requires the {@link android.Manifest.permission#REBOOT} permission.
     * </p>
     *
     * @param reason code to pass to the kernel (e.g., "recovery") to
     *               request special boot modes, or null.
     * @throws UnsupportedOperationException if userspace reboot was requested on a device that
     *                                       doesn't support it.
     */
    @RequiresPermission(permission.REBOOT)
    public void reboot(@Nullable String reason) {
        if (REBOOT_USERSPACE.equals(reason) && !isc()) {
            throw new UnsupportedOperationException(
                    "Attempted userspace reboot on a device that doesn't support it");
        }
        try {
            mService.reboot(false, reason, true);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

在这里插入图片描述
对于mService.reboot(false,reason,true); 这里面参数的意思,我们可以进入IPowerManager.aidl 代码中去看,如下图:

在这里插入图片描述
从单词中就能明白:

参数含义
confirm是否需要确认
reason描述原因
wait是否需要等待

2.1.2、文档

官方文档地址
在这里插入图片描述

其他的基本跟我们之前的描述一样,这里我重点要说的是框起来的区域,意思是:
如果原因字符串包含“,quiescent”,则屏幕在重新启动期间保持关闭并且不会再次打开,直到用户触发设备唤醒(例如,通过按下电源键)。 此行为适用于在 Android 11(API 级别 30)或更高版本上启动的 Android TV 设备。

2.2、关机

2.2.1、源码

    /**
     * Turn off the device.
     *
     * @param confirm If true, shows a shutdown confirmation dialog.
     * @param reason code to pass to android_reboot() (e.g. "userrequested"), or null.
     * @param wait If true, this call waits for the shutdown to complete and does not return.
     *
     * @hide
     */
    public void shutdown(boolean confirm, String reason, boolean wait) {
        try {
            mService.shutdown(confirm, reason, wait);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

在这里插入图片描述

以上是关于Android 重启与关机的实现源码分析的主要内容,如果未能解决你的问题,请参考以下文章

Android 12 关机重启流程

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段

Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段