16 KB page alignment updates
parent
333f702f80
commit
c12c90651e
Binary file not shown.
Binary file not shown.
@ -0,0 +1,110 @@
|
||||
#!/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"
|
||||
|
||||
Loading…
Reference in New Issue