Android UserManager.isUserAGoat() 的正确用例?

Proper use cases for Android UserManager.isUserAGoat()?

提问人:Ovidiu Latcu 提问时间:11/14/2012 最后编辑:Luca KiebelOvidiu Latcu 更新时间:9/25/2023 访问量:363835

问:

想改进这篇文章吗?提供此问题的详细答案,包括引文和解释为什么您的答案是正确的。没有足够细节的答案可能会被编辑或删除。

我正在查看 Android 4.2 中引入的新 API。 在查看UserManager类时,我遇到了以下方法:

public boolean isUserAGoat()

用于确定进行此调用的用户是否受到传送的影响。

返回进行此调用的用户是否为山羊。

应该如何以及何时使用?

java android 用户管理器

评论

9赞 Dorian 11/15/2012
如果可以用来避免一些 Java 警告,作为复活节彩蛋,并作为测试来查看谁阅读了 API。这是对 Chrome 中复活节彩蛋的引用。
17赞 John Isaiah Carmona 11/15/2012
这可能与谷歌在其山景城总部使用山羊作为割草机有关。
5赞 none 11/15/2012
谷歌员工似乎出于某种原因喜欢山羊,难怪他们用它制作了一个复活节彩蛋。对山羊也有一项严肃的()投资: - 正如谷歌博客中所写的那样 - 与山羊一起割草 - 山羊是 baaaahk - 并记录在 youtube 中,毕竟它们是原生的草坪搬运工,也很高效。
31赞 Fernando Gallego 3/30/2013
在第一颗死星 developer.android.com/reference/android/hardware/ 上,以及在电视节目《迷失 developer.android.com/reference/android/hardware/》的岛屿上,引力也有常数
15赞 Patrick 4/25/2016
他们甚至在 Lollipop 之后更新了文档:“从 LOLLIPOP 开始,这种方法现在可以使用先进的山羊识别技术自动识别山羊。

答:

1992赞 meh 11/14/2012 #1

Android R 更新:

在 Android R 中,此方法始终返回 false。谷歌表示,这样做是为了“保护山羊的隐私”:

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

上一个答案:

从源看,返回的方法在 API 21 中更改之前一直使用。false

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

这是来源更改

评论

116赞 tedders 11/14/2012
理论:山羊出现在各种不稳定的地方,比如陡峭的悬崖,可能与他们从普通非山羊用户那里得到的位置趋势相反。可以解释“瞬移”,这可能是山羊在软件试图用为非山羊设计的算法来确定它们的位置时,似乎在疯狂地移动。
13赞 djechlin 11/15/2012
@LarsH - 一个的来源。
63赞 casperOne 11/15/2012
这是一堂历史课,不是答案。即使它是一个复活节彩蛋,它是否有有效的用例?作为复活节彩蛋并不妨碍它有用,你也没有表明它是否有用。
48赞 Kevin Krumwiede 2/21/2015
这是一个真正的应用程序
233赞 Martin Konecny 4/27/2015
我为任何厚颜无耻地使用此功能的人感到难过,期望它永远回来。false
804赞 user479870 11/14/2012 #2

这似乎是谷歌的一个内部笑话。它也出现在 Google Chrome 任务管理器中。它没有任何目的,除了一些工程师觉得它很有趣。如果你愿意的话,这本身就是一个目的。

  1. 在 Chrome 中,使用 + 打开任务管理器。ShiftEsc
  2. 右键单击以添加列。Goats Teleported
  3. 奇迹。

甚至还有一个巨大的 Chromium 错误报告,关于太多的传送山羊

chrome

以下 Chromium 源代码片段是从 HN 注释中窃取的。

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

评论

55赞 auselen 11/14/2012
Windows XP + 最新的 Chrome = 它不存在,在 Ubuntu 上我看到了它。
1039赞 djechlin 11/14/2012 #3

我不知道这是否是“官方”用例,但以下内容会在 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 指出不会触发“无法访问的代码”,因为这会破坏对调试标志的支持,即基本上是这个用例 (h/t @auselen)。(例如)。if (false)static final boolean DEBUG = false;

我替换了 ,产生了一个更晦涩的用例。我相信你可以用这种行为绊倒你的IDE,比如Eclipse,但这个编辑是4年后的未来,我没有Eclipse环境可以玩。whileif

评论

12赞 josefx 11/15/2012
@djechlin我不知道这是否仅适用于 android,在标准 java 中 ' if(false){...}'编译得很好(打开 JDK javac 1.6 和 1.7)
11赞 djechlin 11/15/2012
@PeterOlson - 如果你专门尝试测试一个代码分支,其中 if 为 false 或 true,这是最精确和最明显的模拟方法 - 如果你与块的正确末尾不匹配,注释掉块可能会不太准确(也许你没有注意到紧随其后的谨慎的 if/else 块), 如果您强制执行以下块等,则会导致编译错误。else
201赞 Mark Whitaker 11/5/2014
“前提是实现没有改变”——这就是问题所在。这是实现无警告“if (false)”的灾难性方法,因为实现可以而且确实会发生变化。请参阅我对这个问题的回答:如果用户安装了特定应用程序,则从 API21 开始返回 true。祝你好运,当你的代码突然开始在“随机”设备上表现得很奇怪时!isUserAGoat()
22赞 thedayturns 2/18/2016
@MarkWhitaker 或者,如果山羊开始使用设备。
19赞 Szymon Drosdzol 2/29/2016
@thedayturns 如果山羊开始使用 Android 设备,这将是我们最少的问题。
164赞 Lance Nanek 11/15/2012 #4

每个版本的 Android 中都有一个有趣的命名方法/常量/whaty。

我见过的唯一实际用途是在 Last Call for Google I/O Contest 中,他们询问特定版本是什么,看看参赛者是否阅读了每个版本的 API 差异报告。比赛也有编程问题,但一般来说,一些琐事可以先自动评分,以便将提交的数量减少到更容易检查的合理数量。

评论

12赞 Angelo.Hannes 11/15/2012
“每个版本的 Android 中都有一个有趣的命名方法/常量/whaty。”你能说出一些吗?
50赞 Aracem 11/15/2012
例如,有一个名为 Log.wtf 的日志,他们称之为 What a Terrible Failure :P
8赞 Gerry Coll 11/15/2012
有点像 Delphi 的 EProgrammerNotFound?stackoverflow.com/questions/2084120/......
12赞 Lance Nanek 11/15/2012
HoneyComb 是 AdapterViewAnimator#fyiWillBeAdvancedByHostKThx()
19赞 st0le 11/15/2012
@Angelo.Hannes,在重力的传感器常数中,有一个死星(星球大战)
135赞 rickyduck 11/15/2012 #5

谷歌非常喜欢山羊和山羊的复活节彩蛋甚至之前有关于它的 Stack Overflow 帖子

正如在之前的帖子中提到的,它也存在于 Chrome 任务管理器中(它于 2009 年首次出现在野外):

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

然后在 2010 年初的 Windows、Linux 和 Mac 版本的 Chrome 中)。“山羊传送”的数量实际上是随机的:

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

谷歌对山羊的其他引用包括:

据我所知,山羊和谷歌最早的相关性属于原始的“与山羊一起割草”博客文章。

我们可以有把握地假设它只是一个复活节彩蛋,除了返回之外,没有现实世界的用途。false

评论

9赞 goat 9/17/2014
有传言称,IBM在各种内部软件中都有GOAT参考。
116赞 KDEx 11/17/2012 #6

有一个类似的调用 ,如果正在使用 MonkeyRunner 工具,则返回 true。SDK 的解释和这个一样好奇。isUserAMonkey()

public static boolean isUserAMonkey(){}     

如果用户界面当前被猴子弄乱,则返回。true

这是来源。

我希望这是在预期一个名为山羊的东西的新 SDK 工具时添加的,并且实际上将用于测试该工具的存在。

另请参阅类似的问题,ActivityManager 中的奇怪函数:isUserAMonkey。这是什么意思,它的用途是什么?

评论

4赞 CtrlF 1/28/2014
我对这个的假设是,它允许报告它是否已被 ui 压力测试工具调用,但我从未证实过这一点。ActivityManagermonkey
311赞 higuaro 11/22/2012 #7

作为对@djechlin答案的补充(顺便说一句,这是个好答案!),当您想要在某些特定迭代或特定递归调用中停止时,此函数调用还可以用作虚拟代码,以在 IDE 中保存断点,例如:

enter image description here

isUserAGoat()可以用来代替虚拟变量声明,该声明将在 IDE 中显示为警告,并且在 Eclipse 特定情况下,会阻塞断点标记,使其难以启用/禁用。如果将该方法用作约定,则以后可以由某些脚本过滤所有调用(也许在提交阶段?

enter image description here

Google 的家伙是 Eclipse 的重度用户(他们提供了几个项目作为 Eclipse 插件:Android SDK、GAE 等),所以@djechlin答案和这个补充答案很有意义(至少对我来说是这样)。

评论

15赞 Tomasz 5/1/2013
如果你只是为了快速测试某些东西而编写“虚拟”代码,那么Eclipse警告有什么问题?我认为这实际上很棒,因为如果您忘记了,您可以找到它
25赞 higuaro 5/9/2013
@Tomasz问题是,在 Eclipse 中,警告标记使断点混乱,您必须打开断点视图才能停用或删除它
4赞 Tomasz 5/9/2013
是的,我有一个解决方案。您可以右键单击警告符号,然后选择“切换断点”。如果启用了以下行/选项,则表示已创建断点。我的观点是,虚拟代码很糟糕,它应该是一个警告,所以不要忘记;)
10赞 higuaro 5/16/2013
@Tomasz 该解决方案的问题在于您事先知道断点在哪里,因此简单的目视检查不会让您知道警告隐藏了断点,但更好的解决方案是使用条件断点,使用它们,您可以完全忘记虚拟代码(和约定方法),但这些代码在 IDE 之间有所不同,并且不能在工作站之间自动共享
158赞 rainer198 5/31/2013 #8

在语音识别学科中,用户分为山羊绵羊

例如,在第 89 页

绵羊是语音识别效果特别好的人,而山羊是语音识别效果特别差的人。只有语音识别器知道是什么将它们分开。人们无法预测谁的声音会很容易被识别,谁的声音不会。最好的策略是设计界面,使其能够处理各种环境中的各种声音

也许,计划在未来将 Android 用户标记为山羊,以便能够根据山羊的需求配置语音识别引擎。;-)

49赞 j.c 2/6/2014 #9

有趣的复活节彩蛋。
在Ubuntu版本的Chrome中,在任务管理器(+)中,通过右键单击,您可以添加一个科幻列,在意大利语版本中是“Capre Teletrasportate”(传送山羊)。
shiftesc

关于它的一个有趣的理论在这里

143赞 Mark Whitaker 10/20/2014 #10

从 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");
}

这应该清楚地表明,djechlin建议将其用作无警告的建议是一种潜在的灾难性策略。以前为每个设备返回的内容现在返回一个看似随机的值:如果它被埋藏在代码中足够深,则可能需要很长时间才能弄清楚新错误的来源。if (false)false

底线:如果你不控制方法的实现,并决定将其用于 API 文档中未说明的目的,你就会遇到麻烦。

评论

23赞 djechlin 11/5/2014
为什么有人会把任何一种投入生产?来吧。如果这就是你的代码的样子,那么这种实现的改变就是你最的问题。if(false)
2赞 user253751 9/25/2020
@djechlin“我们需要这个功能吗?更改为 if(false),则测试功能没有。办理登机手续"
9赞 Empire of E 11/18/2018 #11

这不是内部笑话

显然,它只是 Goat Simulator - by Coffee Stain Studios 的应用程序检查器

如果你安装了山羊模拟器,你就是一只山羊。 如果你没有安装它,你就不是山羊。

我想这更像是其中一位开发人员的个人实验,最有可能找到有共同兴趣的人。

评论

18赞 Ricardo A. 6/4/2019
该方法是在山羊模拟器之前创建的。虽然它检查应用程序现在是否已安装,但它之前没有做任何事情。反正这是个笑话。
2赞 artem 8/18/2020
谷歌浏览器的标签显示器有一个复活节彩蛋栏“山羊传送”(文档也提到了山羊传送。所以这绝对是一个内部笑话。isUserAGoat
12赞 Nobody Tells The Truth 5/10/2022 #12

从可用性和可访问性的角度来看,了解您的用户是否是山羊非常重要。

如果山羊要真正从时代提供的所有信息中受益,他们实际上对他们的软件有非常不同的需求。

我认为一些善良的开发人员关心我们所有人的用户,而不仅仅是那些时尚的用户,这真是太好了。