使用广播实现的Android关机及重启

通过在AndroidManifest.xml设置android:sharedUserId='android.uid.system',可以使应用获得修改系统时间的权限,进而实现关机和重启功能。但应用需用系统平台密钥platform.pk8和platform.x509.pem签名,限制了该程序只能在原始或自编译的Android系统上运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近研究App拥有root权限,弄了好久关机重启都没有成功,特别郁闷。就换另外一种更简单的方式,一试就成功了。

步骤一:编写Java代码
java部分代码:

                                                 case  R.id. broadcast_reboot :     //重启
                                                                Log.v( "Reboot" ,  "Reboot-->broadcast_reboot" );
                                                                Intent i =  new  Intent(Intent. ACTION_REBOOT );
                                                                i.putExtra( "nowait" , 1);
                                                                i.putExtra( "interval" , 1);
                                                                i.putExtra( "window" , 0);
                                                                sendBroadcast(i);                

                                                                 break ;
                                                                
                                                 case  R.id. broadcast_shutdown :     //关机
                                                                Log.v( "Reboot" ,  "Reboot-->broadcast_shutdown" );
                                                                Intent intent =  new  Intent(Intent.ACTION_REQUEST_SHUTDOWN);
                                                                  intent.putExtra(Intent.EXTRA_KEY_CONFIRM,  false );
                                                                  intent.setFlags(Intent. FLAG_ACTIVITY_NEW_TASK );
                                                                  startActivity(intent);

                                                                 break ;

注:关机可以设置时间设置【定时关机】功能,关机中的Intent.ACTION_REQUEST_SHUTDOWN 及 Intent.EXTRA_KEY_CONFIRM 在IDE中报错,但可以忽略,因为这两个属性不对上层开放,APP在源码中编译就可以直接使用。

步骤二:修改Manifest.xml中属性

< manifest xmlns:android = "http://schemas.android.com/apk/res/android"
  ……
   
android:sharedUserId = "android.uid.system"
……
>
    
< uses-permission android:name = "android.permission.SHUTDOWN" />
……
</ manifest >

注:
android:sharedUserId="android.uid.system"  将app提升到系统权限,需要到源码中编译,还有关机权限: android.permission.SHUTDOWN

步骤三:编译APK
将项目拷贝到Android源码中进行编译,我拷贝到【 gingerbread/development/apps/】下,并将项目的bin文件夹给删除,同时最重要的一步在项目下编写mk文件,山寨其它项目的mk文件写如下,不要漏掉 LOCAL_CERTIFICATE := platform

Android.mk:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_PACKAGE_NAME := 你的项目名
LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE) 


步骤四:
通过mm编译生成的apk安装到机器中,就可以操作重启及关机

注:使用相同的方法可以修改系统时间,重点是将应用提升到拥有系统权限,但进过此操作并未获得root权限。

补充:后来使用init.rc启动系统服务的方法也是可行的,之前是因为编写关机 和 重启的sh文件使用了中文符号,使得sh命令有问题



PS:想了解进一步定制开机重启功能请点此为Android系统定制重启功能


进一步测试:
通过编译后到apk不能安装,主要是因为系统权限的问题。(Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]),需用在相同源码固件的系统才能使用系统签名的应用。

首先AndroidManifest.xml中加入android:sharedUserId="android.uid.system"这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就有权限来修改系统时间了。 

只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。  这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到 platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android 中的key来签名,程序在模拟器上运行OK

见链接:http://bbs.gfan.com/android-85440-1-1.html
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值