Android上的settimeofday()导致errno - 只读文件系统

时间:2013-09-18 13:45:12

标签: c linux time android-ndk

我正在尝试用C中的NDK本机代码设置设备时间。据我所知,最好的解决方案是使用settimeofday()。

struct timeval tv = {timet, 0};
struct timezone tz = {timezone, daylight}; // The second timezone is long int. Time lib extern which perfectly suits here.
if (settimeofday(&tv, &tz) != 0)
{
    LOG(("settimeofday() failed: %s", strerror(errno)));
}

结果

settimeofday() failed: Read-only file system

在本地设置时间还有其他方法吗?有可能吗?我查看了只读文件系统部分的问题,但我没有Rooted设备。

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果没有足够的权限,您将无法设置设备时间,并且应用将无法在非root设备上获得该权限。从手册页:

   EPERM  The calling process has insufficient privilege to call  settime-
          ofday(); under Linux the CAP_SYS_TIME capability is required.

即使你设法设置它,下次设备通过网络更新时也可能会被覆盖。

你得到的是EROFS而不是EPERM,这有点奇怪。

答案 1 :(得分:1)

Android系统时钟映射到" / dev / alarm"它只具有非系统应用的读取权限。所以,如果你想改变股票设备上的时间,那你就不走运了。你必须使用 -

  1. 设置应用程序(系统应用程序以系统特权运行)或
  2. 使用系统特权签署您的应用程序(除非您是为供应商工作或推出自己的FW,否则这是不可能的)
  3. 因此,如果您只想使用您的应用更改系统时间,则必须更改" / dev / alarm"的权限。是可写的(来自adb shell的chmod 666 / dev / alarm)。要做到这一点,你需要一个有根设备。

    更改权限后,您可以使用应用程序中的Java API更改时间(SystemClock.setCurrentTimeMillis())。

    我仍然无法使用settimeofday()或clock_settime()。

    希望这有帮助。