需求
需要升级第三方平台的系统,后续自己维护系统所有应用,大前提是拿到源码后,需要进行对系统签名进行替换,便于后续维护。(注不再维护第三方平台的应用)
需要替换的是:
build/target/product/security
platform.pk8、platform.x509.pem
也即platform.签名,这些主要用于我们系统apk 的签名校验。防止其他应用替换
系统包ota 用的是testkey 签名,我们不用替换着个。否则会升级失败。这个testkey 签名也是每个项目私有并独立使用。
理论
1.更换应用时,必须使用与旧应用相同的密钥对其签名,才能存取旧应用的数据。无论是通过覆盖 .apk 来更新用户应用,还是使用安装在 /data 下的新版本应用来覆盖系统应用,这一点都适用。
2.如果两个或多个应用想要共享同一个用户ID(方便共享数据等),则必须使用相同的密钥对它们进行签名。
3.必须使用符合系统预期的密钥对 OTA 更新包进行签名,否则在安装过程中 OTA 更新包将被拒绝。
实战
替换platform 签名后,有两个地方需要注意:
1.修改时间戳
bootable/recovery /updater/install.c
struct utimbuf timestamp = { 1217592000, 1217592000 }; // 8/1/2008 default
这个时间必须变化一下,否则可能导致系统的签名没有更新成功
2.系统升级后,apk解析
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
scanPackageDirtyLI(){
if (pkgSetting.sharedUser != null) {
if (compareSignatures(pkgSetting.sharedUser.signatures.mSignatures,
pkg.mSignatures) != PackageManager.SIGNATURE_MATCH) {
// throw new PackageManagerException(
// INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES,
// "Signature mismatch for shared user : "
// + pkgSetting.sharedUser);
pkgSetting.sharedUser.signatures.mSignatures = pkg.mSignatures;
}
}
}
以上两个关键点解决即可替换platform签名。