[转载]如何使Android应用程序获取系统权限来修改系统时间

在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在logcat中总会得到"Unable to open alarm driver: Permission denied ".这个函数需要root权限或者运行与系统进程中才可以用。

本来以为就没有办法在应用程序这一层改系统时间了,后来在网上搜了好久,知道这个目的还是可以达到的。

第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:

1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。

2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行

3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。

第二个方法麻烦点,不过不用开虚拟机跑到源码环境下用make来编译:

1. 同上,加入android:sharedUserId="android.uid.system"这个属性。

2. 使用eclipse编译出apk文件,但是这个apk文件是不能用的。

3. 用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。

4. 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在我的Android源码目录中的位置是"build/target/product/security",下面的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build/tools/signapk"下,用法为"signapk platform.x509.pem platform.pk8 input.apk output.apk",文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。

这样最后得到的apk和第一个方法是一样的。

最后解释一下原理,首先加入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,不过放到G3上安装直接提示"Package ... has no signatures that match those in shared user android.uid.system",这样也是保护了系统的安全。

我采用的是第二种方法,第一种方案说的不清不楚,真的难以让人理解,第二种方案也没有说清楚,自己试了好多次才成功,现在把具体的实施步骤分享给大家:

注意:第四步以后的工作要在源码的环境下操作,我的环境是Ubuntu + 源码,这个源码所编译的镜像应该是你目标所用的镜像。

1、首先在manifest文件加入android:sharedUserId="android.uid.system"这个属性。

2. 使用eclipse编译出XXX.apk文件,但是这个apk文件是不能用的。

3. 用压缩软件打开XXX.apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件,win32系统用WinRAR就可以了。

4、使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在我的Android源码目录中的位置是"build/target/product/security",下面的platform.pk8和platform.x509.pem两个文件,可以把这二个文件拷贝到tmp目录下,把第三步删除文件以后的apk包也拷贝到这个目录下。

5、编译出signapk.jar文件,signapk的源码在android源码目录的/build/tools/signapk下,首先CD到改目录下,然后通过Javac signapk.java命令编译该原文件,得到SignApk$SignatureOutputStream.class和Signapk.class文件,然后手动创建k/com/android/signapk,注意,这个目录必须是在源码build/tools/signapk下的目录,pwd显示的目录应该是/build/tools/signapkk/com/android/signapk,然后将二个class文件放到该目录下,然后在/build/tools/signapk目录下执行jar cvfm signapk.jar SignaApk.mf -C k/ .这样在该目录下就可以生成signapk.jar文件了,得到Android提供的签名程序,拥有系统的权限。(如果有异常就说明你操作有问题,是不对的)

6、把生成的signapk.jar文件拷贝到源码的tmp目录下,然后用命令:java -jar signapk.jar platform.x509.pem  platform.pk8  XXX.apk  XXX_New.apk,如果没有异常就说明新生成的XXX_New.apk已经被签名了。

7、把生成的apk装载到目标机就可以运行了,如adb install  XXX_New.apk.

再来看看修改系统时间的方法吧!源码中是这样的:

 1 static void setDate(int year, int month, int day) {
 2         Calendar c = Calendar.getInstance();
 3
 4 c.set(Calendar.YEAR, year);
 5         c.set(Calendar.MONTH, month);
 6         c.set(Calendar.DAY_OF_MONTH, day);
 7         long when = c.getTimeInMillis();
 8
 9 if (when / 1000 < Integer.MAX_VALUE) {
10             SystemClock.setCurrentTimeMillis(when);
11         }
12     }
13
14 static void setTime(int hourOfDay, int minute) {
15         Calendar c = Calendar.getInstance();
16
17 c.set(Calendar.HOUR_OF_DAY, hourOfDay);
18         c.set(Calendar.MINUTE, minute);
19         c.set(Calendar.SECOND, 0);
20         c.set(Calendar.MILLISECOND, 0);
21         long when = c.getTimeInMillis();
22
23 if (when / 1000 < Integer.MAX_VALUE) {
24             SystemClock.setCurrentTimeMillis(when);
25         }
26     }

附上源码下载地址:http://download.csdn.net/detail/weijing331/4530873

[转载]如何使Android应用程序获取系统权限来修改系统时间

时间: 2024-12-27 17:45:25

[转载]如何使Android应用程序获取系统权限来修改系统时间的相关文章

使用WakeLock使Android应用程序保持后台唤醒

使用WakeLock使Android应用程序保持后台唤醒 - Ryan's zone - 博客频道 - CSDN.NET 在使用一些产品列如微信.QQ之类的,如果有新消息来时,手机屏幕即使在锁屏状态下也会亮起并提示声音,这时用户就知道有新消息来临了.但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,Android系统中CPU会保持在一个相对较低的功耗状态.针对前面的例子,收到新消息必定有网络请求,而网络请求是消耗CPU的操作,那么如

如何让应用程序获取system权限、root权限

获取system权限 上一篇随笔简单介绍了下Android权限的一些规则,我们发现很多事如果没有system权限基本上无法完成,那么如何让自己的应用获取system权限呢? 一般情况下,设定apk的权限,可在AndroidManifest.xml中添加android:sharedUserId="android.uid.xxx> 例如: 给apk添加system权限 1 <manifest xmlns:android="http://schemas.android.com/a

golang windows程序获取管理员权限(UAC )

在windows上执行有关系统设置命令的时候需要管理员权限才能操作,比如修改网卡的禁用.启用状态.双击执行是不能正确执行命令的,只有右键以管理员身份运行才能成功.为解决此问题,花了很长时间找了各种方法,最终找到一个简单的方法,双击也能执行成功了.过程如下:1> Go get github.com/akavel/rsrc2> 把nac.manifest 文件拷贝到当前windows项目根目录3> rsrc -manifest nac.manifest -o nac.syso4> go

Android 应用轻松获取Root权限

原文出处: http://blog.csdn.net/steelychen/article/details/40744305 亲,还在为自己编写的应用如何获取Root权限而苦恼吗,还在为网上提供千千万万(有点夸张)的解决办案而不能解决你的问题而苦恼吗.福音来啦,花一分钟看完这篇文章你会觉得原来只需一个jar包即可以实现. 当然这得在你的设备已经Root了的情况下使用. jar包导入工程 1. 在Eclipse中左右你的项目选择Build Path -> config build path 2.

Android开发程序获取GPS信息步骤

1.获取LOCATION_SERVICE系统服务.2.创建Criteria对象,调用该对象的set方法设置查询条件.3.调用LocationManager.getBestProvider(Criteria criteria,Boolean enabledOnly)方法,传入创建好的Criteria对象,获取最能满足给定标准(Criteria对象)的提供者名称.4.调用LocationManager.getLastKnowLocation(),传入提供者名称,获取最后已知位置信息.5.调用Loca

两种方法检查Android是否已获取root权限

现在Android手机root权限可以说是轻松就获取得到的,而关于判断手机是否已经root的方法,你了解吗?如果app有一些特殊功能需要root权限,则需要判断是否root.不知道root是不是意味着手机不安全?说到底还是想一台究竟,你可以学习Android应用开发视频教程.下面介绍两种方法: 方法1: /*** @author Kevin Kowalewski**/public class Root { private static String LOG_TAG = Root.class.ge

android 6.0获取 WRITE_SETTINGS 权限

android 6.0上只写在AndroidManifest中是不行的,还必须手动打开才行 private void setBrightnessMode(Context context, int mode) { try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Settings.System.canWrite(context)) { Settings.System.putInt(context.getContentRe

Android手机在获取root权限下的抓包过程

1. 电脑连接手机,进入adb模式:adb shell 2. 获取手机root权限:su 3. 下载tcpdump; 4. 将tcpdump放到手机/data/local/目录下:adb push c:\tcpdump /data/local/tcpdump 5. 赋予/data/local/tcpdump对应权限:chmod 6755 /data/local/tcpdump 6. 进入路径:cd /data/local 7. 开始抓包:/data/local/tcpdump -i any -p

python小程序获取诸多域名的过期时间

#!/usr/bin/env python #-*- coding:utf-8 -*- __author__ = 'jony' import urllib2 import time from bs4 import BeautifulSoup import sys reload(sys) sys.setdefaultencoding('utf8') def getexpiredate(domain):     url = "http://tool.chinaz.com/DomainDel/?wd=