Android OS 映像在两个地方使用加密签名:
映像中的所有 .apk 文件都必须经过签名。Android 软件包管理器通过下列两种方式使用 .apk 签名:
更换应用时,必须使用与旧应用相同的密钥对其签名,才能存取旧应用的数据。无论是通过覆盖 .apk 来更新用户应用,还是使用安装在 /data 下的新版本应用来覆盖系统应用,这一点都适用。
如果两个或多个应用想要共享同一个用户 ID(方便共享数据等),则必须使用相同的密钥对它们进行签名。
必须使用符合系统预期的密钥对 OTA 更新包进行签名,否则在安装过程中 OTA 更新包将被拒绝。
标准安卓使用四对密钥,分别是:
testkey: 适用于未另外指定密钥的 apk 包的通用默认密钥。(如果app的Android.mk中LOCAL_CERTIFICATE未设置,则默认会采用testkey)
platform: 适用于核心平台所包含的 apk 包的测试密钥。
shared: 适用于家庭/联系人进程中的共享内容的测试密钥。(apk需要和home/contacts共享数据)
Meida: 适用于媒体/下载系统所包含的 apk 包的测试密钥。(apk是media/download系统中的一环)
除testkey以外,其他密钥需要在App的Android.mk中明确指定LOCAL_CERTIFICATE。
以上提到的四对密钥默认在build/target/product/security目录,每种密钥包含两个文件:一个扩展名为.x509.pem的证书,一个扩展名为.pk8的私钥。以platform为例,则会有platform.x509.pem和platform.pk8两个文件。
需要注意的是:以上密钥都是默认密钥,也就是说用户需要自己生成密钥才能保证安全性。
根据安卓官方的声明,还可使用以下方式对单个apk通过路径名指定不同的密钥,比如:
device/yoyodyne/apps/SpecialApp/Android.mk
[...]
LOCAL_CERTIFICATE := device/yoyodyne/security/special
现在,此版本使用 device/yoyodyne/security/special.{x509.pem,pk8} 密钥来对 SpecialApp.apk 进行签名。此版本仅可使用不受密码保护的私钥
2.密钥生成
根据安卓官方推荐,使用以下命令生成新的密钥:
subject='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
我们可将subject中的内容替换为公司的信息。这样在android-certs中会生成四对密钥:releasekey/platform/share/media。
生成key的过程中会提示输入password, 可以不输入,避免编译过程中要求密码输入。
可将生成的密钥拷贝到build/target/product/security目录覆盖掉原有的默认密钥。
3. Makefile修改
为了使用releasekey替换掉testkey,需要修改以下Makefile文件:
在buid/core/config.mk中定义变量:DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/releasekey
./system/sepolicy/prebuilts/api/26.0/private/keys.conf
./system/sepolicy/private/keys.conf中将testkey修改为releasekey。
4. 手动签名image
如果需要对OTA image手动签名,可以使用以下命令:
./build/tools/releasetools/ota_from_target_files
-k ~/.android-certs/releasekey \ --签名key
signed-target_files.zip \ --输入文件,已经签过名
signed-ota_update.zip --输出文件,重签名文件
那么,如何得到OTA image对应的ROM image呢?可以使用以下命令生成:
./build/tools/releasetools/img_from_target_files signed-target-files.zip signed-img.zip
生成的signed-img.zip就包含所有的.img文件。可用fastboot加载到设备:
fastboot update singed-img.zip