这二天要在项目工程中添加修改Android系统时间的功能,在网上找的资料,大概是是这样的:来自http://www.2cto.com/kf/201201/116830.html

在 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.

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

/* package */ static void setDate(int year, int month, int day) {
Calendar c = Calendar.getInstance();

c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, day);
long when = c.getTimeInMillis();

if (when / 1000 < Integer.MAX_VALUE) {
SystemClock.setCurrentTimeMillis(when);
}
}

/* package */ static void setTime(int hourOfDay, int minute) {
Calendar c = Calendar.getInstance();

c.set(Calendar.HOUR_OF_DAY, hourOfDay);
c.set(Calendar.MINUTE, minute);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
long when = c.getTimeInMillis();

if (when / 1000 < Integer.MAX_VALUE) {
SystemClock.setCurrentTimeMillis(when);
}
}

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

我也是这样写的,肯定没有问题,呵呵,如果操作有什么问题,请及时联系我!

OK,大功搞成了!

更多相关文章

  1. Android7.0 系统启动流程---system_server
  2. 升级Android SDK后ADT找不到adb.exe文件的解决办法
  3. android组件化方案、二维码扫码、Kotlin新闻客户端、动画特效等
  4. Android系统框架简单理解
  5. 自定义实现简单的Android颜色选择器(附带源码)
  6. android 文件系统分析
  7. 第一章:Android系统介绍android虚拟机
  8. Ubuntu 10.04 编译Android 2.1源码
  9. android下解析xml文件遇到中文问题

随机推荐

  1. Android各版本源码下载链接
  2. Android实现微信分享及注意事项
  3. Android的Task和Activity相关
  4. Android(安卓)App安装失败错误总结
  5. android中的dispatchTouchEvent、onInter
  6. Android(安卓)简单联系人操作
  7. Android(安卓)ormlite 框架介绍
  8. android 无线连接eclipse
  9. Android(安卓)Audio
  10. Android判断Intent是否存在,是否可用