Android Studio 之签名

Android Studio 之签名,第1张

通过签名可以确保数据来源的可靠性和数据的不可篡改性

对 Apk 进行签名,也就是在 Apk 中写入一个指纹,写入指纹后,Apk 中有任何修改,都会导致这个指纹无效,Android 系统在安装 Apk 进行签名校验时就会不通过,进而无法安装该 Apk

如上图:

通常的签名验签过程中,接收方收到消息后,会先向 CA 机构验证证书的合法性,再进行签名校验。但 Apk 的证书通常由开发者自己制作,没有向 CA 机构申请,Android 系统在安装 Apk 时也并没有校验证书本身的合法性,只是从证书中提取公钥和加密算法,因此,如果对第三方 Apk 重新签名,也能安装到没有安装过这个 Apk 的系统中

keystore 文件包含私钥、公钥和数字证书,分为很多种,Android 使用的是 Java 标准 keystore 格式 JKS(Java Key Storage)

Android App Bundle:用于通过 Google Play 发布的应用,需要升级到AS 32 以上版本才支持App Bundle 格式;

APK:用于创建可部署到设备上的签名 APK

点击 Finish 就会生成签名文件与签名后的 Apk

当我们需要升级 Apk 版本的时候,需要再次对 Apk 文件进行签名,可以通过配置 buildgradle 让其自动生成签名后的 Apk

如果你的项目是开源的,需要把你的签名信息写在 localproperties 中,然后在 gitignore 配置文件中加入 localproperties ,这样 localproperties 就不会提交到开源项目中,签名信息也就不会被人获取

localproperties:

app/buildgradle:

有时候我们的 apk 中某些功能需要系统签名,例如静默安装。测试系统签名的 apk,需要 root 权限,而带 Google APIs 的模拟器不能 root,因此要注意不能选择带 Google APIs 的模拟器

下面执行的 *** 作都是在 Linux 中,如果 apk 是 window 中生成的,需要拷贝到 linux *** 作,再将生成的系统签名过得 apk 再拷贝到 window,比较麻烦,可以考虑后面的自动系统签名,还是需要在 linux *** 作一次,不过之后就可以只在 window *** 作了

这两个文件在目录 aosp/build/target/product/security 下,如下图

在目录 aosp/prebuilts/sdk/tools/lib 下,如下图

将前面获取的 platformpk8 、 platformx509pem 和 signapkjar 文件放到需要签名的 apk 同一个目录,执行以下命令

如果出现上面的错误:Failed to load any of the given libraries: [conscrypt_openjdk_jni-linux-x86_64, conscrypt_openjdk_jni-linux-x86_64-fedora, conscrypt_openjdk_jni]

解决方法:

到目录 aosp/prebuilts/sdk/tools/linux/lib64 下,复制 libconscrypt_openjdk_jniso 文件到需要签名 apk 的同一个目录,并将命令改为

自动进行系统签名的原理是:先生成一个 systemjks 文件,使用 keytool-importkeypair 对 systemjks 文件进行系统签名,再 buildgradle 和 localproperties 进行配置,直接使用带有系统签名的 systemjks 对 apk 进行签名,这样编译生成的apk文件就自带系统签名了

按照前面的方法,生成一个 systemjks 文件,此时是在 window 系统中 *** 作的

进入 keytool-importkeypair 目录,将 systemjks、platformpk8、platformx509pem 文件拷贝进来,拷贝之后的目录结构为

使用 linux 中修改过的带有系统签名的 systemjks 文件将 window 中最开始生成的 systemjks 覆盖掉,再像前面的自动签名部分一样,修改 buildgradle 和 localproperties 的配置,之后生成的 apk 就是系统签名过的了

测试方法是,在 AndroidManifestxml 中添加 android:sharedUserId="androiduidsystem" 后安装到 非 Google APIs 的模拟器上 , Google APIs 的模拟器不能 root,无法安装

会发现只有使用 systemjks 文件签名后才能安装,否则安装失败,会报以下的错误:

1打开终端,输入:

keytool -v -list -keystore +签名文件路径

2输入签名文件密码即可获取到签名文件所有信息:

创建日期: 2018-11-8 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: CN=fang 发布者: CN=fang 序列号: 4551a2f8 有效期开始日期: Thu Nov 08 11:17:27 CST 2018, 截止日期: Mon Nov 02 11:17:27 CST 2043 证书指纹: MD5: 2B:85: SHA1: 97:7D: SHA256: 1A:C5:F7:5C: 签名算法名称: SHA256withRSA 版本: 3

注:两种方法都不一定适用于所有android系统。

方法一:需要在Android系统源码的环境下用make来编译:

在应用程序的 AndroidManifestxml 中的 manifest 节点中加入 android:sharedUserId="androiduidsystem" 这个属性

修改Androidmk文件,加入LOCAL_CERTIFICATE := platform这一行

使用mm命令来编译,生成的apk就有修改系统时间的权限了。

方法二:

同上,加入android:sharedUserId="androiduidsystem"这个属性。

使用eclipse编译出apk文件,但是这个apk文件是不能用的。

用压缩软件打开apk文件,删掉META-INF目录下的CERTSF和CERTRSA两个文件。 (这一步我跳过了(原本是无意的,后来发现下面也有提到),结果一样可以)

使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在Android源码目录中的位置 是"build\target\product\security",下面的platformpk8和platformx509pem两个文件。然 后用Android提供的Signapk工具来签名,signapk的源代码是在"build\tools\signapk"下,用法为"signapk platformx509pem platformpk8 inputapk outputapk",文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。

<此时这样最后得到的apk和第一个方法是一样的>

解释一下原理,首先加入android:sharedUserId="androiduidsystem"这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成androiduidsystem,也就是要让程序运行在系统进程中,这样就 有权限来调用那些需要系统权限的函数了。 只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法提到的platformpk8和platformx509pem两个文件。用这两个key签名后apk才真正可以放入系 统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。

有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platformpk8 和platformx509pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key 来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示"Package has no signatures that match those in shared user androiduidsystem",这样也是保护了系统的安全。

最后说一下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。

以上就是关于Android Studio 之签名全部的内容,包括:Android Studio 之签名、Android获取签名文件的sha1值、如何获取其他android系统的platform.pk8签名文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9475739.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存