From 8deefc919cd2c04c4a3246a611a44da7e3d3bed1 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Sun, 8 Mar 2026 16:01:34 +0000 Subject: [PATCH 1/2] add support for backporting files from two images at once --- src/commands/generate-all.ts | 21 ++++++++++++++-- src/commands/show-status.ts | 35 ++++++++++++++++++++++++--- src/commands/update-aosp-tag-index.ts | 2 +- src/config/device.ts | 3 +++ src/frontend/source.ts | 4 +++ src/util/partitions.ts | 7 ++++++ 6 files changed, 65 insertions(+), 7 deletions(-) diff --git a/src/commands/generate-all.ts b/src/commands/generate-all.ts index d9a272cb9..2a9bc365b 100644 --- a/src/commands/generate-all.ts +++ b/src/commands/generate-all.ts @@ -57,7 +57,7 @@ import { processSepolicy } from '../processor/sepolicy' import { processSysconfig } from '../processor/sysconfig' import { processVintf } from '../processor/vintf' import { gitDiff } from '../util/cli' -import { mapGet } from '../util/data' +import { assertDefined, mapGet } from '../util/data' import { DIR_SPEC_PLACEHOLDER, FileTreeComparison, @@ -215,7 +215,9 @@ export default class GenerateFull extends Command { let backportBuildId = config.device.backport_build_id if (backportBuildId !== undefined) { let backportDeviceImages = mapGet(images, getDeviceBuildId(config, backportBuildId)) - let fileOverlays: { [part: string]: Set } = Object.fromEntries(Object.entries(config.backport_files).map(([k, v]) => [k, new Set(v)])) + let fileOverlays: { [part: string]: Set } = Object.fromEntries( + Object.entries(config.backport_files).map(([k, v]) => [k, new Set(v)]), + ) let fileOverlaysByDir: { [part: string]: { [dir: string]: Set } } = {} for (let [part, filePaths] of Object.entries(fileOverlays)) { let filesByDir: { [dir: string]: Set } = {} @@ -235,11 +237,26 @@ export default class GenerateFull extends Command { fileOverlaysByDir[part] = filesByDir } + let secondaryBackportBuildId = config.device.secondary_backport_build_id + let secondaryFileOverlays: { [part: string]: Set } | undefined = undefined + let secondaryBasePath: string | undefined = undefined + if (secondaryBackportBuildId !== undefined) { + secondaryBasePath = mapGet( + images, + getDeviceBuildId(config, secondaryBackportBuildId), + ).unpackedFactoryImageDir + secondaryFileOverlays = Object.fromEntries( + Object.entries(assertDefined(config.secondary_backport_files)).map(([k, v]) => [k, new Set(v)]), + ) + } + pathResolver.overlay = { basePath: backportDeviceImages.unpackedFactoryImageDir, + secondaryBasePath, dirOverlays: config.backport_dirs, fileOverlays, fileOverlaysByDir, + secondaryFileOverlays, } } // Prepare output directories diff --git a/src/commands/show-status.ts b/src/commands/show-status.ts index fc02961d3..51ea0de4f 100644 --- a/src/commands/show-status.ts +++ b/src/commands/show-status.ts @@ -6,7 +6,7 @@ import { BuildIndex, ImageType, loadBuildIndex } from '../images/build-index' import { DeviceImage } from '../images/device-image' import { updateMultiMap } from '../util/data' import { log } from '../util/log' -import { loadBuildIdToTagMap } from './update-aosp-tag-index' +import { BuildIdToTag, loadBuildIdToTagMap } from './update-aosp-tag-index' export default class ShowStatus extends Command { static flags = { @@ -19,11 +19,13 @@ export default class ShowStatus extends Command { let buildIdMap = new Map() let backportBuildIdMap = new Map() + let secondaryBackportBuildIdMap = new Map() // platform security patch levels let psplMap = new Map() let buildIndex = await loadBuildIndex() let mainImageStatus = new ImageStatus(buildIndex) let backportImageStatus = new ImageStatus(buildIndex) + let secondaryBackportImageStatus = new ImageStatus(buildIndex) for (let config of configs) { updateMultiMap(buildIdMap, config.device.build_id, config) @@ -33,20 +35,32 @@ export default class ShowStatus extends Command { updateMultiMap(backportBuildIdMap, backportBuildId, config) await backportImageStatus.update(config, backportBuildId) } + let secondaryBackportBuildId = config.device.secondary_backport_build_id + if (secondaryBackportBuildId !== undefined) { + updateMultiMap(secondaryBackportBuildIdMap, backportBuildId, config) + await secondaryBackportImageStatus.update(config, secondaryBackportBuildId) + } updateMultiMap(psplMap, config.device.platform_security_patch_level_override, config) } let buildIdToTag = await loadBuildIdToTagMap() - this.log(chalk.bold('Tag | Build ID:')) + this.log(chalk.bold('Main stock image:')) for (let [buildId, configs] of buildIdMap.entries()) { - this.log(`${buildIdToTag?.get(buildId) ?? '[no tag]'} | ${buildId}: ` + getDeviceNames(configs)) + this.log(`${expandBuildId(buildIdToTag, buildId)}: ` + getDeviceNames(configs)) } if (backportBuildIdMap.size > 0) { this.log(chalk.bold('\nBackports:')) for (let [buildId, configs] of backportBuildIdMap.entries()) { - this.log(`${buildIdToTag?.get(buildId) ?? '[no tag]'} | ${buildId}: ` + getDeviceNames(configs)) + this.log(`${expandBuildId(buildIdToTag, buildId)}: ` + getDeviceNames(configs)) + } + + if (secondaryBackportBuildIdMap.size > 0) { + this.log(chalk.bold('\nSecondary backports:')) + for (let [buildId, configs] of secondaryBackportBuildIdMap.entries()) { + this.log(`${expandBuildId(buildIdToTag, buildId)}: ` + getDeviceNames(configs)) + } } } @@ -65,12 +79,25 @@ export default class ShowStatus extends Command { backportImageStatus.log() } + if (secondaryBackportBuildIdMap.size > 0) { + this.log(chalk.bold('\nSecondary backport stock image:')) + secondaryBackportImageStatus.log() + } + if (mainImageStatus.unknownImages.size + backportImageStatus.unknownImages.size !== 0) { process.exit(1) } } } +function expandBuildId(buildIdToTag: BuildIdToTag | null, buildId: string) { + let tag = buildIdToTag?.get(buildId) + if (tag == undefined) { + return buildId + } + return tag + ' | ' + buildId +} + class ImageStatus { static imageTypes = [ImageType.Factory, ImageType.Ota] diff --git a/src/commands/update-aosp-tag-index.ts b/src/commands/update-aosp-tag-index.ts index 4c1f67a02..e323a0db5 100644 --- a/src/commands/update-aosp-tag-index.ts +++ b/src/commands/update-aosp-tag-index.ts @@ -8,7 +8,7 @@ import { showGitDiff } from '../util/cli' import { readFile } from '../util/fs' import { GitLsRemote } from '../util/git' -type BuildIdToTag = Map +export type BuildIdToTag = Map export async function loadBuildIdToTagMap(): Promise { try { diff --git a/src/config/device.ts b/src/config/device.ts index 2c29f9472..8f1e988ba 100644 --- a/src/config/device.ts +++ b/src/config/device.ts @@ -33,6 +33,7 @@ export interface DeviceConfig { build_id: string is_beta_build_id: boolean backport_build_id: string | undefined + secondary_backport_build_id: string | undefined is_beta_backport_build_id: boolean backport_base_firmware?: boolean prev_build_id: string @@ -92,6 +93,8 @@ export interface DeviceConfig { backport_dirs: { [part: string]: string[] } backport_files: { [part: string]: string[] } + // Files to backport from secondary_backport_build_id. Must be a subset of backport_files + secondary_backport_files?: { [part: string]: string[] } apk_map: { [apk_path: string]: ApkMapping } apex_map: { [apex_path: string]: ApexMapping } diff --git a/src/frontend/source.ts b/src/frontend/source.ts index 8de9e3d9d..23210f3ab 100644 --- a/src/frontend/source.ts +++ b/src/frontend/source.ts @@ -47,6 +47,10 @@ export async function prepareDeviceImages( if (backportBuildId !== undefined) { buildIds.push(backportBuildId) } + let secondaryBackportBuildId = deviceConfig.device.secondary_backport_build_id + if (secondaryBackportBuildId !== undefined) { + buildIds.push(secondaryBackportBuildId) + } } for (let buildIdSpec of buildIds) { diff --git a/src/util/partitions.ts b/src/util/partitions.ts index 607753d0a..2b3b58b66 100644 --- a/src/util/partitions.ts +++ b/src/util/partitions.ts @@ -4,6 +4,7 @@ import path from 'path' import { PartPath } from '../blobs/file-list' import { UNPACKED_APEXES_DIR_NAME } from '../frontend/source' import { isFile } from './fs' +import { assertDefined } from './data' export enum Partition { Root = 'root', @@ -31,8 +32,11 @@ export enum Partition { export interface OverlayConfig { basePath: string + secondaryBasePath?: string dirOverlays: { [part: string]: string[] } fileOverlays: { [part: string]: Set } + // secondaryFileOverlays must be a subset of fileOverlays + secondaryFileOverlays?: { [part: string]: Set } fileOverlaysByDir: { [part: string]: { [dir: string]: Set } } } @@ -77,6 +81,9 @@ export class PathResolver { } } if (shouldOverlay) { + if (overlay.secondaryFileOverlays?.[part]?.has(relPath) === true) { + return path.join(assertDefined(overlay.secondaryBasePath), partPath, relPath) + } return path.join(overlay.basePath, partPath, relPath) } } From 10f00aa18ded9bf7b6a91babc677043f924e043d Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Sun, 8 Mar 2026 17:27:12 +0000 Subject: [PATCH 2/2] backport 17 Beta 2 GPU driver on 10th gen Pixels --- config/device/common/backport.yml | 6 ++++++ config/device/common/gen10pixel.yml | 1 + vendor-specs/google_devices/blazer.yml | 6 +++--- vendor-specs/google_devices/frankel.yml | 6 +++--- vendor-specs/google_devices/mustang.yml | 6 +++--- vendor-specs/google_devices/rango.yml | 6 +++--- 6 files changed, 19 insertions(+), 12 deletions(-) diff --git a/config/device/common/backport.yml b/config/device/common/backport.yml index 58f422659..d4959720a 100644 --- a/config/device/common/backport.yml +++ b/config/device/common/backport.yml @@ -84,3 +84,9 @@ backport_files: - lib64/vendor.samsung_slsi.telephony.hardware.radioExternal-V1-ndk.so - lib64/vendor.samsung_slsi.telephony.hardware.radioExternal@1.0.so - lib64/vendor.samsung_slsi.telephony.hardware.radioExternal@1.1.so + +secondary_backport_files: + vendor: + - lib64/egl/libEGL_powervr.so + - lib64/egl/libGLESv1_CM_powervr.so + - lib64/egl/libGLESv2_powervr.so diff --git a/config/device/common/gen10pixel.yml b/config/device/common/gen10pixel.yml index 7366d4e4c..064cede69 100644 --- a/config/device/common/gen10pixel.yml +++ b/config/device/common/gen10pixel.yml @@ -3,6 +3,7 @@ includes: device: platform: laguna + secondary_backport_build_id: CP21.260206.011 package_exclusions: - com.google.android.apps.bard # Gemini diff --git a/vendor-specs/google_devices/blazer.yml b/vendor-specs/google_devices/blazer.yml index fee8f6560..bdd4704b8 100644 --- a/vendor-specs/google_devices/blazer.yml +++ b/vendor-specs/google_devices/blazer.yml @@ -6464,9 +6464,9 @@ proprietary/vendor/lib64/com.google.input-V2-ndk.so: b684e105868cbda0bf72036e6d5 proprietary/vendor/lib64/com.google.input-V6-ndk.so: 4fcdaff2c2c6b379131acda0957e40ddc3dd705db9dcc10eb819d0c4aa7e1a71 proprietary/vendor/lib64/com.google.pixel.modem.logmasklibrary-V1-ndk.so: ce0d9dc6e84dc57b747101dc5df3b63cb3d596147f4f0cb47753c47179aefa02 proprietary/vendor/lib64/egl: dir -proprietary/vendor/lib64/egl/libEGL_powervr.so: cd5d3bc92837fa0702ef475ed13c564c5d45cbdd9a6935ee0ff248d28ead8619 -proprietary/vendor/lib64/egl/libGLESv1_CM_powervr.so: 9d0049f7efa9b0bc0722475f3af5543e7cf142d026ed5d18fceb2cc8e6f2c139 -proprietary/vendor/lib64/egl/libGLESv2_powervr.so: b5b0282738114813d7299c4fb7e7ae143a72b3ba5a48bce80adf2ccd142d9a5c +proprietary/vendor/lib64/egl/libEGL_powervr.so: 5e9ed7dbc559b12b4960458886970240924069038f066bb6d984a4ffdf57ba5e +proprietary/vendor/lib64/egl/libGLESv1_CM_powervr.so: 6a9f11fd22506054e4ea924df36b17bd4ac5510b873dbe90a872373522d65659 +proprietary/vendor/lib64/egl/libGLESv2_powervr.so: 11c33498c5ea36fd3cb65721a67dce5ab1f9536216ea17db9a2f222896b28320 proprietary/vendor/lib64/fake_gxp_telemetry_reader.so: bcb07d0d5266903934acbbb1dc49ffe8ca55c8d7d213aff132796ff020d368c0 proprietary/vendor/lib64/fake_libtachyon_core.so: cc7027060ac3d4fa27f5c1b6de92b1723b37050994d3ce735f94238957a94d88 proprietary/vendor/lib64/gxp_metrics_logger.so: f913b680c8e2d8b92df5e0d93388ea77ebe10824d60897bc5a9bbf2e56c827e6 diff --git a/vendor-specs/google_devices/frankel.yml b/vendor-specs/google_devices/frankel.yml index e7f844684..fddb21267 100644 --- a/vendor-specs/google_devices/frankel.yml +++ b/vendor-specs/google_devices/frankel.yml @@ -6431,9 +6431,9 @@ proprietary/vendor/lib64/com.google.input-V2-ndk.so: b684e105868cbda0bf72036e6d5 proprietary/vendor/lib64/com.google.input-V6-ndk.so: 4fcdaff2c2c6b379131acda0957e40ddc3dd705db9dcc10eb819d0c4aa7e1a71 proprietary/vendor/lib64/com.google.pixel.modem.logmasklibrary-V1-ndk.so: ce0d9dc6e84dc57b747101dc5df3b63cb3d596147f4f0cb47753c47179aefa02 proprietary/vendor/lib64/egl: dir -proprietary/vendor/lib64/egl/libEGL_powervr.so: cd5d3bc92837fa0702ef475ed13c564c5d45cbdd9a6935ee0ff248d28ead8619 -proprietary/vendor/lib64/egl/libGLESv1_CM_powervr.so: 9d0049f7efa9b0bc0722475f3af5543e7cf142d026ed5d18fceb2cc8e6f2c139 -proprietary/vendor/lib64/egl/libGLESv2_powervr.so: b5b0282738114813d7299c4fb7e7ae143a72b3ba5a48bce80adf2ccd142d9a5c +proprietary/vendor/lib64/egl/libEGL_powervr.so: 5e9ed7dbc559b12b4960458886970240924069038f066bb6d984a4ffdf57ba5e +proprietary/vendor/lib64/egl/libGLESv1_CM_powervr.so: 6a9f11fd22506054e4ea924df36b17bd4ac5510b873dbe90a872373522d65659 +proprietary/vendor/lib64/egl/libGLESv2_powervr.so: 11c33498c5ea36fd3cb65721a67dce5ab1f9536216ea17db9a2f222896b28320 proprietary/vendor/lib64/fake_gxp_telemetry_reader.so: bcb07d0d5266903934acbbb1dc49ffe8ca55c8d7d213aff132796ff020d368c0 proprietary/vendor/lib64/fake_libtachyon_core.so: cc7027060ac3d4fa27f5c1b6de92b1723b37050994d3ce735f94238957a94d88 proprietary/vendor/lib64/gxp_metrics_logger.so: f913b680c8e2d8b92df5e0d93388ea77ebe10824d60897bc5a9bbf2e56c827e6 diff --git a/vendor-specs/google_devices/mustang.yml b/vendor-specs/google_devices/mustang.yml index 615a24cf3..4a9f53acc 100644 --- a/vendor-specs/google_devices/mustang.yml +++ b/vendor-specs/google_devices/mustang.yml @@ -6465,9 +6465,9 @@ proprietary/vendor/lib64/com.google.input-V2-ndk.so: b684e105868cbda0bf72036e6d5 proprietary/vendor/lib64/com.google.input-V6-ndk.so: 4fcdaff2c2c6b379131acda0957e40ddc3dd705db9dcc10eb819d0c4aa7e1a71 proprietary/vendor/lib64/com.google.pixel.modem.logmasklibrary-V1-ndk.so: ce0d9dc6e84dc57b747101dc5df3b63cb3d596147f4f0cb47753c47179aefa02 proprietary/vendor/lib64/egl: dir -proprietary/vendor/lib64/egl/libEGL_powervr.so: cd5d3bc92837fa0702ef475ed13c564c5d45cbdd9a6935ee0ff248d28ead8619 -proprietary/vendor/lib64/egl/libGLESv1_CM_powervr.so: 9d0049f7efa9b0bc0722475f3af5543e7cf142d026ed5d18fceb2cc8e6f2c139 -proprietary/vendor/lib64/egl/libGLESv2_powervr.so: b5b0282738114813d7299c4fb7e7ae143a72b3ba5a48bce80adf2ccd142d9a5c +proprietary/vendor/lib64/egl/libEGL_powervr.so: 5e9ed7dbc559b12b4960458886970240924069038f066bb6d984a4ffdf57ba5e +proprietary/vendor/lib64/egl/libGLESv1_CM_powervr.so: 6a9f11fd22506054e4ea924df36b17bd4ac5510b873dbe90a872373522d65659 +proprietary/vendor/lib64/egl/libGLESv2_powervr.so: 11c33498c5ea36fd3cb65721a67dce5ab1f9536216ea17db9a2f222896b28320 proprietary/vendor/lib64/fake_gxp_telemetry_reader.so: bcb07d0d5266903934acbbb1dc49ffe8ca55c8d7d213aff132796ff020d368c0 proprietary/vendor/lib64/fake_libtachyon_core.so: cc7027060ac3d4fa27f5c1b6de92b1723b37050994d3ce735f94238957a94d88 proprietary/vendor/lib64/gxp_metrics_logger.so: f913b680c8e2d8b92df5e0d93388ea77ebe10824d60897bc5a9bbf2e56c827e6 diff --git a/vendor-specs/google_devices/rango.yml b/vendor-specs/google_devices/rango.yml index 787235c61..cd4624029 100644 --- a/vendor-specs/google_devices/rango.yml +++ b/vendor-specs/google_devices/rango.yml @@ -6749,9 +6749,9 @@ proprietary/vendor/lib64/com.google.input-V2-ndk.so: b684e105868cbda0bf72036e6d5 proprietary/vendor/lib64/com.google.input-V6-ndk.so: 4fcdaff2c2c6b379131acda0957e40ddc3dd705db9dcc10eb819d0c4aa7e1a71 proprietary/vendor/lib64/com.google.pixel.modem.logmasklibrary-V1-ndk.so: ce0d9dc6e84dc57b747101dc5df3b63cb3d596147f4f0cb47753c47179aefa02 proprietary/vendor/lib64/egl: dir -proprietary/vendor/lib64/egl/libEGL_powervr.so: cd5d3bc92837fa0702ef475ed13c564c5d45cbdd9a6935ee0ff248d28ead8619 -proprietary/vendor/lib64/egl/libGLESv1_CM_powervr.so: 9d0049f7efa9b0bc0722475f3af5543e7cf142d026ed5d18fceb2cc8e6f2c139 -proprietary/vendor/lib64/egl/libGLESv2_powervr.so: b5b0282738114813d7299c4fb7e7ae143a72b3ba5a48bce80adf2ccd142d9a5c +proprietary/vendor/lib64/egl/libEGL_powervr.so: 5e9ed7dbc559b12b4960458886970240924069038f066bb6d984a4ffdf57ba5e +proprietary/vendor/lib64/egl/libGLESv1_CM_powervr.so: 6a9f11fd22506054e4ea924df36b17bd4ac5510b873dbe90a872373522d65659 +proprietary/vendor/lib64/egl/libGLESv2_powervr.so: 11c33498c5ea36fd3cb65721a67dce5ab1f9536216ea17db9a2f222896b28320 proprietary/vendor/lib64/fake_gxp_telemetry_reader.so: bcb07d0d5266903934acbbb1dc49ffe8ca55c8d7d213aff132796ff020d368c0 proprietary/vendor/lib64/fake_libtachyon_core.so: cc7027060ac3d4fa27f5c1b6de92b1723b37050994d3ce735f94238957a94d88 proprietary/vendor/lib64/goodix_sfps_suez.so: 92d1710b9d3cb694a41699edd2d8171fd9f54980e6d99ded74503272532a9b07