在我的公司中,我们希望能够在现场完全控制电池消耗,只使用2G和GPS会使电池耗电非常快。我们决定需要获得手机的root访问权限,这样当手机处于空闲状态时,我们可以关闭那些不必要的电池消耗。同时,我们也不允许用户卸载它或清除其中的数据。
我的问题是:
- 我在哪里获取这些签名密钥?
- 如果我成功地对其进行签名,它会像root访问权限一样吗?
- Root与签名密钥有什么区别?
在我的公司中,我们希望能够在现场完全控制电池消耗,只使用2G和GPS会使电池耗电非常快。我们决定需要获得手机的root访问权限,这样当手机处于空闲状态时,我们可以关闭那些不必要的电池消耗。同时,我们也不允许用户卸载它或清除其中的数据。
我的问题是:
回答你的三个问题:
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的命令(适用于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和系统应用,root是用户类型,而系统应用是应用程序类型,与普通应用程序不同。下面的链接可能会清楚地解释这一点。
what-is-the-difference-between-android-user-app-with-root-access-and-a-system-ap
如果您阅读了评论后仍然无法使其工作,可能是因为缺少某些内容(特别是如果出现OPENSSL错误),以下是您需要的所有内容。
signapk.jar
文件和库。platform.x509.pem
和platform.pk8
(或获取与映像相对应的自己的密钥)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
java.library.path
中没有conscrypt_openjdk_jni-windows-x86_64
。 - Alexey Kolosov