From 68baef3f03f722df8c9cbf060980455288704e9d Mon Sep 17 00:00:00 2001 From: ReenigneCA <15387520+ReenigneCA@users.noreply.github.com> Date: Sat, 5 Feb 2022 14:38:12 -0500 Subject: [PATCH] Added script to generate all android versions and script to create AAR (#1155) * Added script to generate all android versions and script to create AAR with prefab * disable-pie so x86 static lib works. Update AAR to fix bug related to soname field in .so files themselves. Integrate android-all.sh into android-aar.sh * Missed updated android-build.sh in last commit. This adds --disable-pie to the configure flags * Added message after android-aar compilation explaining aar usage --- dist-build/Makefile.am | 1 + dist-build/android-aar.sh | 136 ++++++++++++++++++++++++++++++++++++ dist-build/android-build.sh | 2 + 3 files changed, 139 insertions(+) create mode 100755 dist-build/android-aar.sh diff --git a/dist-build/Makefile.am b/dist-build/Makefile.am index 2513259a..7bea4fbb 100644 --- a/dist-build/Makefile.am +++ b/dist-build/Makefile.am @@ -1,6 +1,7 @@ EXTRA_DIST = \ android-build.sh \ + android-aar.sh \ android-armv7-a.sh \ android-armv8-a.sh \ android-x86.sh \ diff --git a/dist-build/android-aar.sh b/dist-build/android-aar.sh new file mode 100755 index 00000000..e251700a --- /dev/null +++ b/dist-build/android-aar.sh @@ -0,0 +1,136 @@ +#!/bin/sh + +#creates an AAR with libsodium in 4 configurations all combinations of static | shared | minimal | full +#the x86 static library will not work due to text relocation rules and so all static x86 versions are just the shared library +#to simplify linking each version of the library is given a different name sodium, sodium-static, sodium-minimal and sodium-minimal-static + +SODIUM_VERSION="1.0.18.0" +NDK_VERSION=$(grep "Pkg.Revision = " <"$ANDROID_NDK_HOME/source.properties" | cut -f 2 -d '=' | cut -f 2 -d' ' | cut -f 1 -d'.') +DEST_PATH=$(mktemp -d) + +cd "$(dirname "$0")/../" || exit + +make_abi_json() { + echo "{\"abi\":\"$NDK_ARCH\",\"api\":$SDK_VERSION,\"ndk\":$NDK_VERSION,\"stl\":\"none\"}" >"$1/abi.json" +} + +make_prefab_json() { + echo "{\"name\":\"sodium\",\"schema_version\":1,\"dependencies\":[],\"version\":\"$SODIUM_VERSION\"}" >"$1/prefab.json" +} + +make_manifest() { + echo " + +" >"$1/AndroidManifest.xml" + +} + +make_prefab_structure() { + mkdir "$DEST_PATH" + for i in "prefab" "prefab/modules" "META-INF"; do + mkdir "$DEST_PATH/$i" + done + make_prefab_json "$DEST_PATH/prefab" + make_manifest "$DEST_PATH" + cp "LICENSE" "$DEST_PATH/META-INF" + for i in "prefab/modules/sodium" "prefab/modules/sodium-static" "prefab/modules/sodium-minimal" "prefab/modules/sodium-minimal-static"; do + mkdir "$DEST_PATH/$i" + if [ "$i" = "prefab/modules/sodium-minimal" ]; then + echo "{\"library_name\":\"libsodium\"}" >"$DEST_PATH/$i/module.json" + else + echo "{}" >"$DEST_PATH/$i/module.json" + fi + mkdir "$DEST_PATH/$i/libs" + for j in "arm64-v8a" "armeabi-v7a" "x86" "x86_64"; do + mkdir "$DEST_PATH/$i/libs/android.$j" + mkdir "$DEST_PATH/$i/libs/android.$j/include" + NDK_ARCH="$j" + if [ $j = "arm64-v8a" ] || [ $j = "x86_64" ]; then + SDK_VERSION="21" + else + SDK_VERSION="19" + + fi + + make_abi_json "$DEST_PATH/$i/libs/android.$j" + + done + done +} + +copy_libs() { + SRC_DIR="libsodium-android-$1" + + SHARED_DEST_DIR="$DEST_PATH/prefab/modules/sodium$3/libs/android.$2" + STATIC_DEST_DIR="$DEST_PATH/prefab/modules/sodium$3-static/libs/android.$2" + + cp -r "$SRC_DIR/include" "$SHARED_DEST_DIR" + cp -r "$SRC_DIR/include" "$STATIC_DEST_DIR" + cp "$SRC_DIR/lib/libsodium.so" "$SHARED_DEST_DIR/libsodium.so" + cp "$SRC_DIR/lib/libsodium.a" "$STATIC_DEST_DIR/libsodium$3-static.a" + + rm -r "$SRC_DIR" +} + +build_all() { + + dist-build/android-armv7-a.sh + dist-build/android-armv8-a.sh + dist-build/android-x86_64.sh + dist-build/android-x86.sh + +} + +make_prefab_structure + +build_all + +copy_libs "armv7-a" "armeabi-v7a" "-minimal" +copy_libs "armv8-a+crypto" "arm64-v8a" "-minimal" +copy_libs "i686" "x86" "-minimal" +copy_libs "westmere" "x86_64" "-minimal" + +LIBSODIUM_FULL_BUILD="Y" +export LIBSODIUM_FULL_BUILD + +build_all + +copy_libs "armv7-a" "armeabi-v7a" +copy_libs "armv8-a+crypto" "arm64-v8a" +copy_libs "i686" "x86" +copy_libs "westmere" "x86_64" + +AAR_PATH="$(pwd)/libsodium-$SODIUM_VERSION.aar" +cd "$DEST_PATH" || exit +rm "$AAR_PATH" +zip -r "$AAR_PATH" META-INF prefab AndroidManifest.xml +cd .. || exit +rm -r "$DEST_PATH" +clear +echo "congrats you have built an AAR containing libsodium. To use it with +gradle / cmake (defaults for Android Studio projects) simply: + +edit the app/build.gradle file to add: + + android { + buildFeatures { + prefab true + } + } + + #and + dependencies { + implementation fileTree(dir:'path/to/aar/',include:['libsodium-$SODIUM_VERSION.aar']) + } + #you can optionally store multiple AAR files in the same folder and include '*.aar' + +edit your module's CMakeLists.txt file to add: + + find_package(sodium REQUIRED CONFIG) + + # the specify sodium::sodium as an item in the relevant target_link_libraries statement + # the first value specifies the AAR and is always sodium the second is the library + # name which supports sodium for the full shared library sodium-static + # for the full static library sodium-minimal for the minimal shared library + # or sodium-minimal-static for the minimal static library" + diff --git a/dist-build/android-build.sh b/dist-build/android-build.sh index 07413a96..e8d65b23 100755 --- a/dist-build/android-build.sh +++ b/dist-build/android-build.sh @@ -55,6 +55,7 @@ fi ./configure \ --disable-soname-versions \ + --disable-pie \ ${LIBSODIUM_ENABLE_MINIMAL_FLAG} \ --host="${HOST_COMPILER}" \ --prefix="${PREFIX}" \ @@ -68,6 +69,7 @@ if [ "$NDK_PLATFORM" != "$NDK_PLATFORM_COMPAT" ]; then ./configure \ --disable-soname-versions \ + --disable-pie \ ${LIBSODIUM_ENABLE_MINIMAL_FLAG} \ --host="${HOST_COMPILER}" \ --prefix="${PREFIX}" \