From 1c29c373dd4259a7fabea9c8333b623ff3d8bb13 Mon Sep 17 00:00:00 2001 From: Rashed Abdel-Tawab Date: Fri, 29 Mar 2019 20:07:25 -0700 Subject: [PATCH] extract_utils: Add functions to extract vendor blobs from vendor.img Change-Id: I6f37adc955856fa78e719eb30249800abe80020c --- build/tools/extract_utils.sh | 110 +++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/build/tools/extract_utils.sh b/build/tools/extract_utils.sh index fb39fa91..00a998a4 100644 --- a/build/tools/extract_utils.sh +++ b/build/tools/extract_utils.sh @@ -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" +}