配置的默认时区不生效,通常有如下几种情况:
1,自动更新时区默认开启,插卡开机,有网络连接,开机后自动更新了时区,导致默认时区不生效;
2,自动更新时区默认开启,不插卡开机,不连接网络,开机后自动更新了时区,导致默认时区不生效;
3,设置的默认时区不在支持的时区列表中,显示了其他时区,导致默认时区不生效;
4,系统带有Google开机向导。Google开机向导中有时区设置界面,如果设置的默认时区在其列表中不存在,开机向导会显示其他时区,这时如果点击下一步,会将开机向导界面显示的时区设置到系统中,导致默认时区不生效;
5,seLinux权限异常,导致默认时区不生效。
- 关于上面的5种情况,有些可以修改,有些无法修改,具体如下:
1, 自动更新时区默认开启情况下,通过网络更新时区是正常的。如果要让其不更新时区,可以默认关闭自动更新时区开关。具体如下:
将自动更新时区开关def_auto_time_zone的值设置为false。
文件路径:platform/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
2, 自动更新时区默认开启情况下,不插卡开机,不连接网络,设备也会驻留到紧急网络上,此时会根据网络上报的国家码进行匹配并更新时区。所以其修改方法与第1条是一样的,关闭自动更新时区开关。通常客户会希望保持自动更新时区开关打开,在不插sim卡的情况下开机不更新时区,如果要实现这种功能,需要如下修改:
在frameworks/opt/telephony/src/java/com/android/internal/telephony/NewNitzStateMachine.java文件的setAndBroadcastNetworkSetTimeZone方法开头添加如下代码,对应的类也需要导入:
+ import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState; + import com.android.internal.telephony.uicc.UiccCardApplication;
+ UiccCardApplication uiccApp = mPhone.getUiccCardApplication(); + if (uiccApp == null || uiccApp.getState() == AppState.APPSTATE_UNKNOWN) { + Rlog.d(LOG_TAG, “Not to set network time zone due to sim absent.”); + return; + } |
3, 系统支持的默认时区列表在tzlookup.xml文件中
文件路径:system/timezone/output_data/android/tzlookup.xml
如果是tzlookup.xml中没有的时区id,配置默认时区是无效的,因为系统不支持。
4, Google开机向导应用维护的时区列表是独立的,与系统支持的时区列表可能不一致。而且Google开机向导应用是闭源的,所以无法修改。
5, 因为是权限问题,所以只需要添加相应的权限即可。具体修改如下:
device/sprd/XXX/common/sepolicy/vendor_init.te
+ allow vendor_init exported_system_prop:property_service { set }
说明:如果是因为权限问题不生效,kernel log中会有如下信息打印,可以作为参考:
……selinux: avc: denied { set } for property=persist.sys.timezone pid=1 uid=0 gid=0 scontext=u:r:vendor_init:s0 tcontext=u:object_r:exported_system_prop:s0 tclass=property_service permissive=0
……init: Unable to set property ‘persist.sys.timezone’ to ‘Europe/Amsterdam’ in property file ‘/vendor/build.prop’: SELinux permission check failed