Я изучал новые API, представленные в Android 4.2. При просмотре класса UserManager я обнаружил следующее метод:

public boolean isUserAGoat()

Используется, чтобы определить, подвержен ли пользователь, выполняющий этот вызов, телепортации.

Возвращает значение, указывающее, является ли пользователь, выполняющий этот вызов, козлом.

Как и когда это следует использовать?

3853
Ovidiu Latcu 14 Ноя 2012 в 12:34
4
Если можно использовать, чтобы избежать некоторых предупреждений Java, в качестве пасхального яйца и в качестве теста, чтобы узнать, кто читает API. И это отсылка к пасхалке в Chrome.
 – 
Dorian
15 Ноя 2012 в 00:53
14
 – 
John Isaiah Carmona
15 Ноя 2012 в 08:58
3
Похоже, гуглеры почему-то любят коз, неудивительно, что они сделали из них пасхальное яйцо. есть также серьезные (! ) инвестиции в коз: - как написано в блоге googleblog - покос с козами - козлы - это баааахк - и записаны в youtube, в конце концов, они родные газонокосилки, к тому же эффективные ..
 – 
none
15 Ноя 2012 в 14:21
24
Также существуют константы силы тяжести на первой звезде смерти developer.android. com / reference / android / hardware /… и на острове телешоу Lost developer.android.com/reference/android/hardware/… что, конечно же, цифры.
 – 
Fernando Gallego
30 Мар 2013 в 02:09

11 ответов

Лучший ответ

Обновление Android R:

В Android R этот метод всегда возвращает false. Google говорит, что это сделано "для защиты конфиденциальности козла":

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#R}, this method always returns
 * {@code false} in order to protect goat privacy.</p>
 *
 * @return Returns whether the user making this call is a goat.
 */
public boolean isUserAGoat() {
    if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.R) {
        return false;
    }
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Предыдущий ответ:

Из их source , метод, используемый для возврата false, пока он не был изменен в API 21.

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 * @return whether the user making this call is a goat 
 */
public boolean isUserAGoat() {
    return false;
}

Похоже, что этот метод бесполезен для нас как разработчиков. Кто-то ранее заявлял, что это может быть пасхальное яйцо . .

В API 21 реализация была изменена, чтобы проверить, установлено ли приложение с пакетом com.coffeestainstudios.goatsimulator

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Вот источник и изменение .

1919
Wrichik Basu 17 Дек 2020 в 19:56
110
Теория: козлов можно встретить во всевозможных опасных местах, таких как отвесные скалы, что, возможно, противоречит тенденциям локации, которые они получают от обычных пользователей, не являющихся козами. Это может объяснить «телепортацию», когда козлы могут дико перемещаться, когда программное обеспечение пытается определить их местоположение с помощью алгоритмов, разработанных для не-коз.
 – 
tedders
14 Ноя 2012 в 16:58
12
- источник для одного.
 – 
djechlin
15 Ноя 2012 в 00:07
59
Это урок истории, а не ответ. Даже если это пасхальное яйцо, можно ли его использовать? Пасхальное яйцо не мешает ему быть полезным, и вы не показали, полезно оно или нет.
 – 
casperOne
15 Ноя 2012 в 00:26
41
 – 
Kevin Krumwiede
21 Фев 2015 в 11:07
220
Мне жаль всех, кто нахально использовал эту функцию, ожидая, что она навсегда вернет false.
 – 
Martin Konecny
27 Апр 2015 в 08:11

Похоже, это внутренняя шутка в Google. Он также присутствует в диспетчере задач Google Chrome. У него нет никакой цели, кроме того, что некоторые инженеры находят это забавным. Что, если хотите, само по себе является целью.

  1. В Chrome откройте диспетчер задач, нажав Shift + Esc .
  2. Щелкните правой кнопкой мыши, чтобы добавить столбец Goats Teleported.
  3. Удивляться.

Существует даже огромный отчет об ошибке Chromium о слишком большом количестве телепортированных коз.

chrome

Следующий Chromium фрагмент исходного кода украден из комментариев HN.

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}
790
15 Ноя 2012 в 05:06
54
Windows XP + последняя версия Chrome = его нет, в Ubuntu я его вижу.
 – 
auselen
14 Ноя 2012 в 13:47

Дополняя @djechlin ответ (кстати, хороший ответ!), Этот вызов функции может быть также используется как фиктивный код для удержания точки останова в среде IDE, когда вы хотите остановиться на определенной итерации или конкретном рекурсивном вызове, например:

enter image description here

isUserAGoat() можно использовать вместо фиктивного объявления переменной, которое будет отображаться в среде IDE как предупреждение и, в конкретном случае Eclipse, засоряет метку точки останова, затрудняя ее включение / отключение. Если метод используется в качестве соглашения, все вызовы могут быть позже отфильтрованы каким-либо сценарием (возможно, во время фазы фиксации?).

enter image description here

Ребята из Google - активные пользователи Eclipse (они предоставляют несколько своих проектов в виде плагинов Eclipse: Android SDK, GAE и т. Д.), Поэтому ответ @djechlin и этот дополнительный ответ имеют большой смысл (по крайней мере, для меня).

306
Community 23 Май 2017 в 15:02
15
Если вы пишете «фиктивный» код просто для того, чтобы что-то быстро протестировать, в чем проблема с предупреждением Eclipse ?? Я думаю, что это действительно здорово, так как вы можете найти его, если забыли
 – 
Tomasz
1 Май 2013 в 00:16
25
Проблема в том, что в Eclipse предупреждающий знак загромождает точку останова, и вам нужно открыть представление точки останова, чтобы либо деактивировать, либо удалить его.
 – 
higuaro
9 Май 2013 в 02:18
4
Да, у меня есть решение. Вы можете щелкнуть правой кнопкой мыши значок предупреждения и выбрать «Переключить точку останова». Если следующая строка / опция включена, это означает, что точка останова создана. Я хотел сказать, что фиктивный код плохой, и это должно быть предупреждением, так что не забывайте;)
 – 
Tomasz
9 Май 2013 в 05:40
10
Проблема с этим решением заключается в том, что вы заранее знаете, где находится точка останова, поэтому простой визуальный осмотр не позволит вам узнать, что предупреждение скрывает точку останова, хотя еще лучшим решением является использование условных точек останова, с которыми вы можете Забудьте о фиктивном коде (и методах соглашений) в целом, но они различаются между IDE и не могут быть автоматически использованы на рабочих станциях.
 – 
higuaro
16 Май 2013 в 18:51

В каждой версии Android есть забавный именованный метод / константа / что угодно.

Единственное практическое применение, которое я когда-либо видел, было на конкурсе Last Call для Google I / O, где они спросили, что это было для конкретной версии, чтобы узнать, читают ли участники отчет о различиях API для каждого выпуска. У конкурса тоже были проблемы с программированием, но, как правило, некоторые мелочи, которые можно было сначала оценить автоматически, чтобы уменьшить количество представленных работ до разумных сумм, которые было бы легче проверить.

159
Lance Nanek 10 Дек 2012 в 06:46
12
«В каждой версии Android есть забавный именованный метод / константа / что угодно». Не могли бы вы назвать некоторые?
 – 
Angelo.Hannes
15 Ноя 2012 в 12:30
48
Например, есть нивел журнала с именем Log.wtf, который они называют «ужасный сбой»: P
 – 
Aracem
15 Ноя 2012 в 14:41
8
Немного похоже на Delphi EProgrammerNotFound? stackoverflow.com/questions/2084120/…
 – 
Gerry Coll
15 Ноя 2012 в 14:52
12
HoneyComb - это AdapterViewAnimator # fyiWillBeAdvancedByHostKThx ()
 – 
Lance Nanek
15 Ноя 2012 в 18:11
18
@ Angelo.Hannes, В константах датчика силы тяжести есть одна для Звезды Смерти (Звездные войны)
 – 
st0le
15 Ноя 2012 в 18:58

В области распознавания речи пользователи делятся на козлы и овцы .

Например, здесь на стр. 89 :

Овцы - это люди, для которых распознавание речи работает исключительно хорошо, а козы - это люди, для которых это работает исключительно плохо. Только распознаватель голоса знает, что их разделяет. Люди не могут предсказать, чей голос будет легко узнать, а чей нет. Лучшая политика - разработать интерфейс так, чтобы он мог обрабатывать все виды голосов в любых средах.

Возможно, в будущем планируется помечать пользователей Android как козлов, чтобы иметь возможность настраивать движок распознавания речи под нужды козлов. ;-)

150
Peter Mortensen 13 Фев 2018 в 00:16

Как API 21 (первый Android 5.0 / Lollipop SDK), это определяет, есть ли Приложение Goat Simulator установлено:

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Это должно дать понять, что предложение Джехлина об использовании эта стратегия без предупреждений if (false) потенциально губительна. То, что раньше возвращало false для каждого устройства, теперь возвращает кажущееся случайным значение: если это было достаточно глубоко закопано в вашем коде, может потребоваться много времени, чтобы выяснить, откуда появляются ваши новые ошибки. .

Итог: если вы не контролируете реализацию метода и решаете использовать его для целей, отличных от указанных в документации по API, вы столкнетесь с проблемами.

137
Mark Whitaker 20 Сен 2017 в 13:30
21
Зачем кому-то вообще запускать в производство какой-либо if(false)? Идите сюда. Если так выглядит ваш код, то это изменение реализации - наименьшая из ваших проблем.
 – 
djechlin
5 Ноя 2014 в 18:56
1
«нужна ли нам эта функция? изменяется на if (false) , проверяет функцию нет. проверяет »
 – 
user253751
25 Сен 2020 в 18:37

Google очень любит козлов и козлиных пасхальных яиц. Были даже предыдущие сообщения о переполнении стека об этом.

Как уже упоминалось в предыдущих сообщениях, он также существует в диспетчере задач Chrome (впервые появился в 2009 году):

<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
    Goats Teleported
</message>

А затем в версиях Chrome для Windows, Linux и Mac в начале 2010 г.). Количество "Телепортированных коз" на самом деле random:

 int TaskManagerModel::GetGoatsTeleported(int index) const {
     int seed = goat_salt_ * (index + 1);
     return (seed >> 16) & 255;
 }

Другие ссылки Google на коз включают:

Насколько я могу судить, самое раннее сопоставление козлов и Google относится к оригинальному сообщению в блоге «Кошение с козами».

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

132
Community 23 Май 2017 в 14:47
5
Также ходят слухи, что у ibm есть ссылки на козлов в различном внутреннем программном обеспечении.
 – 
goat
17 Сен 2014 в 08:29

Есть аналогичный вызов isUserAMonkey(), который возвращает истину, если инструмент MonkeyRunner используется. Объяснение SDK столь же любопытно, как и это.

public static boolean isUserAMonkey(){}     

Возвращает true, если в пользовательский интерфейс в настоящее время вмешивается обезьяна.

Вот источник.

Я ожидаю, что это было добавлено в ожидании нового инструмента SDK, который назвал что-то с козой и будет < em> на самом деле быть работоспособным, чтобы проверить наличие этого инструмента.

Также см. Аналогичный вопрос: Странно функция в ActivityManager: isUserAMonkey. Что это значит, какова его польза? .

114
Community 23 Май 2017 в 15:26
3
Я предполагаю, что это позволяет ActivityManager сообщать, был ли он вызван инструментом стресс-тестирования пользовательского интерфейса monkey, но я никогда этого не подтверждал.
 – 
CtrlF
28 Янв 2014 в 12:16

Веселое пасхальное яйцо.
В версии Chrome для Ubuntu в диспетчере задач ( shift + esc ), щелкнув правой кнопкой мыши, вы можете добавить научно-фантастический столбец, который в итальянской версии называется «Capre Teletrasportate». (Телепортированные козы).

Забавная теория об этом: здесь.

44
GAMITG 21 Апр 2016 в 14:38

Это не шутка изнутри

Видимо это всего лишь программа проверки приложений для Goat Simulator - от Coffee Stain Studios

Если у вас установлен Goat Simulator, вы козел. Если он у вас не установлен, вы не козел.

Я полагаю, что это был скорее личный эксперимент одного из разработчиков, скорее всего, чтобы найти людей с общими интересами.

4
Manaus 4 Дек 2019 в 13:49
16
Метод был создан до симулятора козла. Хотя он проверяет, установлено ли приложение сейчас, раньше он ничего не делал. И все равно это шутка.
 – 
Ricardo A.
4 Июн 2019 в 15:07
2
В мониторе вкладок Google Chrome была колонка с пасхальным яйцом «козы телепортировались» (а в isUserAGoat документах также упоминается телепортация козлов. Так что это определенно внутренняя шутка.
 – 
artem
17 Авг 2020 в 22:41

Я не знаю, было ли это "официальным" вариантом использования, но следующее вызывает предупреждение в Java (которое может привести к ошибкам компиляции, если они смешаны с операторами return, что приведет к недостижимому коду):

while (1 == 2) { // Note that "if" is treated differently
    System.out.println("Unreachable code");
}

Однако это законно:

while (isUserAGoat()) {
    System.out.println("Unreachable but determined at runtime, not at compile time");
}

Поэтому я часто замечаю, что пишу глупый служебный метод для наиболее быстрого способа фиксации блока кода, а затем при завершении отладки найти все его вызовы, поэтому при условии, что реализация не меняет, это можно использовать для этого.

JLS указывает if (false) не запускает «недоступный код» по той конкретной причине, что это нарушит поддержку флагов отладки, то есть в основном в этом варианте использования (h / t @auselen). (Например, static final boolean DEBUG = false;).

Я заменил while на if, создав более неясный вариант использования. Я верю , что вы можете сбить с толку свою IDE, такую ​​как Eclipse, с таким поведением, но это изменение произойдет на 4 года в будущем, и у меня нет среды Eclipse, с которой можно было бы поиграть.

1015
Peter Mortensen 13 Фев 2018 в 00:13
11
Я не знаю, только ли это для Android, в стандартном java `if (false) {...}` компилируется нормально (откройте jdk javac 1.6 и 1.7)
 – 
josefx
15 Ноя 2012 в 00:24
10
- если вы специально пытаетесь протестировать ветвь кода, где if становится ложным или истинным, это наиболее точный и очевидный способ смоделировать это - комментирование блока может быть менее точным, если вы не соответствуете правильному концу блок (возможно, вы не заметили сразу после него скрытый блок if / else), это приведет к ошибке компиляции, если вы принудительно переключитесь на следующий блок else и т. д.
 – 
djechlin
15 Ноя 2012 в 06:01
181
«при условии, что реализация не изменится» - и в этом проблема. Это катастрофический способ реализовать «if (false)» без предупреждений, потому что реализация может измениться и действительно изменится. См. Мой ответ на этот вопрос: с API21 isUserAGoat() возвращает истину, если у пользователя установлено определенное приложение. Удачи в диагностике, когда ваш код внезапно начинает вести себя странно на "случайных" устройствах!
 – 
Mark Whitaker
5 Ноя 2014 в 15:29
16
Или если козы начнут пользоваться приборами.
 – 
thedayturns
18 Фев 2016 в 04:51
12
Если козы начнут использовать устройства Android, это будет наименьшей из наших проблем.
 – 
Szymon Drosdzol
29 Фев 2016 в 16:16