为什么 PackageInfo.signatures 字段是一个数组,什么时候这里会出现除一个值之外的其他值?

2024-05-04

我正在相互检查包签名以确定它们是否不兼容(针对不同的密钥库进行编译)。我注意到PackageInfo.signatures几乎总是包含单个条目的集合,这对我来说很有意义。我使用调试或生产密钥库构建应用程序,这决定了包的签名(这是我此时对 apk 签名过程的简单理解)。我知道如果我不专门询问此信息(通过传递PackageManager.GET_SIGNATURES标志),但我不太明白其中会有多个的情况。

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

我觉得对于我的用例(包管理)来说,考虑应用程序包将具有单个签名是可以接受的,但我想确保我不会错过可能引入边缘情况错误的东西。


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

I found 这个档案 http://www.mail-archive.com/android-security-discuss@googlegroups.com/msg00131.html from 黛安·哈克伯恩 https://plus.google.com/105051985738280261832/posts,Android 开发的首选女士:

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

A:理论上,某件事是通过多个签名完成的,但没有人曾经这样做过 用过这个,所以它可能不起作用。这也有副作用(如果 确实有效)将两个签名别名为同一事物,因为它们 大概来自同一个所有者,这可能不是您想要的。

再来一点 https://groups.google.com/forum/?fromgroups=#!topic/android-platform/2CBVZONdktw来自 Dianne(请注意使用“it”,而不是“they”,以及“certificate”而不是“certificates”):

Q:PackageInfo.signatures:它返回什么?

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

然而。值得注意的是,我在Android源码Git中找到了多重签名的测试参考:检查包签名的测试(错误 4596332) https://android.googlesource.com/platform/cts/+/9803e0f8e364fa919dc942643de13652add52e9f%5E!。此外,Android BackupManagerService code http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/com/android/server/BackupManagerService.java#2683 (and 其他Android源代码 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/com/android/server/BackupManagerService.java#3984)确保它检查多个签名。

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

希望这至少是令人满意的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 PackageInfo.signatures 字段是一个数组,什么时候这里会出现除一个值之外的其他值? 的相关文章

  • Python Kivy - 在本机网络浏览器中打开 url 的应用程序

    我尝试制作一个简单的应用程序 在单击 Screen One 上的按钮后 在 Kivy 中打开一个网页 我使用了这个主题 Python 在应用程序中直接显示网络浏览器 iframe https stackoverflow com questi
  • 当参数具有默认值时,为什么无法使用导航组件将参数传递给片段?

    我正在使用导航组件 但我不明白为什么如果定义了参数 则将参数传递给下面的方法时会出现错误 我正在使用 SafeArgs 只有当我为此参数定义默认值时才会出现此错误 有人可以解释一下为什么会发生这种情况以及如何解决它吗 这是导航图的部分代码
  • Facebook LoginActivity 未正确显示

    我有一个使用 Facebook 登录的应用程序 我有 FacebookSDK 并且使用 com facebook LoginActivity 问题是 在 10 英寸平板电脑上 当显示软键盘时 活动无法正确显示 我使用的是 Samsung G
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • 手动启用时 Firebase Crashlytics 不报告崩溃

    Crashlytics 在没有选择加入报告的情况下也能正常工作 但一旦我根据规定设置了选择加入报告 它就会停止报告任何内容tutorial https firebase google com docs crashlytics customi
  • Android:如何监控WiFi信号强度

    当信号强度发生变化时我会收到通知 我尝试创建以下方法并在 onCreate 中调用它 private void initializeWiFiListener Log i TAG executing initializeWiFiListene
  • 模拟器:进程已完成,退出代码为 134(被信号 6:SIGABRT 中断)

    我最近刚刚开始在 Mac 上下载 Android Studio 版本 3 0 1 但收到以下错误 模拟器 进程已完成 退出代码为 134 被信号 6 SIGABRT 中断 我按照 Android Studio 教程操作并能够运行模拟器 但在
  • 如何在android中录制音频时暂停背景音乐

    我正在 Android 中开发一个音频记录应用程序 因此 如果设备音乐播放器中已播放任何背景音乐 则应在开始录制之前暂停该背景音乐 并且每当录制停止或暂停时 背景音乐都应恢复 播放录制的音频时也应该如此 有人可以帮我解决这个问题吗 提前致谢
  • 无法在 Android 模拟器中安装 apk

    我正在尝试通过 adb shell 在 ICS 模拟器中安装 apk 从一个站点下载 但出现以下错误 失败 INSTALL FAILED UID CHANGED 可能是什么问题 只需 rm r 有问题的数据目录即可 如果您在安装时遇到此错误
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 如何在新标签 android webview 中打开链接? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经使用 webview 创建了一个 android 应用程序来显示我的网站 我什至想添加在新选项卡中打开链接的功能 但我找不到任何
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • Android:如何通过右侧的十字按钮清除EditText

    我创建了一个EditText用于搜索 左侧包含搜索图标 右侧包含图标
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • gradle-experimental:0.1.0 buildConfigField

    谁知道怎么定义buildConfigField在实验性的 gradle 插件中 android productFlavors create demo applicationId com anthonymandra rawdroid buil
  • 基于BluetoothChat示例通过蓝牙套接字发送文件

    大家好 根据我之前问的一个问题 我已经能够将文件转换为其他字节数组 以便使用以下写入方法 public void sendFile Log d TAG sending data InputStream inputStream null Ur
  • Amazon IAP 不会调用 onPurchaseResponse

    我有一个 Android 应用程序 它使用 IAP 我正在发送PurchasingManager initiateGetUserIdRequest 并得到用户识别成功 in onGetUserIdResponse 得到回复后Purchasi
  • 使用支持库中的 BottomSheet 时如何调暗背景?

    怎样才能让背景像显示的那样变暗here https material design storage googleapis com publish material v 8 material ext publish 0Bzhp5Z4wHba3
  • 在 Android 中更新到 API 26 时,清单合并失败并出现多个错误

    我尝试使用 API 26 更新我的 gradle 安卓工作室2 3 3 但我在编译项目时遇到以下错误 这是我收到的错误的屏幕截图 应用级别build gradle Top level build file where you can add

随机推荐