将我的 android 应用程序签名为系统应用程序
Posted
技术标签:
【中文标题】将我的 android 应用程序签名为系统应用程序【英文标题】:Signing my android application as system app 【发布时间】:2016-10-01 20:38:28 【问题描述】:在我的公司,我们希望完全控制现场的电池消耗,仅使用 2g 和 gps 可能会非常快地耗尽电池。我们决定的是我们需要对手机进行root访问,这样当手机空闲时,我们会关闭那些不必要的电池消耗。 而且我们也不允许用户卸载它并清除它的数据。
我的问题是:
-
我从哪里获得这些签名密钥?
如果我成功地做到了,它会喜欢 root 访问吗?
签字?
Root 与 Signed with key 有什么区别?
【问题讨论】:
如果您从项目的源代码构建 android,您只能像系统应用程序一样签署您的应用程序。 @VíctorSantoja 我怀疑这是唯一可能的方法,我整个星期都在寻找这些问题,但我发现很有趣。我认为我们可以通过制造商密钥进行签名。 http://***.com/a/15655078/3974048 我知道,如果您使用 de 制造商密钥签署 apk 是可能的,但您不能在 Google Play 中发布此 apk @VíctorSantoja 为什么不呢?它是相同的 apk,但签名的密钥不同,我只是根据不同的制造商添加应用程序(如果我错了,请纠正我)。反正我怎么问华硕制造商。我一直在他们的网站上,不能发帖。但我现在给他们发邮件 AOSP 签名密钥在 Play 商店 FWIK 中被阻止。因此,如果您使用该密钥签署您的应用程序,它将不会在 Play 商店中发布。 【参考方案1】:下面是你的答案,
您可以从以下位置找到平台密钥 HERE。签署 apk 的命令(适用于 linux)是:
java -jar signapk.jar -w platform.x509.pem platform.pk8 APPLICATION.apk APPLICATION_sign.apk
需要提供更高版本的Android 10 lib64库路径可以在android/out/host/linux-x86
找到生成成功构建后,可以复制文件夹或简单地提供其路径以生成签名APK
java -Djava.library.path="<path to lib64>" -jar signapk.jar -w platform.x509.pem platform.pk8
如果您使用平台密钥签署您的 apk,您将不需要 root 访问权限,您可以简单地从“adb install”命令安装它,是的,在某种程度上它就像 root 一样,因为它可以访问所有内部 api,但请记住如果你的应用是系统签名的,那么你就不能写外部存储。
首先不要将两者结合起来 root 是用户,其中系统应用程序是应用程序类型,与下面链接的普通应用程序区分开来可能会消除您对此的困惑。
what-is-the-difference-between-android-user-app-with-root-access-and-a-system-ap
【讨论】:
我真的不能写外部存储吗?这是正确的吗? 如果您制作系统应用程序,或者我们可以说您使用平台证书签名,那么您不能写入外部存储。 谢谢你的回答,兄弟,我的大脑是如此的缺席,答案是正确的。 @NguyễnHoàng 为了简单起见,请将证书(.pem 和 .pk8)和 signapk.jar 放在同一个文件夹/目录中,您也可以将您的 APK 放在同一个文件夹/目录中并转到终端/comman-prompt 中的文件夹/目录路径并执行命令,但请注意您需要配置 java 路径 我们是否需要在 linux 或 windows 上安装任何运行时才能运行此命令。上面的命令给了我错误Failed to load any of the given libraries: [conscrypt_openjdk_jni windows-x86_64, conscrypt_openjdk_jni]
【参考方案2】:
回答你的三个问题:
1 - 我从哪里获得这些签名密钥?
来自释放密钥部分中的Android's own documentation
Android 树包含下面的测试键 构建/目标/产品/安全
但下一部分是你真正应该注意的地方
由于测试密钥是公开的,任何人都可以自己签名 .apk 文件具有相同的密钥,这可能允许它们替换或 劫持您的操作系统映像中内置的系统应用。为此,它是 对于签署任何公开发布或部署的 Android 操作系统映像至关重要 带有一组特殊的释放键,只有您可以访问。
所以基本上除非你能以某种方式访问制造商的 pvt 密钥,否则可能很难实现这一点。这就是为什么用户在之前的评论中说这通常是通过生成自己的构建来实现的。
2 - 如果我成功管理,它会喜欢 root 访问吗 要签名吗?
这样做您不会获得“root 访问权限”,但您将获得极高级别的访问权限。具体来说,这为您带来的好处是,您将被授予声明 android:protectionLevel="signature"
的权限,这可以说是最独特的。
另一个危险的后果(或有趣,取决于你如何看待它)是你现在可以在系统用户进程android:sharedUserId="android.uid.system"
下运行你的应用程序 - 在 android 的“进程沙盒”安全规则下,这通常会失败。
3 - Root 与 Signed with key 有什么区别?
通过使用构建中的平台密钥签名的应用,您可以获得上述权限,或者使用 UID 1000(系统 uid)运行您的应用,这在 android 中比其他应用的 UID 更强大,因为它可以请求的权限,但这是 Android 特有的行为。 在 root 设备中,您可以使用在基于 linux 的系统中具有最广泛访问权限的 UID 0(root),您可以绕过操作系统上的大多数安全沙盒/检查/栅栏。
希望这会有所帮助;)
【讨论】:
我使用上述命令将我的应用程序作为系统应用程序。在您的第一点中,您提出了一个非常有效的观点“任何人都可以使用相同的密钥签署他们自己的 .apk 文件,这可能允许他们替换或劫持您的操作系统映像中内置的系统应用程序”。我该如何克服这个你确实提到了一种方法,但我无法使用一组特殊的发布密钥签署已部署的操作系统。在此先感谢,我知道这是一个旧答案,但如果您解释或提供有关问题的任何链接,我将不胜感激。 @HassanMunir 没问题,重点是分享知识。要回答您的问题,这取决于您究竟想要实现什么,以及您作为开发人员的地位:1-您是从 AOSP 或其他一些 Android 项目的代码构建自己的 android 的人。 2-您是通过某种方式(root 或其他方式)可以写入 /system 分区的人吗 3-您是为公众制作应用程序的“普通”开发人员 @david 随着越来越多的人继续关注您的问题,请务必注意,已接受的答案非常危险,因为您可以在我的答案中读到(直接引用自 Google Docs) - 我相信这一点应标记为正确答案 我看到这个答案是正确的,它不在顶部看起来很奇怪。 @UtkinAnton 确实是这样,无论如何请赞成它x'D 接受的答案建议使用一组公开的密钥......用它签署任何ROM的后果......我只是无话可说。【参考方案3】:对于提出这个问题的任何人,即使在阅读 cmets 后仍无法使其工作,这可能是因为缺少一些东西(特别是如果出现 OPENSSL 错误),这就是您需要的一切。
使用来自 AOSP 的测试密钥为 APK 签名
-
git clone https://android.googlesource.com/platform/prebuilts/sdk.git - 注意它大约 6GB,或者你可以下载你需要的东西,
signapk.jar
文件和库。
从https://github.com/aosp-mirror/platform_build/tree/master/target/product/security下载platform.x509.pem
和platform.pk8
(或者自己获取图片对应的密钥)
安装 java 后,将以下命令更改为文件的正确路径、刚刚克隆的 sdk 中的 lib64、signapk.jar 文件、平台密钥文件和要签名的 apk
java -Xmx2048m -Djava.library.path="~/../sdk/tools/linux/lib64" \ # In the cloned sdk
-jar ~/../sdk/tools/lib/signapk.jar \ # In the cloned sdk
platform.x509.pem platform.pk8 \ # The keys for signing (from step 2)
app-prod-release.apk release.apk # The app to sign and the signed app
【讨论】:
是否有必要添加一些固定的包名称我猜我的密钥不匹配并且我无法安装 apk 包 com.app.cameradata 没有与共享用户 android.uid 中的签名匹配的签名。系统;以上是关于将我的 android 应用程序签名为系统应用程序的主要内容,如果未能解决你的问题,请参考以下文章