• 由于Android系统源码的默认时间为1970年,本文提供两种方法来修改Android的默认时间, 一、启动服务脚本来修改默认时间二、修改系统源码来解决默认时间

    转载注明网址:http://blog.csdn.net/hubbybob1/article/details/54575572
    前段时间在做Openssl的相关编程,发现一个错误:

    error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate:s3_pkt.c:1259:SSL alert number 42
    /*42:bad_certificate
    There is a problem with the certificate, for example, a certificate is corrupt, or a certificate contains signatures that cannot be verified.*/

    表示出现SSL错误码为42,经过查找列出了相关的错误码为bad_certificate,即CA证书出错,经过排查发现我的CA证书的时间是2016年制作,而我的Android平台系统时间却是1970年,所以会报错,那么就要修改Android平台的默认时间。
    由于Android系统源码的默认时间为1970年,本文提供两种方法来修改Android的默认时间。
    由于Android系统源码的默认时间为1970年,本文提供两种方法来修改Android的默认时间。
    一、启动服务脚本来修改默认时间
    修改系统时间的命令就是:

    date -s //设置当前时间,只有root权限才能设置,其他只能查看 
    date -s 20170117//设置系统时间为2017年1月17日00:00:00
    date -s 01:01:01 //设置具体时间,不会对日期做更改 
    date -s "01:01:01 2017-01-17" //这样可以设置全部时间 
    date -s "01:01:01 20170117" //这样可以设置全部时间 
    date -s "2017-01-17 01:01:01" //这样可以设置全部时间 
    date -s "20120117 01:01:01" //这样可以设置全部时间

    1.编写脚本文件,随便命名为setdate.sh如下:

    #!/system/bin/sh
    su
    date -s 20170117
    date -s 12:00:00
    echo "*******************************"
    echo "set date 2017.01.17 12:00:00"
    echo "*******************************"

    把编写好的shell脚本放到固定的目录下面,例如可以放到和init.rc同一个目录下。
    2.编写MK文件,找到你的启动mk文件,再起末尾添加如下copy语句:

    PRODUCT_COPY_FILES += 相对本mk文件的存放脚本的路径/setdate.sh:system/bin/setdate.sh
    //在运行过程中将setdate.sh脚本copy到/system/bin/下面

    3.编写init.rc启动服务文件
    在其最后添加以下内容,用来启动这个服务

    service tiny /system/bin/setdate.sh
    class main
    oneshot
    on property:sys.boot_completed=1
    start setdate 

    到这里重新编译你的Android源码,安装就可以在启动系统的时候,使用date命令对系统的时间进行修改,其实这个不算严格意义上的修改默认的时间,下面的方法就是去Android源码里面去修改具体的时间了。
    二、修改系统源码来解决默认时间
    在这里主要讨论的是从Android系统源码出发来对系统时间的修改。其文件要找到是在

    /frameworks/base/services/java/com/android/server/SystemServer.java 

    在这个文件中的第1180行的代码如下:

    //在对象public class SystemServer内如下定义和判断
        static Timer timer;//定义时间
        static final long SNAPSHOT_INTERVAL = 60 * 60 * 1000; // 1hr,一小时的毫秒数
    //从970年1月一日0点0分0秒开始所经过的毫秒数
        // 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 = 86400 * 1000;//可以查时间的ms数为1970的某天,定义最近时间
    
        /**
         * Called to initialize native system services.
         */
        private static native void nativeInit();
    
        public static void main(String[] args) {
    
            /*
             * In case the runtime switched since last boot (such as when
             * the old runtime was removed in an OTA), set the system
             * property so that it is in sync. We can't do this in
             * libnativehelper's JniInvocation::Init code where we already
             * had to fallback to a different runtime because it is
             * running as root and we need to be the system user to set
             * the property. http://b/11463182
             */
            SystemProperties.set("persist.sys.dalvik.vm.lib",
                                 VMRuntime.getRuntime().vmLibrary());
    
            if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {//获取当前时间和所设置的最近时间进行对比,,一般都是网络获取,没有网路的话一般都是1970年开始,可理解为没有互联网就设置为最近时间
                // 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.
                Slog.w(TAG, "System clock is before 1970; setting to 1970.");
                SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);//设置为定义的最近时间,也就是默认时间
            }

    因此我们可以修改这个最近时间,也就是默认时间如下:

    //private static final long EARLIEST_SUPPORTED_TIME = 86400 * 1000;//可以查时间的ms数为1970的某天,
    //private static final long EARLIEST_SUPPORTED_TIME = 1477899065689L;//设置时间为20140701
    private static final long EARLIEST_SUPPORTED_TIME = 1482899065689L;//设置时间为2017年的某一天,某一时刻

    到这里修改时间的两种方法已经完毕,是不是很简单啊

    展开全文
  • amp;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 修改系统时间

    2016-08-28 11:15:26
    android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,但是我们在使用的时候如果仅仅的使用这个方法,不用其他设置的话,根本修改不了时间。原因是这里还需要权限的设置。这里所说的...

    在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,但是我们在使用的时候如果仅仅的使用这个方法,不用其他设置的话,根本修改不了时间。原因是这里还需要权限的设置。这里所说的权限不是我们平常所理解的像添加访问网络之类的权限。这里要获取的权限是系统的权限。
    android:sharedUserId=”android.uid.system”
    添加的位置

    展开全文
  • 第三方apk修改系统时间和日期的实现,简单明了。
  • 前提是手机必须先获取root; root方法见其他章节或网上都有介绍 adb shell 进入shell 终端界面 1、先设置系统的时区配置 ...cat /data/property/persist.sys.timezone //查看...2、开始设置修改当前系统时间 da

    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更改时区相对比较容易实现,网上也有很多资料,直接设置一个属性即可,例如设置上海东八区,persist.sys.timezone=Asia/Shanghai。但是如何实现更改默认系统时间呢?

          android中,Linux内核中、rtc时钟,默认的起始日期都是197011日,那么如何把默认日期指到2012-01-01呢?笔者在实践中发现,在RTC驱动中可以很容易实现。在RTC驱动加载的时候,一般都有个probe函数需要先执行,因此在probe函数里下手最直接有效。RTC1970-01-01开始,那当然很容易把默认值设置到2012-01-01,所需要设置的seconds也就是从1970-01-01所差的秒数,以秒为单位。因此,一旦读出来的RTC值小于我们预想的值比如2012-01-011325402913)小,我们就把它设置到这个时间点。

    [cpp] view plaincopy

    1.  seconds = rtc_read_time();  

    2.  printk("init PMU/RTC time to  %ld \n", seconds);  

    3.    

    4.  if(seconds <= 1325402913) {  

    5.      seconds = 1325402913;/*2012-01-01*/  

    6.      ret = rtc_set_time(seconds);  

    7.      RTC_DBG("Init Set time: %ld, ret =0x%x\n", seconds, ret);  

    8.  }  


     
    笔者通过结果显示,在android平台上是可行的。要设置到哪天几点几分,只要算好具体1970-01-01 0000差的秒数即可,简单明了。这样客户、用户使用起来更方便一些。


    展开全文
  • 1、修改前提  获取系统root权限,然后adb shell进入shell界面 2、时区设置  执行如下命令: cat /data/property/persist.sys.timezone //查看当前时区配置文件 setprop persist.sys.timezone GMT //修改...

    1、修改前提

           获取系统root权限,然后adb shell进入shell界面


    2、时区设置

          执行如下命令:

    cat /data/property/persist.sys.timezone //查看当前时区配置文件
    setprop persist.sys.timezone GMT        //修改属性 

    3、设置日期和时间

           命令格式:

    date -s "yyyymmdd.hhmmss"
    如设置:2015年11月16日12时,可执行如下命令:

    date -s "20151116.120000"

    4、查看日期和时间

          执行如下命令:

    date
    系统输出:

    Mon Nov 16 12:00:02 CST 2015






    展开全文
  • 修改Android系统时间为默认编译时间 为了修改android的默认时间。 在网上查询一些资料,发现有介绍在SystemServer.java 里修改的。 但发现在此处修改,并没有达到预期效果,经查询在AlarmManagerService.java 中设置...
  • 一 : 修改Android系统默认时间 源码路径:frameworks/base/services/java/com/android/server/SystemServer.java 主要变量EARLIEST_SUPPORTED_TIME // The earliest supported time. We pick one day into 1970...
  • Android设备没有联网,无法获取当前真实时间的时候,就会使用系统默认时间。大部分时候,系统默认时间是Epoch时间(即1970-01-01 00:00:00 UTC),也有OEM厂商会修改此默认时间。 进入正题,如何修改默认时间呢,...
  • 第一种方法是用命令修改Android系统时间; 第二种方法是重新编译apk进行修改Android系统时间; 两个比较,肯定第一种既方便又节省时间;刚开始我使用的是第一种方法做的, 由于对命令不熟,导致设置时间失败; ...
  • android修改系统时间

    2020-06-06 23:30:33
    Android修改系统时间(应用程序获得系统权限)!!!对你有所帮助
  • 一 : 修改Android系统默认时间 源码路径:frameworks/base/services/java/com/android/server/SystemServer.java 主要变量EARLIEST_SUPPORTED_TIME // The earliest supported time. We pick one day into ...
  • linux修改系统时间,通过date -s命令即可。 android也是通过date命令,但不是date -s,而是 date 123012002018.59 set 注意,必须以root身份修改,否则修改无效。先adb root,再adb shell,即可以root身份...
  • 这是获取系统权限的相关工具和测试源码,可以在系统没有root的条件下,修改系统时间
  • Android修改系统时间

    2016-10-13 20:48:20
    最近碰到修改系统时间的需求,折腾了一段时间,发现网上有一种方法是通过 命令的方式修改的。 在这里感谢那位老兄的方法。 TimeManager.setSystemTime: public static void setSystemTime(Date date) { ...
  • 之前看很多修改系统时间得都是4.0之前用的格式,现在7.0之后的格式有所改变,请大家参考比对 建议先用adb命令调试,可以的话在加入代码也一定可以。但要记得 root 和 加权限 /** * 执行Android命令,设置系统时间 ...
  • 权限为 Root 权限 /** * 设置系统时间 * @param time 格式为“年月日.时分秒”,例如:20111209.121212 */ public static boolean setTime(String time) { Process process = null; DataOutputS
  • Android 替换ScheduledFuture定时器解决修改系统时间引起Timer定时器挂起问题 大家知道平时使用的Timer定时器时,如果修改系统时间(将系统时间修改当前前面的时间)会引起imer定时器挂起 我们替换定时任务...
  • Android设置系统时间问题 https://notes.z-dd.net/2020/04/10/Android%E8%AE%BE%E7%BD%AE%E7%B3%BB%E7%BB%9F%E6%97%B6%E9%97%B4%E9%97%AE%E9%A2%98/
1 2 3 4 5 ... 20
收藏数 153,065
精华内容 61,226