为什么PackageInfo.signatures字段是一个数组,什么时候除了一个值之外还有什么?

时间:2012-11-29 03:19:27

标签: java android

我正在检查彼此的包签名,以确定它们是否不兼容(针对不同的密钥库进行编译)。我注意到PackageInfo.signatures几乎总是包含单个条目的集合,这对我来说很有意义。我使用调试或生产密钥库构建我的应用程序,这确定了包的签名(这是我对此处的apk签名过程的简单理解)。我知道如果我没有特别要求提供这些信息(通过传递PackageManager.GET_SIGNATURES标志),这将是null,但我不太了解会有不止一个的情况。

我写了一些调试代码并在我的个人Android手机上运行它。在我的手机上安装的300多个软件包中,除了一些似乎来自我的服务提供商(com.verizon。*名称空间)的软件包外,一切都只有一个签名。

我觉得我的用例(包管理)认为应用程序包只有一个签名是可以接受的,但我想确保我没有遗漏可能引入边缘案例错误的东西。

1 个答案:

答案 0 :(得分:14)

出于您的目的,假设Android应用程序具有单个签名似乎完全可以接受。 Android APK 可以使用多个签名进行编译,但既不推荐也不进行广泛测试。 (为什么Verizon会这样做?谁知道呢。)

我从this archive找到了Dianne Hackborn,这是Android开发的首席女士:

  

:我知道jar签名者在一个jar文件中支持多个签名。如果APK文件有两个有效签名,这是否意味着此APK可以访问签名者提供的签名级别权​​限?

     

A :从理论上讲,有些事情是通过多个签名完成的,但没有人会这样做过   使用它,所以它可能不起作用。这也有副作用(如果它   将两个签名别名化为相同的东西,因为它们   可能来自同一所有者,这可能不是你想要的。

来自Dianne的

Another bit(注意使用“it”,而不是“他们”和“证书”而不是“证书”):

  

:PackageInfo.signatures:它返回什么内容?

     

A :这是用于签署.apk的证书。

然而。值得注意的是,我在Android源代码Git中找到了多个签名的测试参考:Test for Checking Package Signatures (Bug 4596332)。此外,Android BackupManagerService code(和other Android source code)可确保检查多个签名。

因此,我的结论是:您不必担心多个签名,除非您在特定包的安全性和编译很重要的情况下进行编码。 (但是,如果必要的话,似乎你也不会有很多问题需要容纳多个签名。)

希望至少在某种程度上令人满意。