先说结论:
执行adbremount重新将system分区以读写方式挂载的时候,需要将相关的信息保存到devinfo分区中。
这个分区在user版本中是被保护起来的,不允许写!(保护动作在LK中)
所以user版本LK,adb remount时会卡死(触发了分区保护机制),
Userdebug不会。
问题现象:
ProjectA 8.0 user版本替换userdebug版本的boot后,无法向手机push文件。
替换10月份的LK之后,push功能正常。
经本地验证,细化现象如下:
ProjectA 8.0 user版本替换userdebug版本的boot后,可以向手机的/data/目录push文件。
通过以下命令,向system目录push文件失败:
Adb root
Adb remount
Adb push xxx /system/bin/
此时命令窗口卡住,过一段时间手机UI不响应触摸操作。
本地其他验证动作:
进一步验证,在adbremount之后,手机静置就会出现UI不响应现象。
同时将LK和boot替换为userdebug版本,push文件正常。
下载driveronly基线代码,编译LK和boot进行验证:
在user版本只替换userdebug版本的boot,执行adb remount之后,UI卡死。
在user版本同时替换userdebug版本的LK和boot,执行adb remount之后,UI正常。
初步分析:
应该是android8.0对手机控制更加严格了:LK和boot必须匹配才能正常使用debug功能。
经了解,ProjectA,11月之前发布的版本为userdebug。
替换10月份的LK之后,LK和boot同为userdebug版本,所以remount功能正常。
进一步验证分析:
由于使用不同版本的LK有着不同的结果,所以从LK的差异分析入手。
经排查,在文件aboot.c中发现如下代码:
Devinfo分区被保护起来了!
而机器的行为又像是非法修改了被保护的分区(之前做防刷机机制时用到过)。
暂时取消对devinfo分区的保护,重新编译验证,user版本的LK也可以remount了。
再查询devinfo保存的信息为lock、unlock等安全相关的信息,
所以可能是remountsystem(只读改为读写)时需要修改devinfo分区内容,从而触发了保护机制。
--- devinfo和system之间的关系,有时间再研究一下。
之前7.1版本没有问题,是因为LK中把分区保护动作屏蔽了。