【问题标题】:Which properties of android.os.Build are fixed?android.os.Build 的哪些属性是固定的?
【发布时间】:2012-10-27 08:58:16
【问题描述】:

我需要android.os.Build 类的固定属性列表。我从here 获得了列表,我将那些我知道已修复的内容加粗。通过修复,我的意思是固件更新,重置工厂,......

  1. android.os.Build.VERSION.RELEASE //当前开发 代号,如果这是发布版本,则为字符串“REL”。

  2. android.os.Build.BOARD //底层板的名称,如“goldfish”。

  3. android.os.Build.BOOTLOADER // 系统引导加载程序 版本号。

  4. android.os.Build.BRAND //软件定制的品牌(例如运营商),如果有的话。

  5. android.os.Build.CPU_ABI //native code的指令集名称(CPU类型+ABI约定)。

  6. android.os.Build.CPU_ABI2 //native code的第二个指令集(CPU类型+ABI约定)的名称。

  7. android.os.Build.DEVICE // 工业设计的名称。

  8. android.os.Build.DISPLAY //用于向用户显示的构建 ID 字符串

  9. android.os.Build.FINGERPRINT //唯一的字符串 标识此构建。

  10. android.os.Build.HARDWARE //硬件的名称(来自内核命令行或/proc)。

  11. android.os.Build.HOST

  12. android.os.Build.ID //无论是变更列表编号, 或类似“M4-rc20”的标签。

  13. android.os.Build.MANUFACTURER //产品/硬件的制造商。

  14. android.os.Build.MODEL //最终产品的最终用户可见名称。

  15. android.os.Build.PRODUCT //整体产品的名称。

  16. android.os.Build.TAGS //逗号分隔的标签 描述构建,例如“未签名,调试”。

  17. android.os.Build.TYPE //构建的类型,比如 “用户”或“英语”。

  18. android.os.Build.USER

请帮我完成清单

【问题讨论】:

  • 你的目标是什么?尝试唯一标识用户?
  • 是的,没错,而且我知道Android ID不保证唯一,所以我想混合Build的固定属性

标签: android build uniqueidentifier


【解决方案1】:

如果您查看the source code to Build,您会看到所有这些值(包括您拥有的粗体值)都来自系统属性文件。因此,这些值中的任何一个都可以由 ROM 修改者或原始设备制造商根据他们认为合适的方式进行修改。

【讨论】:

  • 您的注释是正确的,但其中应该有一些像模型一样在逻辑上保持固定,即使在固件更新时也没有公司会改变它
  • @MohsenAfshin:所以?设备制造商的行为并不总是合乎逻辑的。例如,MODEL 可能不会因为制造商在商标侵权诉讼中败诉而保持不变。你说你想要“100% 正确的答案”,但除了“任何属性都可以改变”之外,没有其他答案。假设其他任何事情都是纯粹的猜测,有时可能是错误的。
【解决方案2】:

我不会用 Build 的一致性来解决问题,因为 Mark 已经说明了为什么没有保证的答案。相反,我想回应您的目的和意图。

如果我理解正确,您正在尝试唯一标识单个设备。我首先将您指向this answer,您可以从中简单地得出结论,通用解决方案是不可能的。重置出厂默认设置或切换 SIM 卡(如果设备有)都会更改任何类型的唯一 ID,并让您的应用误以为它是不同的用户。

您需要重新考虑您要完成的工作。为什么需要唯一标识一个设备?如果您尝试识别用户,那么这种思维方式也不适用于多种设备。现在在 Jellybean 4.2 中尤其如此,其中一个设备可能支持多个用户。另见this insightful blog post on the Android Developers Blog

您可以让用户附加他的 Google 帐户吗?还是说明您自己的服务?如果您可以识别用户,那么通过UUID.randomUUID() 识别单个设备就很简单了。

【讨论】:

  • 你说的都是真的,但我不能依赖谷歌账户,因为不是每个人都可以在他/她的安卓设备上设置谷歌账户,而且 4.2 的多用户功能也不是问题,我需要混合几乎独特的 Build 属性,你知道我希望它们尽可能地被修复,即使 Mark 说它们都可以改变
  • 我建议生成一个 UUID 并将其存储在 SharedPreferences 中。您也可以考虑将其存储在外部存储上,但我建议您不要这样做,因为它会污染存储卡,在没有外部存储可用时不起作用,无法处理切换 SD 卡并且可能会被操纵由用户。
  • 我希望唯一 ID 能够在设备上重新生成,首先这是我寻找固定属性的原因,这样我就不会每次都获得新 ID跨度>
  • 我过去曾为客户详细研究过这一点,唯一的方法(在无根设备上)是将 UUID 存储在外部存储和共享首选项中。如果共享偏好 ID 不存在,则它会从外部存储中读取该 ID,以应对不可用的存储卡、切换 SD 卡或用户操作。恐怕根本没有不同的解决方案。
【解决方案3】:

如果我理解正确(关于您的后续评论),您希望在不集成某种注册或登录机制的情况下识别设备。

我建议不要实现你自己的 ID 计算算法,而是使用适用于 android 的 OpenUDID 实现(请参阅https://github.com/vieux/OpenUDID)。

【讨论】:

  • 这个 OpenUDID 只不过是检查 Android_ID,如果不是全部,它会生成一个随机的( OpenUDID = new BigInteger(64, random).toString(16); )。我们知道 Android_ID 不稳定,以及这个 RANDOM 数字是如何在设备上持久存在并能够从头开始重新生成的???!!!
  • 是的,会检查 ANDROID_ID 并生成一个随机 ID 作为后备。派生的 ID 存储在私有 SharedPreferences 中,并在所有使用 OpenUDID 的应用程序之间同步(本机 ANDROID_ID 也将在所有应用程序之间共享)。然而,如果所有使用 OpenUDID 的应用程序都被卸载,那么如果必须使用回退机制,则要重新安装的第一个应用程序会获得一个新 ID。此外,该 ID 将无法在出厂重置后继续存在,但我认为作为用户的功能不希望在出厂重置后保留与他自己或他的帐户相关的任何内容,例如出售设备。
  • 由于 id 用于软件的唯一安装,因此它必须是唯一的,并且即使在恢复出厂设置后也可以重新生成
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
相关资源
最近更新 更多