天天看点

Android签名二: package.xml packagelist.xml分析

最近公司经历了一次换签名的过程,结果ROM升级过程中出现了重大事故。 现在分析下原因: 

(一)、什么是package.xml?

https://mp.weixin.qq.com/s?__biz=MzIyNDc0MDcyNw==&mid=2247483809&idx=1&sn=f6d4e6d1e26a16c49a09733fad5796e1&chksm=e80b15b9df7c9caffc315fb46ac92f435f4a1f1923427f09cc0b198a5f24733035cbc343093d&mpshare=1&scene=1&srcid=1120oDDRrfhOHVPF1IDp2tiL&pass_ticket=JS11JF1QelfPgUjPWi%2BzA1HneVPByeHoI%2BKhI0jctV4rS4MO8lgywKqBeuyCQ5%2Fw#rd

ft 表示 apk 文件上次被更改的时间,

it 表示 app 第一次安装的时间,

ut 表示 app 上次被更新时间, 它的值好像一直和 ft 相同, ota 或 app 重装之后, 这里的ft和ut可能会改变。

ft:  apk上次更新的时间。

apk实际修改时间: apk包存放文件的实际修改时间。 

package.xml文件什么时候会更新????  每次开机的时候,都会检查,和apk包实际修改时间的信息不一样,就会更新package.xml的ft值。

(二)、签名校验

  在data/system下有一个文件叫packages.xml, 这里面记录的有每一个app最近一次被修改的时间。然后Android每次启动的时候,用这个时间和.apk文件真实被修改的时间作比较。如果两者不相同,系统就认为

这个.apk文件被更新过,然后才会重新去检验它的签名信息,最后把这次收集到的签名信息,修改时间再写回到packages.xml里。

              目前看到这个时间只是用来决定是否做签名收集和校验。也就是说,就算是这个时间没有变化,也不影响开机时packagemanagerservice解析AndrodManifest.xml里的组件信息。

一、全新刷机

全新刷机,最开始ft是没有值的,

再次重启后,更新package.xml, 主要是把.apk的实际更改时间读出来,写到ft这里。  此时 【ft】和【apk包实际修改时间】是一致的 

二、第一次OTA时

因为在OTA的过程中,更换apk文件的时候,recovery在更换文件的时候,会默认写一个更改时间, 就是2008.8.1号。 也就是所有【apk包实际修改时间】都变成2008.8.1。  (可以认为是谷歌的bug)

OTA升级的过程中,有一个updater-binary的可执行程序,它在抽取OTA包中的文件到emmc的过程中,强制给这些文件加了一个修改时间,目前这个值是google写死的,也就是2008年8月1号。所以只要是做过OTA升级的电视,你们应该会发现/system/目录下的几乎所有文件的修改时间都是这个。

综上所述, OTA后再次重启后【apk包实际修改时间】 和 【ft】时间都为 2008.8.1

三、再一次OTA时,  

因为在OTA的过程中,更换apk文件的时候,recovery在更换文件的时候,会默认写一个更改时间, 就是2008.8.1号。 但是此时【ft】的值也是2008.8.1.

OTA 完成后,自动重启,发现两者值一致, 所以不会替换签名。

解决方法: 

在OTA的过程中,更换apk文件的时候,recovery在更换文件的时候,会默认写一个其他更改时间, 就是2017.11.11号。 此时【ft】的值还是之前的2008.8.1 。 OTA完成后,自动重启,发现两者值不一致,所以会替换签名

    解决办法:把updater-binary里的强制写的修改时间改一下。保证和之前OTA时写入的时间不一致就可以了

备注: