5.1 Примечания
5.1.1 OTA не может изменять количество и размер разделов
Recovery - это обычное приложение, работающее в Linux, оно не имеет возможности
корректировать существующую таблицу разделов.
Следовательно, количество и размер разделов должны быть четко определены во время
первого массового производства, а возможность корректировки количества и размеров разделов
при последующих обновлениях исключается.
5.1.2 Определите размер раздела кеша в собственном механизме Recovery,
поскольку путь монтирования раздела в Recovery не совсем такой же,
как путь монтирования раздела в Android. Поэтому, когда вы передаете адрес
пакета обновления на верхнем уровне Android, вы должны убедиться, что путь к пакету в
системе Recovery такой же, как и в системе Android.
Среди разделов, которые могут быть прочитаны и записаны, только раздел Cache и раздел
Data будут монтироваться системами Recovery и Android одновременно.
Это означает, что вам нужно поместить пакет в эти два раздела, чтобы он был распознан.
В собственной стратегии Google при выборе внешнего хранилища обновления
при упаковке они по умолчанию копируются в раздел Cache. Поэтому при создании разделов
нужно обращать внимание на выделение достаточного места в разделе Cache.
Может возникнуть проблема, заключающаяся в том, что пакет обновления не входит в раздел Cache
и обновление не может быть выполнено.
5.1.3 Раздел Misc - это мост между Recovery и Android.
Раздел Misc должен иметь достаточные разрешения для чтения и записи.
Если права чтения и записи раздела Мisc слишком высоки, приложение верхнего уровня не сможет
записывать в него данные и Recovery будет работать ненормально.
Невозможность записи в него данных приведет к ненормальной работе Recovery.
При проверке наличия проблем с этой функцией убедитесь, что установлен раздел misc,
резервный узел /dev/block/xxx и его программная ссылка /dev/block/by-name/misc
имеют достаточные разрешения для чтения и записи.
root@android:/dev block/by_name #ls -l
lrwxrwxrwx root root 2000-01-02 07:16 misc -> /dev/block/mmcblk0p6 (программная ссылка для раздела misc)
root@android:/dev/block #ls -l
brw-rw ----1 system root 179, 7 2019-09-16 10:15 /dev/block/mmcblk0p6
.....
5.2 Общие проблемы и меры предосторожности при создании пакетов OTA
1. Метод определения совпадения целевого файла (TargetFile) и прошивки.
На устройстве Android выполняется команда
adb pull /system/build.prop
Для TargetFile распакуйте файл build.prop прошивки, чтобы просмотреть System/build.prop
Сравните эти два файла build.prop
Если они совпадают, это означает, что прошивка и TargetFile совпадают.
2. Не удалось обновить дифференциальный пакет.
При обновлении дифференциального пакета будет проверяться измененный apk или часть кода.
После распаковки дифференциального пакета сценарий обновления находится в каталоге
/meta-inf/com/google/android/updater-script
Для измененной части дифференциальное обновление сначала проверит версию перед обновлением.
Только после сопоставления значения контрольной суммы SHA и обновленного значения SHA
обновление может быть успешным.
Таким образом, клиенты могут оценить файлы перед обновлением:
является ли значение контрольной суммы SHA APK-файла корректным, чтобы определить, соответствует ли прошивка
перед дифференциальным обновлением пакету дифференциального обновления.
Обновление с разницей в файлах
В качестве примера форма сценария обновления выглядит следующим образом:
apply_patch_check ([имя файла],
[значение SHA после обновления][значение SHA перед обновлением]) || abort ("...")
Поэтому вы можете использовать команду shasum (показать или проверить контрольные суммы SHA) для выполнения запроса SHA для
дифференциально обновленных файлов.
Дифференциальное обновление требует использования TargetFile.
Если обновленный целевой файл, например, system/bin/A.apk, то вы можете распаковать целевой файл
до и после обновления, и проверить, соответствует ли значение system/bin/A.apk
значению SHA сценария обновления.
Если они совпадают, файл можно обновить успешно, в противном случае файл не может быть успешно обновлен.
Причина в том, что прошивка перед обновлением и прошивка, которая генерировала дифференциальный пакет,
не соответствует целевому файлу TargetFile.