You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.0 KiB
Bash
111 lines
3.0 KiB
Bash
#!/bin/bash
|
|
|
|
# Check ELF .so alignment in APK for 16KB page size compatibility
|
|
# Files must have PT_LOAD segments aligned to 16384 bytes (0x4000)
|
|
|
|
APK="${1:-/Users/mohamedmekawy/Documents/Work/HMG_Patient_App_New/android/app/release/app-release.apk}"
|
|
LLVM_READELF="/Users/mohamedmekawy/Library/Android/sdk/ndk/28.2.13676358/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf"
|
|
EXTRACT_DIR="/tmp/apk_alignment_check"
|
|
REQUIRED_ALIGNMENT=16384 # 16 KB
|
|
|
|
echo "========================================"
|
|
echo " ELF Alignment Check for 16KB Page Size"
|
|
echo "========================================"
|
|
echo "APK: $APK"
|
|
echo ""
|
|
|
|
if [ ! -f "$APK" ]; then
|
|
echo "ERROR: APK not found at $APK"
|
|
exit 1
|
|
fi
|
|
|
|
# Clean and extract APK
|
|
rm -rf "$EXTRACT_DIR"
|
|
mkdir -p "$EXTRACT_DIR"
|
|
unzip -q "$APK" -d "$EXTRACT_DIR"
|
|
|
|
# Find all .so files
|
|
SO_FILES=$(find "$EXTRACT_DIR" -name "*.so")
|
|
|
|
if [ -z "$SO_FILES" ]; then
|
|
echo "No .so files found in APK."
|
|
exit 0
|
|
fi
|
|
|
|
FAILED=()
|
|
PASSED=()
|
|
|
|
for SO in $SO_FILES; do
|
|
RELATIVE="${SO#$EXTRACT_DIR/}"
|
|
|
|
# Check if it's a valid ELF
|
|
MAGIC=$(xxd -l 4 "$SO" 2>/dev/null | head -1)
|
|
if [[ "$MAGIC" != *"7f45 4c46"* ]]; then
|
|
continue
|
|
fi
|
|
|
|
# Use llvm-readelf from NDK
|
|
READELF_OUTPUT=$("$LLVM_READELF" -l "$SO" 2>/dev/null)
|
|
|
|
if [ -z "$READELF_OUTPUT" ]; then
|
|
echo "⚠️ SKIP (readelf unavailable): $RELATIVE"
|
|
continue
|
|
fi
|
|
|
|
# Extract LOAD segment alignments
|
|
MISALIGNED=false
|
|
while IFS= read -r line; do
|
|
if [[ "$line" == *"LOAD"* ]]; then
|
|
# Get the last field (Align column)
|
|
ALIGN=$(echo "$line" | awk '{print $NF}')
|
|
# Convert hex to decimal if needed
|
|
if [[ "$ALIGN" == 0x* ]]; then
|
|
ALIGN_DEC=$((ALIGN))
|
|
else
|
|
ALIGN_DEC=$ALIGN
|
|
fi
|
|
|
|
if [[ "$ALIGN_DEC" =~ ^[0-9]+$ ]]; then
|
|
if [ "$ALIGN_DEC" -lt "$REQUIRED_ALIGNMENT" ] && [ "$ALIGN_DEC" -gt 0 ]; then
|
|
MISALIGNED=true
|
|
ALIGN_KB=$((ALIGN_DEC / 1024))
|
|
echo "❌ FAIL (${ALIGN_KB}KB aligned): $RELATIVE"
|
|
break
|
|
fi
|
|
fi
|
|
fi
|
|
done <<< "$READELF_OUTPUT"
|
|
|
|
if [ "$MISALIGNED" = false ]; then
|
|
ALIGN_LINE=$(echo "$READELF_OUTPUT" | grep "LOAD" | head -1 | awk '{print $NF}')
|
|
echo "✅ PASS ($ALIGN_LINE aligned): $RELATIVE"
|
|
PASSED+=("$RELATIVE")
|
|
else
|
|
FAILED+=("$RELATIVE")
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo "========================================"
|
|
echo "SUMMARY"
|
|
echo "========================================"
|
|
echo "✅ Passed (16KB+ aligned): ${#PASSED[@]}"
|
|
echo "❌ Failed (< 16KB aligned): ${#FAILED[@]}"
|
|
|
|
if [ ${#FAILED[@]} -gt 0 ]; then
|
|
echo ""
|
|
echo "The following .so files are NOT 16KB page aligned:"
|
|
for f in "${FAILED[@]}"; do
|
|
echo " - $f"
|
|
done
|
|
echo ""
|
|
echo "These files will cause issues on Android 15+ devices with 16KB page size."
|
|
else
|
|
echo ""
|
|
echo "All .so files are 16KB page aligned. ✅"
|
|
fi
|
|
|
|
# Cleanup
|
|
rm -rf "$EXTRACT_DIR"
|
|
|