在 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",这样也是保护了系统的安全。

最最后还说下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。

转载于:https://blog.51cto.com/gswxr/719033

转:Android中如何修改系统时间(应用程序获得系统权限)相关推荐

  1. android 一天多少毫秒,Android中的日期和时间以毫秒为单位

    我试图将给定的日期和时间转换为毫秒.我无法实现它.Android中的日期和时间以毫秒为单位 下面是日期和时间格式 02 - 07(DD - MM) 上午八时五十分00秒(HH毫米SS一) 这是我曾尝试 ...

  2. 获取系统时间出错oracle-,oracle 获取系统时间(转)

    Oracle中如何获取系统当前时间 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; ORACLE里获取一个时间的年.季.月.周.日 ...

  3. android获取运行应用程序,Android中获取正在运行的应用程序

    Android中获取正在运行的应用程序 ActivityMain.java 1.public class ActivityMain extends ListActivity { 2. @Overrid ...

  4. linux硬件时间与系统时间不同步,Linux系统时钟和硬件时钟不一致

    在做DB2 集群复制的时候要求两台主机想时间一致. 但是在一台主机上系统时间和硬件时间相差12个小时左右:手动同步后,重启后又相差12个小时左右. 为什么会是这样的,先介绍下系统时钟和硬件时钟的区别: ...

  5. linux编写多时区时间显示程序,Linux系统时区时间修改

    我们知道,计算机系统有两个时钟,一个是硬件时钟,一个是系统时钟,硬件时钟的工作原理就是电脑在开机运行的时候会给主板上的纽扣电池充电,关机后这块电池还为存放系统参数的CMOS.RAM供电,以保存其中的系 ...

  6. c语言修改windows系统时间,c语言实现系统时间校正工具代码分享

    //******************************************************************* //Time Protocol是一种非常简单的应用层协议.它 ...

  7. Android中获取系统语言(适用于Android7.0以上系统)

    2019独角兽企业重金招聘Python工程师标准>>> public static String getSysLang(Context context) {Locale locale ...

  8. centos7 校正linux系统时间_基于centos7系统部署NTP服务及配置时间定时同步

    概述 linux服务器在提供服务时,要和其他机器进行请求的交互,实际生产环境中,可能因为时间不同步,导致了服务异常. 下面介绍下怎么部署NTP服务来解决这个问题. ps:强烈吐槽下头条这个新排版功能, ...

  9. sap获取系统时间_C++获取当前系统时间的方法总结

    C++并发编程(C++11到C++17) 为什么要并发编程 大型的软件项目常常包含非常多的任务需要处理.例如:对于大量数据的数据流处理,或者是包含复杂GUI界面的应用程序.如果将所有的任务都以串行的方 ...

最新文章

  1. 转 前端工程师凭什么这么值钱?
  2. 无限城市助力智慧城市 挥毫创新3.0时代
  3. 秒拨动态ip切换技术python_Python爬虫如何通过更换IP避开网站的反爬虫机制(一)...
  4. 讲讲JavaScript的闭包
  5. PLSQL Developer中数值字段由科学计数法改为普通数值显示
  6. 软件工程实践小队Scrum Meeting
  7. 2018深圳云栖拉开帷幕,飞天技术汇五大专场邀你参加~
  8. grep sed awk三剑客详解
  9. sqlite3存储与读写
  10. 接收不到其他机器发来的报文_TCP/IP报文格式,康康就知道了
  11. .Net之美读书笔记15
  12. window下的git工具msysgit的使用
  13. CATIA模型导入3dsMax形成三层关系的问题
  14. 原生JS实现视频播放功能
  15. 北航MOOC系统Android客户端NABC
  16. Normalize.css 支持 HTML5 的CSS Reset
  17. serv-u 用户使用sftp登录 时间显示不对_宜家中国电商化之路步履蹒跚 或因忽视消费者的使用习惯...
  18. exe文件图标变成html,遭遇了一次exe文件图标丢失的问题
  19. 【python】批量压缩文件夹
  20. Java学习---day07_继承及final、Object的介绍

热门文章

  1. 《ASP.NET 1.1入门经典—— VISUAL C# .NET 2003编程篇》学习笔记和心得 - 第十章
  2. ob服务器维修视频,教你如何使用OB系统 还在看转播?你OUT了!
  3. MySQL高级 - 锁 - MyISAM表锁 - 小结
  4. MySQL高级or索引失效情况
  5. Nacos-快速入门
  6. 简单了解各种序列化技术-JSON序列化框架
  7. AQS.accquire
  8. 反射(类的加载概述和加载时机)
  9. 字符输入流读取字符数据
  10. 同步代码块解决线程安全