适用于AndroidUserManager.isUserAGoat()的正确用例?

我正在查看android4.2中引入的新API。在查看#0类时,我遇到了以下方法:

public boolean isUserAGoat()

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

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

应该如何以及何时使用?

353542 次浏览

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

以前的答复:

从它们的开始,该方法用于返回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");}

这里是来源改变

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

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

甚至有一个巨大的Chromiumbug报告传送山羊太多了

chrome

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

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

我不知道这是否是“官方”用例,但以下内容会在Java中产生警告(如果与return语句混合,可能会进一步产生编译错误,导致无法访问代码):

while (1 == 2) { // Note that "if" is treated differentlySystem.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环境可以玩。

在每个版本的Android中都有一个有趣的命名方法/常量/任何东西。

我见过的唯一实际用途是在最后一次调用谷歌I/O竞赛中,他们询问特定版本的内容,看看参赛者是否阅读每个版本的API差异报告。比赛也有编程问题,但通常一些琐事可以首先自动评分,以将提交的数量降至合理的数量,这样更容易检查。

谷歌非常喜欢山羊和基于山羊的复活节彩蛋。甚至有关于Stack Overflow的文章

正如历史发文所提到的,它也存在于Chrome任务管理器(它于2009年首次出现在野外)中:

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

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

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

其他Google对山羊的引用包括:

据我所知,山羊和谷歌最早的关联属于原始的“用山羊割草”博客文章。

我们可以安全地假设它只是一个复活节彩蛋,除了返回false之外,没有任何实际用途。

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

public static boolean isUserAMonkey(){}

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

这里是来源。

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

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

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

输入图片描述

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

输入图片描述

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

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

例如,这里在第89页

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

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

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

一个有趣的理论是这里

截至API 21(第一个Android 5.0/Lollipop SDK),这会检测山羊模拟器应用程序是否已安装:

/*** 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)djechlin的建议是一个潜在的灾难性策略。以前为每个设备返回false的东西现在返回一个看似随机的值:如果它在你的代码中埋得足够深,它可能需要长期时间来弄清楚你的新错误来自哪里。

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

这可不是什么内部笑话

显然它只是一个应用程序检查器山羊模拟器-咖啡污渍工作室

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

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

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

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

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