前言
系统时间限制默认是Int(有符号32位,最大0X7FFFFFFF)最大值即为: Integer.MAX_VALUE = 0X7FFFFFFF=2147483647 = 2038-01-19 11:14:07。
个人流水账而已。
正文
将RTC时间限制改成自己所需时间:4102415940LL = 2099-12-31 23:59:00。
frameworks/base/services/core/jni/com_android_server_AlarmManagerService.cpp
修改地方如下
static jint android_server_AlarmManagerService_setKernelTime(JNIEnv*, jobject, jlong nativeData, jlong millis) { AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData); struct timeval tv; int ret; //修改开始 //if (millis <= 0 || millis / 1000LL >= 4102415940LL) { // 改为4102415940LL if (millis <= 0 || millis / 1000LL >= 4102415940LL) { //修改结束 return -1; } tv.tv_sec = (time_t) (millis / 1000LL); tv.tv_usec = (suseconds_t) ((millis % 1000LL) * 1000LL); ALOGD("Setting time of day to sec=%d\n", (int) tv.tv_sec); ret = impl->setTime(&tv); if(ret < 0) { ALOGW("Unable to set rtc to %ld: %s\n", tv.tv_sec, strerror(errno)); ret = -1; } return ret; }
底层改了,那上层也都修改,Android设置中设置时间时也做了限制。
/packages/apps/Car/Settings/src/com/android/car/settings/datetime/DatePickerFragment.java
修改做大MAX_TIME_SEC值即可。
private static final long MAX_TIME_SEC = 4102415940L; public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mDatePicker = (DatePicker) getView().findViewById(R.id.date_picker); Button button = (Button) getActivity().findViewById(R.id.action_button1); button.setText(android.R.string.ok); button.setOnClickListener(v -> { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, mDatePicker.getYear()); c.set(Calendar.MONTH, mDatePicker.getMonth()); c.set(Calendar.DAY_OF_MONTH, mDatePicker.getDayOfMonth()); long when = Math.max(c.getTimeInMillis(), DatetimeSettingsFragment.MIN_DATE); Log.i("setting","setTime when:"+when); if (when / MILLIS_IN_SECOND <= MAX_TIME_SEC) { ((AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE)).setTime(when); getContext().sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED)); } getFragmentController().goBack(); }); }
参考文章
《》
© 版权声明