android11 系统时间一定要大于编译的时间才能有效,否者系统时间会自动变成编译时间
时间: 2024-03-29 07:35:23 浏览: 78
Android 11 系统中确实有一个机制,会比较系统时间和编译时间的大小,如果系统时间小于等于编译时间,系统会将时间自动设置为编译时间。这个机制是为了避免一些时间相关的问题,例如应用程序的过期问题、证书验证问题等等。
不过需要注意的是,这个机制针对的是系统级别的时间,而不是应用程序级别的时间。即使系统时间被设置为编译时间,应用程序仍然可以通过系统提供的 API 获取当前的真实时间。
另外,Android 11 系统也提供了一些 API,可以让开发者在应用程序中获取编译时间和系统时间,并进行比较和处理。例如可以使用 BuildConfig 类中的 BUILD_TIME 参数获取编译时间,使用 System.currentTimeMillis() 方法获取系统当前时间。
相关问题
那该比较时间的代码在源码中哪里体现
Android 11 系统中比较时间并设置时间的代码主要位于系统服务框架层的 SystemServer 类中。具体来说,在 SystemServer 的 startBootstrapServices() 方法中,会启动一个名为 "time_detector" 的服务,该服务会通过比较当前系统时间和编译时间来判断是否需要设置时间。以下是相关代码片段:
```
// Start the time detector. This is needed to detect when the system's time has
// been set to a time that is not what the network would say. We need to make sure
// that Test Harnesses that rely on the system time being correct do not break.
try {
timemaster = new TimeDetector(mContext, mHandler);
timemaster.start();
ServiceManager.addService("time_detector", timemaster);
} catch (Throwable e) {
reportWtf("starting TimeDetector", e);
}
```
在 TimeDetector 类中,会通过比较系统时间和编译时间,然后决定是否需要设置时间。以下是相关代码片段:
```
final String buildDate = SystemProperties.get("ro.build.date.utc");
final long currentTimeMillis = System.currentTimeMillis();
final long buildTimestampMillis = buildDate.equals("") ? -1 : Long.parseLong(buildDate) * 1000L;
if (buildTimestampMillis > 0 && currentTimeMillis < buildTimestampMillis) {
Slog.i(TAG, "Current time only " + currentTimeMillis + ", advancing to build time " + buildTimestampMillis);
SystemClock.setCurrentTimeMillis(buildTimestampMillis);
}
```
在这里,会先获取编译时间(即系统属性 ro.build.date.utc),然后将其转换为毫秒级别的时间戳。如果编译时间大于 0,且当前系统时间小于编译时间,则会将系统时间设置为编译时间。
设置"compileSdkVersion"和"buildToolsVersion"来指定编译使用的Android SDK版本和构建工具版本
是的,你可以在项目的build.gradle文件中设置"compileSdkVersion"和"buildToolsVersion"来指定编译使用的Android SDK版本和构建工具版本。这些设置可以影响你的应用程序的最小API级别、可用的库和构建过程中使用的工具等。
下面是一个示例:
```
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
...
}
...
}
```
在这个示例中,"compileSdkVersion"设置为30,表示编译时使用的Android SDK版本是30。"buildToolsVersion"设置为"30.0.3",表示构建工具版本为30.0.3。
你可以根据你的应用程序的需要来设置这些值,但是需要注意的是,"compileSdkVersion"和"buildToolsVersion"需要匹配,并且"compileSdkVersion"应该大于或等于你的应用程序的"minSdkVersion"。
阅读全文