前言
最近工作中碰到修改系统时间这个问题,现在解决了,顺便写篇博客记录一下。
正文
问题来源
我在代码中使用下面这段程序修改系统时间
Calendar c = Calendar.getInstance();
c.set(2010, 1, 1, 12, 00, 00);
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
am.setTime(c.getTimeInMillis());
在AndroidManifest.xml中加入了如下权限
<uses-permission android:name="android.permission.SET_TIME"/>
但是却被无情的报错了,后来查了很多资料,有了解决方案。
解决思路
将我们的应用伪装成系统的应用
实现步骤
共享系统UID
使用系统签名(匹配签名需要公钥和密钥两个文件生成keystore)
具体实现
1、修改AndroidManifest.xml
我们在AndroidManifest.xml文件的manifest节点中增加如下属性,来共享系统uid
android:sharedUserId="android.uid.system"
2、利用IDE生成apk文件
具体步骤我在这里就不多说明了,
3、利用签名工具生成系统签名apk
这里我用了一个工具来生成系统签名apk,下载这个签名工具文件,下载后解压这个工具的目录结构如下图:
我们将导出的apk放到上图所示的文件夹中
如下图:
然后我们打开cmd控制台,进入上图所示的目录中,按以下格式输入命令:
java -jar signapk.jar platform.x509.pem platform.pk8 input.apk output.apk
其中input.apk为要签名的apk文件, output.apk为签名后输出的apk文件,命令执行后在当前目录下会多一个apk,这个apk就是带有系统签名的一个apk。
4、安装apk
首先,我们先要卸载的手机上原来安装的apk文件,然后,在命令行中输入如下命令安装带有系统签名的apk文件。
adb install new.apk
前提是命令行当前目录是带有系统签名apk文件所在的目录,如果安装后提示”Success”就是安装成功了。
运行
运行测试成功,系统时间成功变成自己在代码中设置的时间。
以上就实现了Android利用系统权限实现手机重启的功能。