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

Signing my android application as system app

在我的公司,我们希望在现场完全控制电池消耗,仅使用 2g 和 gps 会非常快速地耗尽电池。我们决定的是,我们需要对手机 phone 进行 root 访问,这样当 phone 空闲时,我们将关闭那些不必要的电池消耗。 而且我们不允许用户卸载它并清除它的数据。

我的问题是:

  1. 我从哪里获得这些签名密钥?
  2. 它会喜欢 root 权限吗 如果我成功地做到了 签名?
  3. Root 和 Signed with key 有什么区别?

下面是您的答案,

  1. 您可以从以下位置找到平台密钥 HERE。签署 apk 的命令(linux)是:

    java -jar signapk.jar -w platform.x509.pem platform.pk8 APPLICATION.apk APPLICATION_sign.apk

    onward 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 是用户,系统应用是应用程序类型,这与下面的正常应用程序有所区别 link 可能会消除您对此的困惑。

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

回答您的三个问题:

1 - Where do I get these signature key?

来自 Android's own documentation 部分的释放密钥

The Android tree includes test-keys under build/target/product/security

但接下来才是你真正应该注意的地方

Since the test-keys are publicly known, anybody can sign their own .apk files with the same keys, which may allow them to replace or hijack system apps built into your OS image. For this reason it is critical to sign any publicly released or deployed Android OS image with a special set of release-keys that only you have access to.

所以基本上除非你能以某种方式获得制造商的 pvt 密钥,否则可能很难实现这一点。这就是为什么之前评论中的用户说这通常是通过生成您自己的构建来实现的。

2 - Is it going to like a root access If ever I successfully managed to sign it?

这样做你不会得到"root access",但你会获得极高的访问权限。具体来说,这为您带来的是,您将获得声明 android:protectionLevel="signature" 的权限,这可以说是最独特的权限。

另一个危险的后果(或乐趣,取决于你如何看待它)是你现在可以 运行 你的应用程序在系统用户进程 android:sharedUserId="android.uid.system" - 在 android 的 "process sandboxed" 安全规则,这通常会失败。

3 - What is the difference between Root vs Signed with key?

使用您构建的平台密钥签名的应用程序,您可以获得上述权限,或者运行您的应用程序具有 UID 1000(系统 uid),在 android 中更多比其他应用程序的 UID 更强大,因为它可以请求权限,但这是 Android 特有的行为。 在获得 root 权限的设备中,您可以使用 UID 0 (root),它在基于 linux 的系统中具有最广泛的访问权限,您可以绕过 OS.[=18 上的大部分安全措施 sandboxing/checks/fences =]

希望对您有所帮助 ;)

对于任何遇到这个问题的人,即使在阅读了无法使其正常工作的评论之后,这可能是因为缺少一些东西(特别是如果出现 OPENSSL 错误),这里有你需要的一切。

使用 AOSP 中的测试密钥签署 APK

  1. git 克隆 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