extract_utils: Add functions to extract vendor blobs from vendor.img

Change-Id: I6f37adc955856fa78e719eb30249800abe80020c
gugelfrei
Rashed Abdel-Tawab 5 years ago 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"
}

Loading…
Cancel
Save