• Android修改时间实现

    2016-05-30 23:08:58
    root过系统用提权来获得系统权限来修改文件权限属性为修改时间扫清障碍;没root过的系统需要系统签名来获取权限去修改时间

    一、需要root过系统

    下面的代码实现需要系统root过的。

    package com.example.util;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.IOException;
    import java.util.Calendar;
    
    import android.os.SystemClock;
    
    public class SystemDateTime {
    
    
    
    
            public static void setDateTime(long when)  throws IOException, InterruptedException {
    
                requestPermission();
    
    
                if (when / 1000 < Integer.MAX_VALUE) {
                    SystemClock.setCurrentTimeMillis(when);
                }
    
                long now = Calendar.getInstance().getTimeInMillis();
    
                if(now - when > 1000)
                    throw new IOException("failed to set Date."); 
    
            }
    
            public static void setDateTime(int year, int month, int day, int hour, int minute, int Sec) throws IOException, InterruptedException {
    
                requestPermission();
    
                Calendar c = Calendar.getInstance();
    
                c.set(Calendar.YEAR, year);
                c.set(Calendar.MONTH, month-1);
                c.set(Calendar.DAY_OF_MONTH, day);
                c.set(Calendar.HOUR_OF_DAY, hour);
                c.set(Calendar.MINUTE, minute);
                c.set(Calendar.SECOND, Sec);
    
                long when = c.getTimeInMillis();
    
                if (when / 1000 < Integer.MAX_VALUE) {
                    SystemClock.setCurrentTimeMillis(when);
                }
    
                long now = Calendar.getInstance().getTimeInMillis();
    
                if(now - when > 1000)
                    throw new IOException("failed to set Date."); 
    
            }
    
            public static void setDate(int year, int month, int day) throws IOException, InterruptedException {
    
                requestPermission();
    
                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);
                }
    
                long now = Calendar.getInstance().getTimeInMillis();
    
    
                if(now - when > 1000)
                    throw new IOException("failed to set Date.");
            }
    
            public static void setTime(int hour, int minute) throws IOException, InterruptedException {
    
                requestPermission();
    
                Calendar c = Calendar.getInstance();
    
                c.set(Calendar.HOUR_OF_DAY, hour);
                c.set(Calendar.MINUTE, minute);
                long when = c.getTimeInMillis();
    
                if (when / 1000 < Integer.MAX_VALUE) {
                    SystemClock.setCurrentTimeMillis(when);
                }
    
                long now = Calendar.getInstance().getTimeInMillis();
    
    
                if(now - when > 1000)
                    throw new IOException("failed to set Time.");
            }
    
            static void requestPermission() throws InterruptedException, IOException {
                createSuProcess("chmod 666 /dev/alarm").waitFor();
            }
    
            static Process createSuProcess() throws IOException  {
                File rootUser = new File("/system/xbin/ru");
                if(rootUser.exists()) {
                    return Runtime.getRuntime().exec(rootUser.getAbsolutePath());
                } else {
                    return Runtime.getRuntime().exec("su");
                }
            }
    
            static Process createSuProcess(String cmd) throws IOException {
    
                DataOutputStream os = null;
                Process process = createSuProcess();
    
                try {
                    os = new DataOutputStream(process.getOutputStream());
                    os.writeBytes(cmd + "\n");
                    os.writeBytes("exit $?\n");
                } finally {
                    if(os != null) {
                        try {
                            os.close();
                        } catch (IOException e) {
                        }
                    }
                }
    
                return process;
            }
    
    
    
    }
    

    createSuProcess(“chmod 666 /dev/alarm”)是用系统root权限进程来修改/dev/alarm目录的读写属性。“666”是能赋予各个组读写权限。chmod是Linux下修改权限属性的命令。Runtime.getRuntime().exec(“su”);是提权为root以root身份来执行命令。Runtime.getRuntime().exec(rootUser.getAbsolutePath());是获取系统root用户的绝对地址来获得root权限。像这些os.writeBytes(cmd + “\n”);是用给系统下达相应的命令,cmd是用户给的命令。

    二、需要系统签名

    实现代码和上面的代码差不多,只是没有提权部分代码而已。

    package com.example.util;
    import java.io.IOException;
    import java.util.Calendar;
    
    import com.sanlian.ui.MainActivity;
    
    import android.os.SystemClock;
    import android.util.Log;
    
    public class SystemDateTimeUId {
    
    
    
    
    
            public static void setDateTime(long when) throws IOException, InterruptedException {
    
    
                if (when / 1000 < Integer.MAX_VALUE) {
                    SystemClock.setCurrentTimeMillis(when);
                }
    
                long now = Calendar.getInstance().getTimeInMillis();
    
    
                if(now - when > 1000) {
                    MainActivity.setDateTime = false;
                    throw new IOException("failed to set Date."); 
                } else {
                    MainActivity.setDateTime = true;
                }
    
            }
    
    
            public static void setDateTime(int year, int month, int day, int hour, int minute, int Sec) throws IOException, InterruptedException {
    
    
    
                Calendar c = Calendar.getInstance();
    
                c.set(Calendar.YEAR, year);
                c.set(Calendar.MONTH, month-1);
                c.set(Calendar.DAY_OF_MONTH, day);
                c.set(Calendar.HOUR_OF_DAY, hour);
                c.set(Calendar.MINUTE, minute);
                c.set(Calendar.SECOND, Sec);
    
                long when = c.getTimeInMillis();
    
                if (when / 1000 < Integer.MAX_VALUE) {
                    SystemClock.setCurrentTimeMillis(when);
                }
    
                long now = Calendar.getInstance().getTimeInMillis();
    
    
                if(now - when > 1000) {
                    MainActivity.setDateTime = false;
                    throw new IOException("failed to set Date."); 
                } else {
                    MainActivity.setDateTime = true;
                }
    
            }
    
            public static void setDate(int year, int month, int day) throws IOException, InterruptedException {
    
    
    
                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);
                }
    
                long now = Calendar.getInstance().getTimeInMillis();
    
    
                if(now - when > 1000) {
                    MainActivity.setDateTime = false;
                    throw new IOException("failed to set Date."); 
                } else {
                    MainActivity.setDateTime = true;
                }
            }
    
            public static void setTime(int hour, int minute) throws IOException, InterruptedException {
    
    
                Calendar c = Calendar.getInstance();
    
                c.set(Calendar.HOUR_OF_DAY, hour);
                c.set(Calendar.MINUTE, minute);
                long when = c.getTimeInMillis();
    
                if (when / 1000 < Integer.MAX_VALUE) {
                    SystemClock.setCurrentTimeMillis(when);
                }
    
                long now = Calendar.getInstance().getTimeInMillis();
    
                if(now - when > 1000) {
                    MainActivity.setDateTime = false;
                    throw new IOException("failed to set Date."); 
                } else {
                    MainActivity.setDateTime = true;
                }
            }
    
    }
    

    在AndroidManifest.xml里的头添加android:sharedUserId=”android.uid.system”像下面代码这样。这是将自己的程序加入到了系统的进程中,获得系统权限。

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example"
        android:sharedUserId="android.uid.system"
        android:versionCode="1"
        android:versionName="1.0" >

    打包后的代码还要添加对应系统的系统签名。我的系统签名文件是platform.pk8和platform.x509.pem。各系统需要各自的系统厂家提供系统签名。

    展开全文
  • fps=1在 Android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,.这个函数需要root权限或者运行于系统进程中才可以用。 第一个方法简单点,不过需要在Android系统源...

    转载:https://blog.csdn.net/wuyou1336/article/details/52766099?locationNum=3&fps=1


    在 Android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,.这个函数需要root权限或者运行于系统进程中才可以用。

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

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

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

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

    Shareuserid介绍

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

        android:sharedUserId="android.uid.system"
        package="com.android.camera">

    不同的APK会具有不同的userId,因此运行时属于不同的进程中,而不同进程中的资源是不共享的,在保障了程序运行的稳定。然后在有些时候,我们自己开发了多个APK并且需要他们之间互相共享资源,那么就需要通过设置shareUserId来实现这一目的。

    通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样。

    把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中

    一个mainfest只能有一个Shareuserid标签

      第二个方法麻烦点,不过不用开虚拟机跑到源码环境下用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和第一个方法是一样的

       只是加入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运行在一个进程中,这样可以共享数据,应该会很有用的。



    adb shell  进入shell终端界面

    1、先设置系统的时区配置

    cat /data/property/persist.sys.timezone //查看当前时区配置文件
    setprop persist.sys.timezone GMT        //
    修改属性 
    2、开始设置修改当前系统时间

    date -s "yyyymmdd.[[[hh]mm]ss]"  System/bin/date -s "yyyymmdd.[[[hh]mm]ss]"

    3、查看是否生效

    date 

    二、用代码实现修改Android系统时间的方法

    public void testDate(){
    try {
    Process process = Runtime.getRuntime().exec("su");
    String datetime="20131023.112800"; //
    测试的设置的时间【时间格式 yyyyMMdd.HHmmss
    DataOutputStream os = new DataOutputStream(process.getOutputStream());
    os.writeBytes("setprop persist.sys.timezone GMT\n");
    os.writeBytes("/system/bin/date -s "+datetime+"\n");
    os.writeBytes("clock -w\n");
    os.writeBytes("exit\n");
    os.flush();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

     

    android默认系统日期、时间、时区更改

     

    Android 通过应用设置系统日期和时间的方法

    android 2.3 

    android 4.0

    测试可行,不过需要ROOT权限.


    [java] view plain copy
    1. import java.io.DataOutputStream;    
    2. import java.io.File;    
    3. import java.io.IOException;    
    4. import java.util.Calendar;    
    5.     
    6. import android.os.SystemClock;    
    7.     
    8. public class SystemDateTime {    
    9.         
    10.     static final String TAG = "SystemDateTime";     
    11.         
    12.     public static void setDateTime(int year, int month, int day, int hour, int minute) throws IOException, InterruptedException {    
    13.     
    14.         requestPermission();    
    15.     
    16.         Calendar c = Calendar.getInstance();    
    17.     
    18.         c.set(Calendar.YEAR, year);    
    19.         c.set(Calendar.MONTH, month-1);    
    20.         c.set(Calendar.DAY_OF_MONTH, day);    
    21.         c.set(Calendar.HOUR_OF_DAY, hour);    
    22.         c.set(Calendar.MINUTE, minute);    
    23.             
    24.             
    25.         long when = c.getTimeInMillis();    
    26.     
    27.         if (when / 1000 < Integer.MAX_VALUE) {    
    28.             SystemClock.setCurrentTimeMillis(when);    
    29.         }    
    30.     
    31.         long now = Calendar.getInstance().getTimeInMillis();    
    32.         //Log.d(TAG, "set tm="+when + ", now tm="+now);    
    33.     
    34.         if(now - when > 1000)    
    35.             throw new IOException("failed to set Date.");     
    36.             
    37.     }    
    38.     
    39.     public static void setDate(int year, int month, int day) throws IOException, InterruptedException {    
    40.     
    41.         requestPermission();    
    42.     
    43.         Calendar c = Calendar.getInstance();    
    44.     
    45.         c.set(Calendar.YEAR, year);    
    46.         c.set(Calendar.MONTH, month);    
    47.         c.set(Calendar.DAY_OF_MONTH, day);    
    48.         long when = c.getTimeInMillis();    
    49.     
    50.         if (when / 1000 < Integer.MAX_VALUE) {    
    51.             SystemClock.setCurrentTimeMillis(when);    
    52.         }    
    53.     
    54.         long now = Calendar.getInstance().getTimeInMillis();    
    55.         //Log.d(TAG, "set tm="+when + ", now tm="+now);    
    56.     
    57.         if(now - when > 1000)    
    58.             throw new IOException("failed to set Date.");    
    59.     }    
    60.     
    61.     public static void setTime(int hour, int minute) throws IOException, InterruptedException {    
    62.             
    63.         requestPermission();    
    64.     
    65.         Calendar c = Calendar.getInstance();    
    66.     
    67.         c.set(Calendar.HOUR_OF_DAY, hour);    
    68.         c.set(Calendar.MINUTE, minute);    
    69.         long when = c.getTimeInMillis();    
    70.     
    71.         if (when / 1000 < Integer.MAX_VALUE) {    
    72.             SystemClock.setCurrentTimeMillis(when);    
    73.         }    
    74.     
    75.         long now = Calendar.getInstance().getTimeInMillis();    
    76.         //Log.d(TAG, "set tm="+when + ", now tm="+now);    
    77.     
    78.         if(now - when > 1000)    
    79.             throw new IOException("failed to set Time.");    
    80.     }    
    81.         
    82.     static void requestPermission() throws InterruptedException, IOException {    
    83.         createSuProcess("chmod 666 /dev/alarm").waitFor();    
    84.     }    
    85.         
    86.     static Process createSuProcess() throws IOException  {    
    87.         File rootUser = new File("/system/xbin/ru");    
    88.         if(rootUser.exists()) {    
    89.             return Runtime.getRuntime().exec(rootUser.getAbsolutePath());    
    90.         } else {    
    91.             return Runtime.getRuntime().exec("su");    
    92.         }    
    93.     }    
    94.         
    95.     static Process createSuProcess(String cmd) throws IOException {    
    96.     
    97.         DataOutputStream os = null;    
    98.         Process process = createSuProcess();    
    99.     
    100.         try {    
    101.             os = new DataOutputStream(process.getOutputStream());    
    102.             os.writeBytes(cmd + "\n");    
    103.             os.writeBytes("exit $?\n");    
    104.         } finally {    
    105.             if(os != null) {    
    106.                 try {    
    107.                     os.close();    
    108.                 } catch (IOException e) {    
    109.                 }    
    110.             }    
    111.         }    
    112.     
    113.         return process;    
    114.     }    
    115. }    

    展开全文
  • Android系统的自动确认时间,是由系统通过访问厂家的NTP服务器的时间,然后修改后得到的。 所以当没有网络或者在内网环境下的时候,系统无法访问到NTP服务器,便会造成系统时间错误。 所以这个时候我们就需要程序...

    前言

    在开发过程中我们常常需要获取系统时间。
    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

    这里写图片描述

    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;
          }
      
      

      效果

      这里写图片描述

      参考

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

      文章来源

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

      展开全文
    • 修改android 系统时间

      2014-11-05 13:41:05
      命令如 date -s "yyyymmdd.[[[hh]mm]ss]" 直接在CRT上运行,举例:date -s "20120801.120503"   但在adb shell下貌似不行,adb shell date -s "20120801.120503

      命令如 date -s "yyyymmdd.[[[hh]mm]ss]"

      直接在CRT上运行,举例:date -s "20120801.120503"

       

      但在adb shell下貌似不行,adb shell date -s "20120801.120503"

      展开全文
    • 一 : 修改Android系统默认时间 源码路径:frameworks/base/services/java/com/android/server/SystemServer.java 主要变量EARLIEST_SUPPORTED_TIME // The earliest supported time. We pick one day into 1970...

      一 : 修改Android系统默认时间

      源码路径:frameworks/base/services/java/com/android/server/SystemServer.java
      主要变量EARLIEST_SUPPORTED_TIME

          // The earliest supported time.  We pick one day into 1970, to
          // give any timezone code room without going into negative time.
          private static final long EARLIEST_SUPPORTED_TIME = 1514764800000L;//20180101 00:00:00
      •  

      通过SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME)设置系统时间,只需要修改EARLIEST_SUPPORTED_TIME变量的值。

          private void run() {
              try {
                  traceBeginAndSlog("InitBeforeStartServices");
                  // If a device's clock is before 1970 (before 0), a lot of
                  // APIs crash dealing with negative numbers, notably
                  // java.io.File#setLastModified, so instead we fake it and
                  // hope that time from cell towers or NTP fixes it shortly.
                  if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
                      Slog.w(TAG, "System clock is before 1970; setting to 1970.");
                      SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
                  }
      
      •  

      设置系统默认时间这段代码请放在startOtherServices()之后,否则无效(不同的平台代码略有差别,可以自己评价该放在什么位置)。

              // Start services.
              try {
                  traceBeginAndSlog("StartServices");
                  startBootstrapServices();
                  startCoreServices();
                  startOtherServices();
                  //add by jasun@180730 for default time start
                  if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
                      Slog.w(TAG, "System clock is before 2018.; setting to 2018.");
                      SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
                  }
                  //add by jasun@180730 for default time end
                  SystemServerInitThreadPool.shutdown();
              } catch (Throwable ex) {
                  Slog.e("System", "******************************************");
                  Slog.e("System", "************ Failure starting system services", ex);
                  throw ex;
              } finally {
                  traceEnd();
              }
      •  

      二 : 时间转换为UNIX时间戳

      EARLIEST_SUPPORTED_TIME变量值如何获取?
      Linux命令转换时间戳,如下:

      $ date +%s --date 19700101 --utc   // 1970-01-01 00:00 UTC
      0
      $ date +%s --date 20120101 --utc   // 2012-01-01 00:00 UTC
      1325376000
      $ date +%s --date 20160101 --utc   // 2016-01-01 00:00 UTC
      1451606400
      •  

      反之,也可以把某个UNIX时间戳转换为具体日期,如下:

      $ date --date=@86400 --utc // Android默认EARLIEST_SUPPORTED_TIME值为86400×1000
      1970年 01月 02日 星期五 00:00:00 UTC
      $ date --date=@1451606400 --utc
      2016年 01月 01日 星期五 00:00:00 UTC
      $ date --date=@1451606400
      2016年 01月 01日 星期五 08:00:00 CST

      --------------------- 作者:一莫言一 来源:CSDN 原文:https://blog.csdn.net/ljx646566715/article/details/81189914?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!

      展开全文
    • 相信很多人看到过Android手机或平板显示XXXX-01-01...大部分时候,系统默认时间是Epoch时间(即1970-01-01 00:00:00 UTC),也有OEM厂商会修改此默认时间。 进入正题,如何修改默认时间呢,很简单,修改SystemServer.j
    • 花费两天时间修改系统时间上面的确不应该,但又让我多学了一种方法; 第一种方法是用命令修改Android系统时间; 第二种方法是重新编译apk进行修改Android系统时间; 两个比较,肯定第一种既方便又节省时间;刚...
    • 如何保障android客户端与服务器时间同步,不受用户更改系统时间的影响? NTP协议 NTP原理如下: 系统时钟同步的工作过程如下: Device A发送一个NTP报文给Device B,该报文带有它离开Device A时的时间戳,该...
    • 1、修改前提  获取系统root权限,然后adb shell进入shell界面 2、时区设置  执行如下命令: cat /data/property/persist.sys.timezone //查看当前时区配置文件 setprop persist.sys.timezone GMT //修改...
    • android修改系统时间

      2017-11-13 14:13:56
      * 日期时间向前或向后添加几小时 * @param dateString * @return */ public static String addTimeHours(String dateString,int hours) { SimpleDateFormat dateFormat = new SimpleDateF
    • 由于Android系统源码的默认时间为1970年,本文提供两种方法来修改Android的默认时间, 一、启动服务脚本来修改默认时间二、修改系统源码来解决默认时间
    • Android修改系统时间

      2016-10-13 20:48:20
      最近碰到修改系统时间的需求,折腾了一段时间,发现网上有一种方法是通过 命令的方式修改的。 在这里感谢那位老兄的方法。 TimeManager.setSystemTime: public static void setSystemTime(Date date) { ...
    • 之前看很多修改系统时间得都是4.0之前用的格式,现在7.0之后的格式有所改变,请大家参考比对 建议先用adb命令调试,可以的话在加入代码也一定可以。但要记得 root 和 加权限 /** * 执行Android命令,设置系统时间 ...
    • 只有超级用户才能用date命令设置时间,一般用户只能用date命令显示时间!!! linux修改系统时间,通过date -s命令即可。 android也是通过date命令,但不是date -s,而是 date 123012002018.59 set 注意,必须以...
    • android 修改系统时间

      2016-08-28 11:15:26
      android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,但是我们在使用的时候如果仅仅的使用这个方法,不用其他设置的话,根本修改不了时间。原因是这里还需要权限的设置。这里所说的...
    • 一 : 修改Android系统默认时间 源码路径:frameworks/base/services/java/com/android/server/SystemServer.java 主要变量EARLIEST_SUPPORTED_TIME // The earliest supported time. We pick one day into ...
    • Android的APP中,有不少信息可以“长按”,然后做进一步处理。...因此,执行下面的操作,修改了“长按”的反应时间。 在CMD命令窗口中执行如下命令: 1.查看 // 系统的长按时间是多长 adb shell "settings
    • // 修改系统时间 try { Process process = Runtime.getRuntime().exec("su"); // 设置的时间时间格式 yyyyMMdd.HHmmss】 String formatDate = DateTi
    • Android时间与服务器同步方案 在部分软件应用场景里,我们对应用时间要求非常苛刻,如活动、商品秒杀倒计时操作,防止用户修改本机时间,导致应用错乱。 我们如果能让本地应用时间与服务器时间在误差应许范围内,...
    • 需求:应用程序,在系统没有进行root条件下,修改系统时间。 解决方法:让自己的应用程序具有系统权限 环境:Android 4.4系统的手机,Android Studio 具体步骤 下载: 获取系统签名的需要文件 1 在应用程序的...
    1 2 3 4 5 ... 20
    收藏数 191,157
    精华内容 76,462