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 逆向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 源码分析 )(代码片段