Android系统定制开发 | 如何对应用进行系统签名?

543 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

当我们在开发Android系统的内置应用时,通常会对其进行系统签名,以确保其获取较高的权限。

通常使用的签名方式有三种:

  1. 在系统源码编译环境下签名
  2. 使用命令签名
  3. 使用Android Studio签名

第1种方案相对比较繁琐,需要在Android系统源码编译环境下进行,并且需要编写构建脚本。一般情况下,当把应用作为系统应用编译进整机ROM时,才会采用此种方式。

我将在文中重点介绍后面两种方式。

一、 使用命令签名

这种方式不需要系统源码编译环境,App可以在Android Studio下编译,然后使用签名文件给apk重新签名即可。

1. 获取签名文件

从系统源码环境中获取签名相关文件(或者由供应商直接提供) platform.x509.pemplatform.pk8signapk.jar

  • platform.x509.pemplatform.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

  1. 将pkcs8格式的私钥 platform.pk8 转化成pkcs12格式。
openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt
  1. 把公钥 platform.x509.pem 转换成pkcs12格式,并指定 密钥别名
openssl pkcs12 -export -in platform.x509.pem -inkey shared.priv.pem -out shared.pk12 -name 密钥别名

输入上述指令后,需要连续两次输入 密钥密码

  1. 生成指定 密钥名称 的密钥文件。
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'
    }
}

下图展示了密钥文件的地址配置示例:

image.png

构建脚本配置完成后,使用Android Studio执行指定的构建时,就会按照我们写好的脚本信息生成对应签名的apk。

3. 密钥安全性

为了保障密钥的安全,不建议将密钥文件上传至代码管理平台,也 不建议将密钥文件的别名、密码直接以明文的方式写到build.gradle中

这个以各位实际的项目情况为准,判断是否需要移除这些敏感信息。 具体可遵照 Android官方建议 从构建文件中移除签名信息。