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

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

  public boolean isUserAGoat() 

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

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

如何以及何时应该使用?

从它们的源代码中 ,用于返回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"); } 

这里是源代码链接

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

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

不过这是合法的:

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

所以我经常发现自己写了一个愚蠢的实用方法,以最快的方式去伪造一个代码块,然后在完成debugging的时候find所有对它的调用,所以只要实现不改变,就可以使用它。

JLS指出, if (false)不会触发“无法访问的代码”的原因,这将打破支持debugging标志,即基本上这个用例(h / t @auselen)。 ( static final boolean DEBUG = false;例如)。 我换了ifwhile if产生一个更隐晦的用例。 我相信你可以通过这种行为来改变你的IDE,比如Eclipse,但是这个编辑是未来4年,我没有Eclipse环境来玩。

这似乎是Google的一个笑话。 它也在Google Chrome任务pipe理器中显示。 除了一些工程师觉得有趣外,没有任何目的。 如果你愿意,这本身就是一个目的。

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

甚至还有一个关于太多传送山羊的铬报告。

铬

下面的Chromium 源代码片段是从HN注释中被盗取的。

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

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

在这里输入图像说明

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

在这里输入图像说明

Google的工作人员是很多Eclipse用户(他们提供了几个Eclipse插件:Android SDK,GAE等),所以@djechlin的答案和这个互补的答案很有意义(至less对我而言)。

有一个有趣的命名方法/常量/无论在每个版本的Android。

我见过的唯一实际用途是在最后一次Google I / O竞赛中,他们询问了特定版本的内容,看看参赛者是否阅读每个版本的API差异报告。 比赛也有编程上的问题,但一般来说,一些琐事可以自动分级,以提交的数量下降到合理的数量,这将更容易检查。

Google非常喜欢山羊和山羊复活节彩蛋 。 甚至有关于它的以前的堆栈溢出的post 。

正如之前的文章中提到的,它也存在于Chrome任务pipe理器( 它在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; } 

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

  • 用山羊割草
  • 山羊是baaaahk

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

我们可以有把握地认为,这只是一个复活节彩蛋,没有现实世界的使用,除了返回false

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

例如在第89页

羊是语音识别工作得非常好的人,山羊是其工作特别差的人。 只有语音识别器知道什么将它们分开。 人们无法预测谁的声音会被轻易识别,谁的声音不会被识别。 最好的策略是devise界面,以便处理各种环境中的各种声音

也许,计划在将来将Android用户标记为山羊,以便能够为山羊的需求configuration语音识别引擎。 😉

从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)是一个潜在的灾难性策略, djechlin的build议是将其作为一个无警告的使用。 之前为每个设备返回false的返回值都是一个看似随机的值:如果这个代码被深埋在你的代码中,可能需要长时间才能确定你的新bug是从哪里来的。

底线:如果您不控制方法的实施,并决定将其用于API文档中所述以外的目的,那么您就会遇到麻烦。

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

 public static boolean isUserAMonkey(){} 

如果用户界面当前正被猴子混淆,则返回true

这是来源。

我希望这是为了增加一个新的SDK工具,名字叫做山羊,并且实际上可以用来testing这个工具的存在。

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

在这里输入图像说明

在这个星球上最偏远的山区,有一种先进的山羊品种,就像我们人类一样,似乎目前能够使用手机!

泄漏的镜头: youtu.be/YJwZMUn7GdQ

在这里输入图像说明

谷歌一定已经发现了这一点,并决定为他们提供支持,试图留在技术进步的前沿。

有趣的复活节彩蛋。
在Ubuntu版本的Chrome中,在任务pipe理器( shift + esc )中,右键单击可以添加一个意大利语版本为“Capre Teletrasportate”(Teleported Goats)的科幻列。

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