将我的Android应用程序签名为系统应用程序

21

在我的公司中,我们希望能够在现场完全控制电池消耗,只使用2G和GPS会使电池耗电非常快。我们决定需要获得手机的root访问权限,这样当手机处于空闲状态时,我们可以关闭那些不必要的电池消耗。同时,我们也不允许用户卸载它或清除其中的数据。

我的问题是:

  1. 我在哪里获取这些签名密钥?
  2. 如果我成功地对其进行签名,它会像root访问权限一样吗?
  3. Root与签名密钥有什么区别?

3
只有在为您的项目构建Android源代码时,才能将您的应用程序签名为系统应用程序。 - vjsantojaca
2
@VíctorSantoja 我怀疑这是唯一可能的方法,我已经搜索了整整一个星期,但我发现的东西很有趣。我认为我们可以通过制造商密钥进行签名。http://stackoverflow.com/a/15655078/3974048 - david
1
我知道如果你使用制造商密钥签署apk,这是可能的,但你不能在Google Play上发布这个apk。 - vjsantojaca
AOSP签名密钥在Play商店中被阻止,据我所知。因此,如果您使用该密钥对应用程序进行签名,则无法在Play商店上发布。 - Ber
如果我们涉及制造业,我们需要使用操作系统签名来签署我们的应用程序吗?制造商能否使用其他签名将我们的应用程序放入系统应用程序中? - hamid Mahmoodi
显示剩余2条评论
3个回答

24

回答你的三个问题:

1 - 我应该从哪里获取这些签名密钥呢?

参考 Android 自己的文档 的 发布密钥 章节。

Android 源码包含了测试密钥 build/target/product/security 下面

但下面这一部分是你需要特别注意的

由于测试密钥是公开已知的,任何人都可以使用相同的密钥签署他们自己的 .apk 文件,这可能允许他们替换或劫持内置在你的操作系统镜像中的系统应用程序。因此,对于任何公开发布或部署的 Android 操作系统映像都必须使用仅你拥有访问权限的一组特殊的发布密钥。

基本上,除非你能够获得制造商的专有密钥,否则可能很难实现此目标。这就是为什么前面评论中的用户说通常通过生成你自己的构建来实现这一点。

2 - 如果我成功地签署了它,那会像 root 访问吗?

这样做不会让你获得 "root 访问",但是你将获得极高的权限级别。具体地说,这将授予你声明了 android:protectionLevel="signature" 的权限,可以说是最独特的一种。

另一个危险的后果(或者有趣的,取决于你的看法)是,现在你可以在系统用户进程下运行你的应用程序 android:sharedUserId="android.uid.system" - 在 Android 的 "进程沙盒" 安全规则下,这通常会失败。

3 - Root 访问和使用密钥签名有何区别?

使用由您构建的平台密钥签署的应用程序,可以获得上述权限,或者以UID 1000(系统UID)运行您的应用程序,这在Android中比其他应用程序的UID更强大,因为它可以请求更多的权限,这是Android特有的行为。

在已取得 root 权限的设备上,可以使用 UID 0(root),它具有 Linux 系统中最广泛的访问权限,可以绕过大多数 OS 上的安全沙盒/检查/障碍。

希望这可以帮到您 ;)


我使用上述命令将我的应用程序制作为系统应用程序。在您的第一点中,您提出了一个非常有效的观点:“任何人都可以使用相同的密钥签署自己的.apk文件,这可能允许他们替换或劫持内置于您的操作系统映像中的系统应用程序”。我该如何克服这个问题?您提到了一种方法,但我无法使用特殊的发布密钥签署部署的操作系统。提前感谢您,我知道这是一个旧答案,但如果您能解释或提供有关此问题的任何链接,我将不胜感激。 - Hassan Munir
@HassanMunir 没问题,这个的重点是分享知识。 回答你的问题,这取决于你想要实现什么,以及你作为开发者的位置:1-你是在从AOSP或其他Android项目的代码中制作自己的Android构建的人。2-你是通过某种方式(root或其他方式)可以写入/system分区的人。3-你是为普通公众制作应用程序的“普通”开发者。 - HenriqueMS
@david 随着越来越多的人关注您的问题,需要注意的是,已接受的答案非常危险,正如您可以从我的答案中所读到的(直接引用自Google文档)- 我认为这应该被标记为正确答案。 - HenriqueMS
1
我认为这个答案是正确的,看起来很奇怪它不在顶部。 - Utkin Anton
@UtkinAnton 确实如此,请尽情点赞 x'D 接受的答案建议使用公共密钥集...签署任何ROM的后果...我真的无话可说。 - HenriqueMS

22

以下是您要找的答案:

  1. 您可以从这里获取平台密钥。签署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

  2. 如果您使用平台密钥签署您的apk,则无需root访问权限,您只需通过“adb install”命令安装即可。但请注意,它某种程度上像是root,因为它可以访问所有内部API,但请记住,如果您的应用程序是系统签名的,则无法写入外部存储。

  3. 首先不要混淆root和系统应用,root是用户类型,而系统应用是应用程序类型,与普通应用程序不同。下面的链接可能会清楚地解释这一点。

    what-is-the-difference-between-android-user-app-with-root-access-and-a-system-ap


1
我真的不能写外部存储吗?这正确吗? - david
1
如果您制作系统应用程序或者说使用平台证书签名,那么很抱歉,您无法写入外部存储。 - Apar Amin
它可以工作,但对于其他人来说,如果您有JDK 9,则此命令将无法正常工作。它会在signapk.jar baseencoder中给出错误。为了解决这个问题,我需要将我的Java降级到Java版本“1.8.0_151”。这样就可以完美地工作了。 - Hassan Munir
1
@NguyễnHoàng 为了简便起见,请将证书(.pem 和 .pk8)以及 signapk.jar 放在同一个文件夹/目录中,您还可以将 APK 文件放在同一个文件夹/目录中,并在终端/命令提示符中转到该文件夹/目录路径并执行命令,但请注意您需要配置 Java 路径。 - Apar Amin
2
我们在Linux或Windows上运行此命令时需要安装任何运行时吗?上述命令给出了错误信息“无法加载任何给定的库:[conscrypt_openjdk_jni windows-x86_64,conscrypt_openjdk_jni]”。 - Rajeev Kumar
显示剩余19条评论

2

如果您阅读了评论后仍然无法使其工作,可能是因为缺少某些内容(特别是如果出现OPENSSL错误),以下是您需要的所有内容。

使用AOSP的测试密钥签署APK

  1. git clone https://android.googlesource.com/platform/prebuilts/sdk.git - 请注意它大约有6GB,或者您可以下载所需的内容,即signapk.jar文件和库。
  2. https://github.com/aosp-mirror/platform_build/tree/master/target/product/security下载platform.x509.pemplatform.pk8(或获取与映像相对应的自己的密钥)
  3. 安装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.system中的签名匹配。 - Gevaria Purva
在Windows10上执行此命令时,出现错误:java.library.path中没有conscrypt_openjdk_jni-windows-x86_64 - Alexey Kolosov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接