static int
really_install_package(const char *path, bool* wipe_cache, bool needs_mount)
{
bNeedClearMisc = false;
ui->SetBackground(RecoveryUI::INSTALLING_UPDATE); //lefty_lan注:更新屏幕的提示为正在更新
ui->Print("Finding update package...\n");
// Give verification half the progress bar...
ui->SetProgressType(RecoveryUI::DETERMINATE);
ui->ShowProgress(VERIFICATION_PROGRESS_FRACTION, VERIFICATION_PROGRESS_TIME);
LOGI("Update location: %s\n", path);
// Map the update package into memory.
ui->Print("Opening update package...\n");
char really_path[100];
if (path && needs_mount) {//lefty_lan注:确保更新包所在的路径已经mount
if (path[0] == '@') {
ensure_path_mounted(path+1);
} else {
ensure_path_mounted(path);
}
}
if(strncmp(path, "/mnt/external_sd", 16) == 0){
ensure_sd_mounted();
}else if(strncmp(path, "/mnt/usb_storage", 16) == 0){
ensure_usb_mounted();
}
MemMapping map;
if(strncmp(path, "/mnt/media_rw", 13) == 0){
//external_sd
LOGI("try to read update.zip from /mnt/external_sd");
strcpy(really_path, "/mnt/external_sd/");
ensure_sd_mounted();
strcat(really_path, "update.zip");
if(sysMapFile(really_path, &map) != 0){
//usb_storage
LOGI("try to read update.zip from /mnt/usb_storage");
strcpy(really_path, "/mnt/usb_storage/");
ensure_usb_mounted();
strcat(really_path, "update.zip");
if(sysMapFile(really_path, &map) != 0){
LOGE("failed to map file\n");
return INSTALL_CORRUPT;
}
}
}else if (sysMapFile(path, &map) != 0) {
LOGE("failed to map file\n");
return INSTALL_CORRUPT;
}else{
strcpy(really_path, path);
}
LOGI("update.zip path is %s\n", really_path);
int numKeys;
Certificate* loadedKeys = load_keys(PUBLIC_KEYS_FILE, &numKeys);//lefty_lan注:从/res/keys文件中装载设备的签名文件
if (loadedKeys == NULL) {
LOGE("Failed to load keys\n");
return INSTALL_CORRUPT;
}
LOGI("%d key(s) loaded from %s\n", numKeys, PUBLIC_KEYS_FILE);
ui->Print("Verifying update package...\n");
int err;
err = verify_file(map.addr, map.length, loadedKeys, numKeys);//lefty_lan注:校验更新包的签名
free(loadedKeys);
LOGI("verify_file returned %d\n", err);
if (err != VERIFY_SUCCESS) {//lefty_lan注:校验失败,退出
LOGE("signature verification failed\n");
sysReleaseMap(&map);
return INSTALL_CORRUPT;
}
/* Try to open the package.
*/
ZipArchive zip;
err = mzOpenZipArchive(map.addr, map.length, &zip);
if (err != 0) {
LOGE("Can't open %s\n(%s)\n", really_path, err != -1 ? strerror(err) : "bad");
sysReleaseMap(&map);
return INSTALL_CORRUPT;
}
/* Verify and install the contents of the package.
*/
ui->Print("Installing update...\n");
ui->SetEnableReboot(false);
int result = try_update_binary(really_path, &zip, wipe_cache);//lefty_lan注:开始安装
ui->SetEnableReboot(true);
ui->Print("\n");
sysReleaseMap(&map);
return result;
}