¿Cómo puedes evitar las explotaciones de reloj en los juegos de Android?
Necesito medir un período de tiempo que puede durar hasta unas pocas horas. Estoy asumiendo que la manera normal de hacer esto sería algo como:
Date date = new Date(); ...wait some time... (new Date()).getTime() - date.getTime())
Pero, ¿podría un usuario cambiar el reloj de Android de vuelta una hora para engañar al juego y hacer el lapso de tiempo más corto? ¿El tiempo de lectura de una fuente en línea sería la mejor solución?
new Date()
utiliza System.currentTimeMillis()
que depende del reloj del sistema operativo – y está sujeto a cambios cuando el usuario cambia la fecha y hora del sistema.
Debe utilizar System.nanoTime()
, que tiene las siguientes propiedades:
/** * Returns the current value of the most precise available system * timer, in nanoseconds. * * <p>This method can only be used to measure elapsed time and is * not related to any other notion of system or wall-clock time. * The value returned represents nanoseconds since some fixed but * arbitrary time (perhaps in the future, so values may be * negative). This method provides nanosecond precision, but not * necessarily nanosecond accuracy. No guarantees are made about * how frequently values change. Differences in successive calls * that span greater than approximately 292 years (2<sup>63</sup> * nanoseconds) will not accurately compute elapsed time due to * numerical overflow. * * <p> For example, to measure how long some code takes to execute: * <pre> * long startTime = System.nanoTime(); * // ... the code being measured ... * long estimatedTime = System.nanoTime() - startTime; * </pre> * * @return The current value of the system timer, in nanoseconds. * @since 1.5 */ public static native long nanoTime();
Esto no se puede manipular simplemente cambiando la fecha del sistema.