#!/bin/sh # Build rsync for each Android ABI from pinned source via the NDK. Output is a # stripped PIE executable named lib*.so, packaged inside the APK and exec'd from # nativeLibraryDir. Optional dependencies are disabled so the binary needs # nothing outside Bionic; zlib and popt come from rsync's bundled copies. set -eu root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) . "$root/versions" # Locate the NDK toolchain. ndk=${ANDROID_NDK_HOME:-${ANDROID_NDK_ROOT:-}} if [ -z "$ndk" ] && [ -n "${ANDROID_HOME:-}" ]; then ndk="$ANDROID_HOME/ndk/$ANDROID_NDK" fi if [ -z "$ndk" ] || [ ! -d "$ndk" ]; then echo "rsync: Android NDK not found; set ANDROID_NDK_HOME" >&2 exit 1 fi tc="$ndk/toolchains/llvm/prebuilt/linux-x86_64/bin" work="$root/rsync/work" tarball="$root/rsync/rsync-${RSYNC_VERSION}.tar.gz" src="$work/rsync-${RSYNC_VERSION}" # Fetch and verify the pinned source tarball. mkdir -p "$work" if [ ! -f "$tarball" ]; then echo "rsync: fetching $RSYNC_URL" curl -fsSL "$RSYNC_URL" -o "$tarball" fi echo "rsync: verifying sha256" ( cd "$root/rsync" && sha256sum -c "rsync-${RSYNC_VERSION}.tar.gz.sha256" ) # No system libraries, no docs (md2man needs python3), no iconv. flags="--disable-md2man --disable-openssl --disable-xxhash --disable-zstd \ --disable-lz4 --disable-iconv --disable-acl-support --disable-xattr-support \ --with-included-popt --with-included-zlib" for abi in $ABIS; do case "$abi" in arm64-v8a) host=aarch64-linux-android cc="aarch64-linux-android${ANDROID_MIN_SDK}-clang" ;; armeabi-v7a) host=arm-linux-androideabi cc="armv7a-linux-androideabi${ANDROID_MIN_SDK}-clang" ;; x86_64) host=x86_64-linux-android cc="x86_64-linux-android${ANDROID_MIN_SDK}-clang" ;; x86) host=i686-linux-android cc="i686-linux-android${ANDROID_MIN_SDK}-clang" ;; *) echo "rsync: unknown ABI $abi" >&2; exit 1 ;; esac # Fresh build tree per ABI. rm -rf "$src" tar xzf "$tarball" -C "$work" echo "rsync: configuring $abi" ( cd "$src" && \ CC="$tc/$cc" AR="$tc/llvm-ar" RANLIB="$tc/llvm-ranlib" \ CFLAGS="-O2 -fPIE -ffile-prefix-map=$src=." LDFLAGS="-pie" \ ./configure --host="$host" $flags >/dev/null ) echo "rsync: building $abi" ( cd "$src" && make -s rsync ) dest="$root/app/src/main/jniLibs/$abi" mkdir -p "$dest" cp "$src/rsync" "$dest/libxrsync.so" "$tc/llvm-strip" "$dest/libxrsync.so" echo "rsync: $abi -> jniLibs/$abi/libxrsync.so" done