转载注明网址: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年的某一天,某一时刻
到这里修改时间的两种方法已经完毕,是不是很简单啊