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


我正在研究引入的新API Android 4.2。 一边看着 UserManager 我遇到过以下方法:

 public boolean isUserAGoat()

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

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

应该如何以及何时使用?


3144
2017-11-14 08:34


起源


另见IBinder上的LIKE_TRANSACTION和TWEET_TRANSACTION developer.android.com/reference/android/os/...  developer.android.com/reference/android/os/... - auselen
顺便提一下,Chrome还有一个“Goats Teleported”内部统计数据。据推测,它是内存管理技术的某种内部名称。 - Eric Martindale
变化的来源: https://android.googlesource.com/platform/frameworks/base/+/e4ab16ad98b183afbf7a21ad7314372de41a8b57%5E! - kennytm
@djechlin也许这是合法的,但是OP应该接受user1597833的答案,引用来源和成群结队应该继续前进。像这样的问题获得如此大的牵引力是荒谬的。问这个问题并让它保持开放似乎是不诚实的。 - swasheck
这是一个错误。始终返回false :( healthyhomesteading.com/wp-content/uploads/2011/05/goat.jpg - Thomas


答案:


从他们的 资源,用于返回的方法 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");
}

这里是 来源链接


1514
2017-11-14 08:40



我们有猴子, developer.android.com/reference/android/app/... - auselen
理论:山羊存在于各种不稳定的地方,如陡峭的悬崖,可能会使他们从常规的非山羊使用者那里获得位置趋势。可能会解释“远程传送”,当软件试图通过为非山羊设计的算法来确定它们的位置时,可能会出现大量重新定位的山羊。 - tedders
#define false random() % 2 但这不是Java ...... - ppalasek
这是历史课,而不是答案。即使它是复活节彩蛋,它是否有一个有效的用例?作为一个复活节彩蛋并不排除它有用,你没有证明它是否有用。 - casperOne
对于那些喜欢使用这个功能,期待它返回的人,我感觉很糟糕 false 永远。 - Martin Konecny


我不知道这是否是“官方用例”,但以下内容会在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环境可以使用。


917
2017-11-14 14:47



你试过if(false){statement;}吗? - penguat
if(Boolean.FALSE){...}通常似乎有效。 - Guerrero
@djechlin我不知道这是否只是android,在标准的java`if(false){...}`编译得很好(打开jdk javac 1.6和1.7) - josefx
@PeterOlson - 如果你是专门尝试测试一个if为false或者true的代码分支,这是模拟它的最精确和最明显的方法 - 如果你不匹配,那么注释掉块可能不太准确块的结尾(也许您没有注意到紧跟if / else块后立即跟踪),如果你强制执行以下操作,将导致编译错误 else块等 - djechlin
“只要实施不改变”  - 而且有问题。这是实现无警告“if(false)”的灾难性方法,因为实现可以而且确实会发生变化。请参阅我对这个问题的回答:截至API21 isUserAGoat() 如果用户安装了特定应用程序,则返回true。祝你好运,当你的代码突然开始在“随机”设备上表现奇怪时! - Mark Whitaker


这似乎是谷歌内心的笑话。它也是谷歌Chrome任务管理器中的特色。除了一些工程师认为有趣之外,它没有任何意义。如果你愿意的话,这本身就是一个目的。

  1. 在Chrome中,打开任务管理器 转移+退出
  2. 右键单击添加 Goats Teleported 柱。
  3. 奇迹。

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

chrome 

以下Chromium 源代码片段 被盗了 HN 注释。

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

706
2017-11-14 09:03



我没有它,你在哪里点击右键?或它用于什么 - auselen
@auselen您必须右键单击列标题才能看到下拉菜单以添加Goats Teleported列(至少在OS X上Chrome的工作原理)。 cl.ly/Ksbd - greenie
Windows XP +最新的Chrome =它不存在,在Ubuntu上我看到了它。 - auselen
运行Chrome最新版本的Windows 7也没有显示它。 :/ - Isuru
内部笑话很可能源于此: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html - CupOfTea696


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

enter image description here

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

enter image description here

谷歌人是沉重的Eclipse用户(他们提供了几个项目作为Eclipse插件:Android SDK,GAE等),所以@djechlin答案和这个补充答案很有意义(至少对我而言)。


258
2017-11-21 16:55



如果你正在编写“虚拟”代码只是为了快速测试一些东西,那么Eclipse警告的问题是什么?我认为这真的很棒,因为你可以在忘记的情况下找到它 - Tomasz
@Tomasz问题是,在Eclipse中,警告标记使断点混乱,您必须打开断点视图才能停用或删除它 - higuaro
是的,我有一个解决方案。您可以右键单击警告符号并选择“切换断点”。如果启用以下行/选项,则表示创建了断点。我的观点是,虚拟代码很糟糕,它应该是一个警告,所以你不要忘记;) - Tomasz
@Tomasz该解决方案的问题在于您事先已知道断点所在的位置,因此简单的视觉检查不会让您知道警告隐藏了断点,但更好的解决方案是使用条件断点,使用它们您可以完全忘记虚拟代码(和约定方法),但这些在IDE之间有所不同,并且不能在工作站之间自动共享 - higuaro
为什么不使用null语句 ;?我的意思是,山羊显然更好,但已经有一个简单的方法 - Chris M.


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

我见过的唯一实际用途是在Last Call for Google I / O. 比赛他们询问特定版本的内容,看看参赛者是否阅读了每个版本的API差异报告。比赛也存在编程问题,但通常会有一些可以自动评分的琐事,以便将提交的数量降低到合理的数量,这样更容易检查。


122
2017-11-14 17:26



“每个版本的Android都有一个有趣的命名方法/常量/任何东西。”你能说出一些名字吗? - Angelo.Hannes
例如,有一个名为Log.wtf的日志,他们称之为“可怕的失败:P” - Aracem
有点像Delphi的EProgrammerNotFound? stackoverflow.com/questions/2084120/... - Gerry Coll
HoneyComb是AdapterViewAnimator#fyiWillBeAdvancedByHostKThx() - Lance Nanek
@ Angelo.Hannes,在传感器重力常数中有一个用于死星(星球大战) - st0le


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

例如,这里 在第89页

绵羊是语音识别非常好的人,山羊是非常糟糕的人。只有语音识别器知道它们之间的区别。人们无法预测谁的声音将被轻易识别,谁的声音不会被识别。最好的策略是设计界面,以便它可以处理各种环境中的各种声音

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


110
2018-05-31 09:33





谷歌非常喜欢山羊和山羊 复活节彩蛋。甚至有过 之前的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


104
2017-11-15 10:33



据传,ibm还有各种内部软件的山羊参考资料。 - goat


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

这应该清楚表明 djechlin的建议 使用它作为一个无警告 if (false) 是一个潜在的灾难性策略。之前返回的内容 false 对于每个设备现在返回一个看似随机的值:如果这在你的代码中埋得足够深,它可能需要一个  是时候弄清楚你的新虫来自哪里了。

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


101
2017-10-20 10:00



为什么有人会放任何一种 if(false) 在生产?来这里。如果这就是你的代码的样子,那么这个实现的变化就是 最小 你的问题。 - djechlin
那么,根据实际的API文档(用户远程传送趋势),我认为使用它总是返回false是真的 只要 遵循合同的方式。不过,你提出了一个很好的观点。 - codebreaker
山羊模拟器在谷歌播放看起来很棒 play.google.com/store/apps/...。知道从山羊身上获得什么会很好。 - cowls


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

public static boolean isUserAMonkey(){}     

返回 true 如果用户界面当前正被猴子搞砸了。

这里是来源。

我希望这是为了期待一个新的增加 SDK 用山羊命名的工具和意志 其实 可用于测试该工具的存在。

另见类似问题, ActivityManager中的奇怪函数:isUserAMonkey。这意味着什么,它的用途是什么?


94
2017-11-16 21:33



我对这个的假设是允许的 ActivityManager 报告是否已被调用 monkey ui压力测试工具,但我从未证实这一点。 - CtrlF


enter image description here

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

泄露的镜头: youtu.be/YJwZMUn7GdQ 

enter image description here

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


51
2017-09-30 14:00



这叫做AppCompat。 - silentsudo
最好的答案 - Benobab
山羊隐私?任何人? - Ohad Cohen


有趣的复活节彩蛋
  在Ubuntu版Chrome中,在任务管理器中(转移+退出),右键单击即可添加意大利语版本为“Capre Teletrasportate”(Teleported Goats)的科幻专栏。

一个有趣的理论是 这里


30
2018-02-06 10:35