Android 校正系统时间的三种解决方案

简介: Android 校正系统时间的三种解决方案

前言


在开发过程中我们常常需要获取系统时间。

Android系统的自动确认时间,是由系统通过访问厂家的NTP服务器的时间,然后修改后得到的。

所以当没有网络或者在内网环境下的时候,系统无法访问到NTP服务器,便会造成系统时间错误。

所以这个时候我们就需要程序去修改系统的时间,或者获取一个正确的时间来代替系统时间。


NTP服务器


【Network Time Protocol(NTP)】是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。时间按NTP服务器的等级传播。按照离外部UTC源的远近把所有服务器归入不同的Stratum(层)中。


解决方案


根据不同的情况,我实现了如下三种解决方案:

  1. 修改系统时间。
    优点:程序启动时执行一次即可,一劳永逸。
    缺点:只能在原生系统中使用,非原生系统无法安装。(具体后面会解释)。
  2. 获取NTP服务器时间代替系统时间。
    优点:无需Root,适用于任何手机及系统。
    缺点:需要可以访问外部网络,内网环境下则需要一台自己的NTP服务器。
  3. 获取网页时间代替系统时间。
    优点:无需Root,适用于任何手机及系统,适用于任何网络环境。
    缺点:需要一条额外的线程,去维护时间准确,容易造成误差。


代码及目录

GitHub: https://github.com/Demo-DeMon/ChangeTime



20180830192049885.png


1.修改系统时间

1.配置系统JDK环境变量

这个就不细说了,自行百度。

由于签名工具用到的sun.misc.BASE64Encoder类已从Java SE 9中删除。所以只能在Java 1.8及以下环境下使用。

具体可以查看:JDK从1.8升级到9.0.1后sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用


2.修改系统时间,一行代码如下:

SystemClock.setCurrentTimeMillis(long millis);

3.修改AndroidManifest.xml

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

添加该属性后,由于权限冲突,程序无法直接安装,必须重新签名。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.demon.setsystemtime"
    android:sharedUserId="android.uid.system"  >
</manifest>


4.编译apk,重新签名


Android Studio编译生成apk,然后将apk复制到上述目录的sign文件夹(重新签名的文件夹)下,将apk的名字与bat脚本中的一致。

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


双击运行bat脚本,脚本代码如下:

@echo off
java -jar signapk.jar platform.x509.pem platform.pk8 demo.apk test.apk
pause


signapk.jar: Android提供的签名工具。  

platform.x509.pem&platform.pk8: Android源码目录中”build/target/product/security”,下面的两个文件。  

demo.apk:程序编译生成的apk。  

test.apk:重新签名后的apk。


这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。


安装重新签名的apk,运行即可修改系统时间。


二、获取NTP服务器时间代替系统时间


直接使用truetime-android框架即可同步NTP服务器时间,调取框架内的方法便可以实时获取最新时间。

GitHub:https://github.com/instacart/truetime-android

具体的使用可以参考代码,或者GitHub文档。

### 阿里云提供了7个NTP服务器
ntp1.aliyun.com
ntp2.aliyun.com
ntp3.aliyun.com
ntp4.aliyun.com
ntp5.aliyun.com
ntp6.aliyun.com
ntp7.aliyun.com
### 中国科学技术大学NTP服务器
time.ustc.edu.cn


三、获取网页时间代替系统时间


根据下列代码,我们就可以获取任何一个网址的时间(内网服务器地址)。

拿到这个时间后,可以开启一个线程,做定时任务,不断更新该时间,以到达时间时间同步的效果。

具体实现方法不再阐述。

/**
     * 网址访问
     * @param url  网址
     * @return urlDate 对象网址时间
     */
    public static String VisitURL(String url){
        String urlDate = null;
        try {
            URL url1 = new URL(url);
            URLConnection  conn = url1.openConnection();  //生成连接对象
            conn.connect();  //连接对象网页
            Date date = new Date(conn.getDate());  //获取对象网址时间
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  //设置日期格式
            urlDate = df.format(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return urlDate;
    }

效果


20180830192237754.png


参考

http://www.programgo.com/article/54422482620/

文章来源

https://blog.csdn.net/DeMonliuhui/article/details/82226601/

目录
相关文章
|
8月前
|
XML Android开发 数据格式
android点击FrameLayout、LinearLayout等父布局没响应的原因以及解决方案
android点击FrameLayout、LinearLayout等父布局没响应的原因以及解决方案
196 2
|
8月前
|
安全 Shell Android开发
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
461 0
|
2月前
|
开发框架 前端开发 Android开发
探索安卓和iOS应用开发中的跨平台解决方案
【10月更文挑战第42天】在移动应用开发的广阔天地中,安卓和iOS系统如同两座巍峨的山峰,分别占据着半壁江山。开发者们在这两座山峰之间穿梭,努力寻找一种既能节省资源又能提高效率的跨平台开发方案。本文将带你走进跨平台开发的世界,探讨各种解决方案的优势与局限,并分享一些实用的代码示例,助你在应用开发的道路上更加游刃有余。
|
2月前
|
安全 搜索推荐 程序员
深入探索Android系统的碎片化问题及其解决方案
在移动操作系统的世界中,Android以其开放性和灵活性赢得了广泛的市场份额。然而,这种开放性也带来了一个众所周知的问题——系统碎片化。本文旨在探讨Android系统碎片化的现状、成因以及可能的解决方案,为开发者和用户提供一种全新的视角来理解这一现象。通过分析不同版本的Android系统分布、硬件多样性以及更新机制的影响,我们提出了一系列针对性的策略,旨在减少碎片化带来的影响,提升用户体验。
|
3月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
100 7
|
4月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
|
3月前
|
Android开发
Android开发显示头部Bar的需求解决方案--Android应用实战
Android开发显示头部Bar的需求解决方案--Android应用实战
27 0
|
5月前
|
前端开发 开发工具 Android开发
探索安卓与iOS应用开发:跨平台解决方案的崛起
【8月更文挑战第27天】在移动设备日益普及的今天,安卓和iOS系统占据了市场的主导地位。开发者们面临着一个重要问题:是选择专注于单一平台,还是寻找一种能够同时覆盖两大系统的解决方案?本文将探讨跨平台开发工具的优势,分析它们如何改变了移动应用的开发格局,并分享一些实用的开发技巧。无论你是新手还是资深开发者,这篇文章都将为你提供有价值的见解和建议。
|
5月前
|
Android开发
Android编译出现Warning: Mapping new ns to old ns的解决方案
Android编译出现Warning: Mapping new ns to old ns的解决方案
430 3
|
5月前
|
前端开发 JavaScript Android开发
探索Android和iOS开发中的跨平台解决方案
【8月更文挑战第1天】随着移动应用市场的不断扩张,开发者面临一个共同的挑战——如何高效地为多个平台创建和维护应用程序。本文将深入探讨跨平台开发工具,特别是Flutter和React Native,通过比较它们的优势和限制,并辅以实际代码示例,揭示这些工具如何帮助开发者在保持高性能的同时,实现代码的最大化重用。