92 lines
2.5 KiB
Bash
Executable File
92 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
readonly REQUIRED_PAGE_SIZE=$((16 * 1024))
|
|
|
|
usage() {
|
|
echo "Usage: $0 path/to/app-pixel10-release.apk" >&2
|
|
}
|
|
|
|
if [[ $# -ne 1 ]]; then
|
|
usage
|
|
exit 2
|
|
fi
|
|
|
|
apk="$1"
|
|
if [[ ! -f "$apk" ]]; then
|
|
echo "APK not found: $apk" >&2
|
|
exit 1
|
|
fi
|
|
|
|
for command_name in unzip readelf; do
|
|
if ! command -v "$command_name" >/dev/null 2>&1; then
|
|
echo "Required command not found: $command_name" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
native_entries="$(unzip -Z1 "$apk" | sed -n '/^lib\/.*\.so$/p')"
|
|
if [[ -z "$native_entries" ]]; then
|
|
echo "No native libraries found in $apk" >&2
|
|
exit 1
|
|
fi
|
|
|
|
unexpected_abis=()
|
|
while IFS= read -r entry; do
|
|
if [[ "$entry" != lib/arm64-v8a/* ]]; then
|
|
unexpected_abis+=("$entry")
|
|
fi
|
|
done <<< "$native_entries"
|
|
|
|
if [[ ${#unexpected_abis[@]} -gt 0 ]]; then
|
|
echo "Pixel 10 APK contains non-ARM64 native libraries:" >&2
|
|
printf ' %s\n' "${unexpected_abis[@]}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
temporary_root="${TMPDIR:-/tmp}"
|
|
if [[ ! -d "$temporary_root" || ! -w "$temporary_root" ]]; then
|
|
temporary_root="$PWD"
|
|
fi
|
|
temporary_directory="$(mktemp -d "$temporary_root/mrbweblibre-verify.XXXXXX")"
|
|
trap 'rm -rf -- "$temporary_directory"' EXIT
|
|
unzip -qq "$apk" 'lib/arm64-v8a/*.so' -d "$temporary_directory"
|
|
|
|
failures=0
|
|
checked=0
|
|
native_library_list="$temporary_directory/native-libraries.list"
|
|
find "$temporary_directory/lib/arm64-v8a" -type f -name '*.so' -print0 > "$native_library_list"
|
|
while IFS= read -r -d '' library; do
|
|
checked=$((checked + 1))
|
|
machine="$(readelf -hW "$library" | sed -n 's/^[[:space:]]*Machine:[[:space:]]*//p')"
|
|
if [[ "$machine" != "AArch64" ]]; then
|
|
echo "Architecture failure: ${library#"$temporary_directory"/} is $machine, expected AArch64" >&2
|
|
failures=$((failures + 1))
|
|
continue
|
|
fi
|
|
|
|
load_alignments="$(readelf -lW "$library" | awk '$1 == "LOAD" { print $NF }')"
|
|
|
|
if [[ -z "$load_alignments" ]]; then
|
|
echo "No ELF LOAD segments found: ${library#"$temporary_directory"/}" >&2
|
|
failures=$((failures + 1))
|
|
continue
|
|
fi
|
|
|
|
while IFS= read -r alignment; do
|
|
if (( alignment < REQUIRED_PAGE_SIZE )); then
|
|
echo "16 KB alignment failure: ${library#"$temporary_directory"/} has LOAD alignment $alignment" >&2
|
|
failures=$((failures + 1))
|
|
break
|
|
fi
|
|
done <<< "$load_alignments"
|
|
done < "$native_library_list"
|
|
|
|
if (( failures > 0 )); then
|
|
echo "Pixel 10 compatibility verification failed ($failures issue(s))." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "Pixel 10 APK verified: ARM64-only; $checked native libraries use 16 KB-compatible ELF alignment."
|