|
|
|
@ -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"
|
|
|
|
|
}
|
|
|
|
|