extract_utils: Add functions to extract vendor blobs from vendor.img
Change-Id: I6f37adc955856fa78e719eb30249800abe80020c
This commit is contained in:
committed by
Sam Mortimer
parent
a7b2d0a620
commit
1c29c373dd
@@ -210,6 +210,25 @@ function prefix_match_file() {
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# suffix_match_file:
|
||||
#
|
||||
# $1: the suffix to match on
|
||||
# $2: the file to match the suffix for
|
||||
#
|
||||
# Internal function which returns true if a filename contains the
|
||||
# specified suffix.
|
||||
#
|
||||
function suffix_match_file() {
|
||||
local SUFFIX="$1"
|
||||
local FILE="$2"
|
||||
if [[ "$FILE" = *"$SUFFIX" ]]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# truncate_file
|
||||
#
|
||||
@@ -1268,3 +1287,94 @@ function extract_firmware() {
|
||||
chmod 644 "$OUTPUT_DIR/$FILE"
|
||||
done
|
||||
}
|
||||
|
||||
function extract_img_data() {
|
||||
local image_file="$1"
|
||||
local out_dir="$2"
|
||||
local logFile="$TMPDIR/debugfs.log"
|
||||
|
||||
if [ ! -d "$out_dir" ]; then
|
||||
mkdir -p "$out_dir"
|
||||
fi
|
||||
|
||||
if [[ "$HOST_OS" == "Darwin" ]]; then
|
||||
debugfs -R "rdump / \"$out_dir\"" "$image_file" &> "$logFile" || {
|
||||
echo "[-] Failed to extract data from '$image_file'"
|
||||
abort 1
|
||||
}
|
||||
else
|
||||
debugfs -R 'ls -p' "$image_file" 2>/dev/null | cut -d '/' -f6 | while read -r entry
|
||||
do
|
||||
debugfs -R "rdump \"$entry\" \"$out_dir\"" "$image_file" >> "$logFile" 2>&1 || {
|
||||
echo "[-] Failed to extract data from '$image_file'"
|
||||
abort 1
|
||||
}
|
||||
done
|
||||
fi
|
||||
|
||||
local symlink_err="rdump: Attempt to read block from filesystem resulted in short read while reading symlink"
|
||||
if grep -Fq "$symlink_err" "$logFile"; then
|
||||
echo "[-] Symlinks have not been properly processed from $image_file"
|
||||
echo "[!] If you don't have a compatible debugfs version, modify 'execute-all.sh' to disable 'USE_DEBUGFS' flag"
|
||||
abort 1
|
||||
fi
|
||||
}
|
||||
|
||||
declare -ra VENDOR_SKIP_FILES=(
|
||||
"bin/toybox_vendor"
|
||||
"bin/toolbox"
|
||||
"bin/grep"
|
||||
"build.prop"
|
||||
"compatibility_matrix.xml"
|
||||
"default.prop"
|
||||
"etc/NOTICE.xml.gz"
|
||||
"etc/vintf/compatibility_matrix.xml"
|
||||
"etc/vintf/manifest.xml"
|
||||
"etc/wifi/wpa_supplicant.conf"
|
||||
"manifest.xml"
|
||||
"overlay/DisplayCutoutEmulationCorner/DisplayCutoutEmulationCornerOverlay.apk"
|
||||
"overlay/DisplayCutoutEmulationDouble/DisplayCutoutEmulationDoubleOverlay.apk"
|
||||
"overlay/DisplayCutoutEmulationTall/DisplayCutoutEmulationTallOverlay.apk"
|
||||
"overlay/DisplayCutoutNoCutout/NoCutoutOverlay.apk"
|
||||
"overlay/framework-res__auto_generated_rro.apk"
|
||||
"overlay/SysuiDarkTheme/SysuiDarkThemeOverlay.apk"
|
||||
)
|
||||
|
||||
function array_contains() {
|
||||
local element
|
||||
for element in "${@:2}"; do [[ "$element" == "$1" ]] && return 0; done
|
||||
return 1
|
||||
}
|
||||
|
||||
function generate_prop_list_from_image() {
|
||||
local image_file="$1"
|
||||
local image_dir="$TMPDIR/image-temp"
|
||||
local output_list="$2"
|
||||
local output_list_tmp="$TMPDIR/_proprietary-blobs.txt"
|
||||
local -n skipped_vendor_files="$3"
|
||||
|
||||
extract_img_data "$image_file" "$image_dir"
|
||||
|
||||
find "$image_dir" -not -type d | sed "s#^$image_dir/##" | while read -r FILE
|
||||
do
|
||||
# Skip VENDOR_SKIP_FILES since it will be re-generated at build time
|
||||
if array_contains "$FILE" "${VENDOR_SKIP_FILES[@]}"; then
|
||||
continue
|
||||
fi
|
||||
# Skip device defined skipped files since they will be re-generated at build time
|
||||
if array_contains "$FILE" "${skipped_vendor_files[@]}"; then
|
||||
continue
|
||||
fi
|
||||
if suffix_match_file ".apk" "$FILE" ; then
|
||||
echo "-vendor/$FILE" >> "$output_list_tmp"
|
||||
else
|
||||
echo "vendor/$FILE" >> "$output_list_tmp"
|
||||
fi
|
||||
done
|
||||
|
||||
# Sort merged file with all lists
|
||||
sort -u "$output_list_tmp" > "$output_list"
|
||||
|
||||
# Clean-up
|
||||
rm -f "$output_list_tmp"
|
||||
}
|
||||
|
Reference in New Issue
Block a user