build-apk.sh 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #!/bin/bash
  2. set -e
  3. PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
  4. BUILD_DIR="$PROJECT_DIR/build"
  5. APK_DIR="$BUILD_DIR/apk"
  6. MANIFEST="$PROJECT_DIR/android/AndroidManifest.xml"
  7. ASSETS_DIR="$PROJECT_DIR/assets"
  8. SO_FILE="$BUILD_DIR/libuidef-tool.so"
  9. ANDROID_JAR="$HOME/android.jar"
  10. JAVA_SRC_DIR="$PROJECT_DIR/android/java"
  11. RES_DIR="$PROJECT_DIR/android/res"
  12. # Check prerequisites
  13. if [ ! -f "$SO_FILE" ]; then
  14. echo "ERROR: libuidef-tool.so not found. Run cmake --build build first."
  15. exit 1
  16. fi
  17. echo "=== Building APK ==="
  18. # Clean staging area
  19. rm -rf "$APK_DIR"
  20. mkdir -p "$APK_DIR/lib/arm64-v8a"
  21. mkdir -p "$APK_DIR/assets"
  22. # 1. Copy shared libraries (strip Termux RUNPATH first)
  23. cp "$SO_FILE" "$APK_DIR/lib/arm64-v8a/"
  24. if command -v patchelf &>/dev/null; then
  25. patchelf --remove-rpath "$APK_DIR/lib/arm64-v8a/libuidef-tool.so"
  26. fi
  27. # Bundle libc++_shared.so (NDK builds link against it dynamically)
  28. LIBCXX="$PREFIX/lib/libc++_shared.so"
  29. if [ -f "$LIBCXX" ]; then
  30. cp "$LIBCXX" "$APK_DIR/lib/arm64-v8a/"
  31. fi
  32. # libxml2 is loaded via dlopen at runtime (not bundled)
  33. # XSD validation will gracefully degrade if unavailable
  34. echo "[1/7] Copied shared libraries"
  35. # 2. Copy assets
  36. cp -r "$ASSETS_DIR"/* "$APK_DIR/assets/"
  37. echo "[2/7] Copied assets"
  38. # 3. Compile Java sources to classes.dex
  39. JAVA_BUILD="$BUILD_DIR/java_build"
  40. rm -rf "$JAVA_BUILD"
  41. mkdir -p "$JAVA_BUILD/classes"
  42. javac -source 8 -target 8 \
  43. -bootclasspath "$ANDROID_JAR" \
  44. -d "$JAVA_BUILD/classes" \
  45. "$JAVA_SRC_DIR"/com/uidef/edit/*.java
  46. d8 --output "$JAVA_BUILD" "$JAVA_BUILD"/classes/com/uidef/edit/*.class
  47. echo "[3/7] Compiled Java to DEX"
  48. # 4. Compile and link resources with aapt2
  49. RES_COMPILED="$BUILD_DIR/res_compiled"
  50. rm -rf "$RES_COMPILED"
  51. mkdir -p "$RES_COMPILED"
  52. # Compile each resource directory
  53. if [ -d "$RES_DIR" ]; then
  54. for res_subdir in "$RES_DIR"/*/; do
  55. if [ -d "$res_subdir" ]; then
  56. aapt2 compile -o "$RES_COMPILED" "$res_subdir"*
  57. fi
  58. done
  59. fi
  60. # Collect all compiled .flat files
  61. FLAT_FILES=""
  62. if [ -d "$RES_COMPILED" ]; then
  63. FLAT_FILES=$(find "$RES_COMPILED" -name "*.flat" -type f 2>/dev/null | tr '\n' ' ')
  64. fi
  65. aapt2 link \
  66. --manifest "$MANIFEST" \
  67. -I "$ANDROID_JAR" \
  68. --min-sdk-version 26 \
  69. --target-sdk-version 26 \
  70. -o "$BUILD_DIR/base.apk" \
  71. --auto-add-overlay \
  72. $FLAT_FILES
  73. echo "[4/7] Linked resources"
  74. # 5. Add .so, assets, and classes.dex into the APK (it's a zip)
  75. cd "$APK_DIR"
  76. zip -r "$BUILD_DIR/base.apk" lib/ assets/
  77. cd "$JAVA_BUILD"
  78. zip -j "$BUILD_DIR/base.apk" classes.dex
  79. cd "$PROJECT_DIR"
  80. echo "[5/7] Added libs, assets, and DEX"
  81. # 6. Zipalign
  82. zipalign -f 4 "$BUILD_DIR/base.apk" "$BUILD_DIR/aligned.apk"
  83. echo "[6/7] Zipaligned"
  84. # 7. Sign with debug key
  85. KEYSTORE="$BUILD_DIR/debug.keystore"
  86. if [ ! -f "$KEYSTORE" ]; then
  87. echo " Generating debug keystore..."
  88. keytool -genkeypair \
  89. -keystore "$KEYSTORE" \
  90. -alias debug \
  91. -keyalg RSA \
  92. -keysize 2048 \
  93. -validity 10000 \
  94. -storepass android \
  95. -keypass android \
  96. -dname "CN=Debug,O=Debug,C=US"
  97. fi
  98. apksigner sign \
  99. --ks "$KEYSTORE" \
  100. --ks-key-alias debug \
  101. --ks-pass pass:android \
  102. --key-pass pass:android \
  103. --out "$BUILD_DIR/uidef-edit.apk" \
  104. "$BUILD_DIR/aligned.apk"
  105. echo "[7/7] Signed APK"
  106. # Cleanup intermediates
  107. rm -f "$BUILD_DIR/base.apk" "$BUILD_DIR/aligned.apk"
  108. echo ""
  109. echo "=== APK built: $BUILD_DIR/uidef-edit.apk ==="
  110. ls -lh "$BUILD_DIR/uidef-edit.apk"