Intereting Posts
Как определить, когда нажата кнопка питания в классе Broadcast Receiver, когда на Android-устройстве активировано разрешение администратора устройства Понимание реализации пользовательской блокировки на Android с помощью метода замены основного экрана Как нарисовать вектор направления в Android Исключение рендеринга Android Studio: «mBaselineAlignedChildIndex из LinearLayout указывает на представление, которое не знает, как получить его базовый уровень» Использование Gson и Retrofit 2 для десериализации сложных ответов API Еще один вопрос загрузки изображения Ошибка: java.lang.NoClassDefFoundError Android Увольнение ProgressDialog в android Android 5.1.1 lollipop возвращает пустой путь к файлу, если изображение выбрано из галереи Android как рисовать круглые прямоугольники и тени Захват переадресации страниц через javascript в Android-браузере Android Android разблокировать экран намерения? Ищет хороший календарь датпикера для Android Как findViewById инициализирует представление Самые популярные размеры экрана / разрешения на телефонах Android

Как вы можете избежать эксплойтов в играх для Android?

Мне нужно измерить период времени, который может длиться до нескольких часов. Я предполагаю, что обычный способ сделать это будет примерно таким:

Date date = new Date(); ...wait some time... (new Date()).getTime() - date.getTime()) 

Но может ли пользователь изменить часы Android на час, чтобы обмануть игру и сократить время? Будет ли лучшее время для чтения из онлайн-источника?

Solutions Collecting From Web of "Как вы можете избежать эксплойтов в играх для Android?"

new Date() использует System.currentTimeMillis() которая зависит от часов ОС – и может быть изменена, когда пользователь изменяет системную дату и время.

Вы должны использовать System.nanoTime() , который имеет следующие свойства:

 /** * 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(); 

Это нельзя манипулировать, просто изменив системную дату.