开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情
当我们在开发Android系统的内置应用时,通常会对其进行系统签名,以确保其获取较高的权限。
通常使用的签名方式有三种:
- 在系统源码编译环境下签名
- 使用命令签名
- 使用Android Studio签名
第1种方案相对比较繁琐,需要在Android系统源码编译环境下进行,并且需要编写构建脚本。一般情况下,当把应用作为系统应用编译进整机ROM时,才会采用此种方式。
我将在文中重点介绍后面两种方式。
一、 使用命令签名
这种方式不需要系统源码编译环境,App可以在Android Studio下编译,然后使用签名文件给apk重新签名即可。
1. 获取签名文件
从系统源码环境中获取签名相关文件(或者由供应商直接提供) platform.x509.pem、platform.pk8 、signapk.jar。
platform.x509.pem、platform.pk8位于../build/target/product/security目录下。signapk.jar位于../out/host/linux-x86/framework目录下。
2. 使用签名命令进行签名
打开命令行工具使用以下命令对你的应用进行签名。
java -jar signapk.jar platform.x509.pem platform.pk8 你的应用.apk 签名后的应用名.apk
二、使用Android Studio签名
这种方式最为简便,只需要在gradle中编写签名脚本命令,即可在编译apk时直接进行系统签名。
1. 制作keystore文件
制作keystore文件时,需要使用到 Java 相关命令。请尽量使用较低版本的JDK(本例中使用java8版本)生成keystore文件,以避免由于Android Studio使用了低版本的JDK(指低于生成keystore文件的JDK版本),导致的keystore文件无法解析的问题。
相关错误:Errors while building APK: Algorithm HmacPBESHA256 not available
- 将pkcs8格式的私钥
platform.pk8转化成pkcs12格式。
openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt
- 把公钥
platform.x509.pem转换成pkcs12格式,并指定 密钥别名。
openssl pkcs12 -export -in platform.x509.pem -inkey shared.priv.pem -out shared.pk12 -name 密钥别名
输入上述指令后,需要连续两次输入 密钥密码。
- 生成指定 密钥名称 的密钥文件。
keytool -importkeystore -srckeystore shared.pk12 -srcstoretype pkcs12 -srcstorepass 密钥密码 -alias 密钥别名 -deststorepass 密钥密码 -destkeypass 密钥密码 -destkeystore 密钥名称 -deststoretype pkcs12
请注意,上述步骤你一共输入了 3 个信息,分别是:密钥别名,密钥密码,密钥名称,请牢记这些信息,它们将在下一步使用。
在输入的时候,请使用阿拉伯数字、英文字符和通用符号,上面使用中文描述只是方便说明这些信息的含义。
2. 配置签名脚本
在工程主模块的 build.gradle文件中添加 signingConfigs 签名配置信息,并声明不同构建需要使用的签名文件。
// 1. 配置签名文件信息
signingConfigs {
debug {
keyAlias '密钥别名'
keyPassword '密钥密码'
// 你可以把密钥文件放在电脑上的任何位置,这里填写你电脑上的密钥文件地址
// 可以使用相对地址,也可以使用绝对地址
// 相对地址位于build.gradle文件同级目录
storeFile file('密钥文件的地址')
storePassword '密钥密码'
}
release {
keyAlias '密钥别名'
keyPassword '密钥密码'
storeFile file('密钥文件的地址')
storePassword '密钥密码'
}
}
// 2. 声明构建需要使用的签名文件
buildTypes {
debug{
// 声明debug类型的构建使用signingConfigs中配置的debug签名
signingConfig signingConfigs.debug
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
// 声明release类型的构建使用signingConfigs中配置的release签名
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
下图展示了密钥文件的地址配置示例:
构建脚本配置完成后,使用Android Studio执行指定的构建时,就会按照我们写好的脚本信息生成对应签名的apk。
3. 密钥安全性
为了保障密钥的安全,不建议将密钥文件上传至代码管理平台,也 不建议将密钥文件的别名、密码直接以明文的方式写到build.gradle中。
这个以各位实际的项目情况为准,判断是否需要移除这些敏感信息。 具体可遵照 Android官方建议 从构建文件中移除签名信息。