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时写入的时间不一致就可以了

 

 

备注:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值