diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8082ab991..299e02d3d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ deploy: - image: gradle:6.5-jdk11 + image: registry.gitlab.com/retroshare/retroshare:android_aar_base_16 script: - - './gradlew publish' + - './gradlew build publish -Dorg.gradle.project.buildDir=/libretroshare-build/ -PANDROID_MIN_API_LEVEL=16 -PLIBRETROSHARE_SOURCE_VERSION="$CI_COMMIT_SHORT_SHA" -PNATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/"' only: - gitlab_maven_repo diff --git a/build.gradle b/build.gradle index dfe00637d..e63f6f6c9 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,24 @@ * SPDX-License-Identifier: CC0-1.0 */ +/* + * Set minumum Android API level supported by this build passing + * -PANDROID_MIN_API_LEVEL=16 (change 16 to what you need) on the gradle command + * line. + * + * LIBRETROSHARE_SOURCE_VERSION Set source version ex: + * -PLIBRETROSHARE_SOURCE_VERSION="$(git describe --always)" + * + * Optionally set JNI_NATIVE_LIBS_ARCHS to a space separated target CPU + * architectures list named as seen in AAR native libraries directories passing + * -PJNI_NATIVE_LIBS_ARCHS="arm64-v8a armeabi-v7a" defaults to all architectures + * supported by current script at current Android minimum API + * + * Optionally set NATIVE_TOOLCHAINS_DIR for easier reuse of toolchains which + * take a lot to build and doesn't change often + * -PNATIVE_TOOLCHAINS_DIR="/native/toolchains/path" + */ + buildscript { repositories @@ -32,6 +50,9 @@ allprojects } } +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' + ext.buildLibretroshareNativeLib = { pApiLevel, /* Android API level */ @@ -58,7 +79,16 @@ ext.buildLibretroshareNativeLib = break; } - def toolchainsWorkdir = "${buildDir}/native_toolchains/" + def toolchainsWorkdir = null + if(project.hasProperty('NATIVE_TOOLCHAINS_DIR')) + { + toolchainsWorkdir = NATIVE_TOOLCHAINS_DIR + } + else + { + toolchainsWorkdir = "${buildDir}/native_toolchains/" + } + mkdir toolchainsWorkdir def currToolchainPath = "$toolchainsWorkdir/$pApiLevel-$toolchainArch/" @@ -91,7 +121,7 @@ ext.buildLibretroshareNativeLib = } } - def nativeLibsDir = "${buildDir}/native_libs-$pApiLevel/" + def nativeLibsDir = "${buildDir}/native_libs/" mkdir nativeLibsDir def currAbiLibDir = "${nativeLibsDir}/$pAbi/" @@ -115,8 +145,43 @@ ext.buildLibretroshareNativeLib = } } -apply plugin: 'com.android.library' -apply plugin: 'maven-publish' +task prepareRetroshareNativeLibs +{ + doLast + { + def pAbis = null + if(project.hasProperty('JNI_NATIVE_LIBS_ARCHS')) + { + pAbis = JNI_NATIVE_LIBS_ARCHS.split(' ') as List + } + else + { + if(ANDROID_MIN_API_LEVEL.toInteger() <= 16) + { + pAbis = ['armeabi-v7a'] + } + else + { + pAbis = ['arm64-v8a', 'armeabi-v7a'] + } + } + + def pNdkPath = android.getNdkDirectory().getAbsolutePath() + + pAbis.each + { + abi -> + buildLibretroshareNativeLib(ANDROID_MIN_API_LEVEL, abi, pNdkPath) + } + } +} +build.dependsOn prepareRetroshareNativeLibs + +ext.getArtifactBaseName = +{ + config -> + return project.name + "-MinApiLevel" + ANDROID_MIN_API_LEVEL +} android { @@ -127,11 +192,16 @@ android defaultConfig { + minSdkVersion ANDROID_MIN_API_LEVEL + targetSdkVersion 28 + /* Prevent proguard run at applications build time, to alter * libretroshare Java classes that are used by libretroshare C++ code */ consumerProguardFiles 'misc/Android/proguard-keep-libretroshare-java-classes.pro' } + setProperty("archivesBaseName", getArtifactBaseName(defaultConfig)) + sourceSets { main @@ -139,22 +209,7 @@ android java.srcDirs = [ 'src/rs_android/' ] manifest.srcFile 'src/rs_android/AndroidManifest.xml' assets.srcDirs = [ "${buildDir}/libretroshare-build/android-assets/" ] - jniLibs.srcDirs = [ "${buildDir}/native_libs-16" ] - } - - minApi16 - { - jniLibs.srcDirs = [ "${buildDir}/native_libs-16" ] - } - - minApi21 - { - jniLibs.srcDirs = [ "${buildDir}/native_libs-21" ] - } - - minApi24 - { - jniLibs.srcDirs = [ "${buildDir}/native_libs-24" ] + jniLibs.srcDirs = [ "${buildDir}/native_libs/" ] } } @@ -163,48 +218,6 @@ android disable 'LongLogTag' } - flavorDimensions 'api' - - def currNdk = android.getNdkDirectory().getAbsolutePath() - - productFlavors - { - minApi16 - { - minSdkVersion '16' - targetSdkVersion '16' - - def currApi = minSdkVersion.mApiLevel - versionNameSuffix "-API_${currApi}" - - buildLibretroshareNativeLib(currApi, "armeabi-v7a", currNdk) - } - - minApi21 - { - minSdkVersion '21' - targetSdkVersion '21' - - def currApi = minSdkVersion.mApiLevel - versionNameSuffix "-API_${currApi}" - - buildLibretroshareNativeLib(currApi, "arm64-v8a", currNdk) - buildLibretroshareNativeLib(currApi, "armeabi-v7a", currNdk) - } - - minApi24 - { - minSdkVersion '24' - targetSdkVersion '28' - - def currApi = minSdkVersion.mApiLevel - versionNameSuffix "-API_${currApi}" - - buildLibretroshareNativeLib(currApi, "arm64-v8a", currNdk) - buildLibretroshareNativeLib(currApi, "armeabi-v7a", currNdk) - } - } - publishing { multipleVariants @@ -221,21 +234,37 @@ afterEvaluate // see https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/dsl/LibraryPublishing publications { - android.libraryVariants.each + debug(MavenPublication) { - variant -> - - publishing.publications.create(variant.name, MavenPublication) + groupId = 'org.retroshare.service' + artifactId "${getArtifactBaseName()}-debug" + version LIBRETROSHARE_SOURCE_VERSION + artifact bundleReleaseAar + } + release(MavenPublication) + { + groupId = 'org.retroshare.service' + artifactId "${getArtifactBaseName()}-release" + version LIBRETROSHARE_SOURCE_VERSION + artifact bundleReleaseAar + } + } + repositories + { + maven + { + url = uri("https://gitlab.com/api/v4/projects/${System.getenv('CI_PROJECT_ID')}/packages/maven") + name = "Gitlab" + credentials(HttpHeaderCredentials) { - from components.findByName(variant.name) - groupId = 'org.retroshare.service' - // -${variant.flavorName} - artifactId "${rootProject.name}-${variant.name}" - version "0.6.6" - - artifacts = [ "${buildDir}/outputs/aar/${rootProject.name}-${variant.flavorName}-${variant.buildType.name}.aar" ] + name = "Job-Token" + value = System.getenv("CI_JOB_TOKEN") + } + authentication + { + header(HttpHeaderAuthentication) } } } - } + } } diff --git a/misc/Android/Dockerfile-AAR b/misc/Android/Dockerfile-AAR new file mode 100644 index 000000000..d5341f5e6 --- /dev/null +++ b/misc/Android/Dockerfile-AAR @@ -0,0 +1,66 @@ +## To prepare an image suitable as base for Gitlab CI use +## image name must match gitlab repository name, you can play just with the tag +## the part after : +# export ANDROID_MIN_API_LEVEL=16 +# export CI_IMAGE_NAME="registry.gitlab.com/retroshare/retroshare:android_aar_base_$ANDROID_MIN_API_LEVEL" +# docker build --squash --tag "${CI_IMAGE_NAME}" --build-arg ANDROID_MIN_API_LEVEL=$ANDROID_MIN_API_LEVEL --build-arg LIBRETROSHARE_SOURCE_VERSION="$(git describe --always)" --file misc/Android/Dockerfile-AAR . + +## --squash is very important in case of GitlabCI shared runners as they are +## limited to 25GB disk size + +## To push it to gitlab CI registry you need first to login and the to push +# docker login registry.gitlab.com +# docker push ${CI_IMAGE_NAME} + +FROM ubuntu:21.10 + +ENV DEBIAN_FRONTEND=noninteractive +ENV APT_UNAT="--assume-yes --quiet" + +RUN apt-get update $APT_UNAT && apt-get upgrade --show-upgraded $APT_UNAT && \ + apt-get clean $APT_UNAT +RUN apt-get install --no-install-recommends $APT_UNAT \ + bash build-essential bzip2 cmake curl chrpath doxygen \ + git python python3 tclsh unzip wget zip + +# Dependencies to create Android pkg +RUN apt-get install --no-install-recommends $APT_UNAT \ + openjdk-11-jre openjdk-11-jdk openjdk-11-jdk-headless + +ENV ANDROID_SDK_PATH="/opt/android-sdk" +ENV ANDROID_HOME="$ANDROID_SDK_PATH" +ENV ANDROID_SDK_ROOT="$ANDROID_SDK_PATH" +ENV JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64/" + +ARG SOURCE_PATH=./ +COPY $SOURCE_PATH /libretroshare + +WORKDIR /libretroshare-build/ +RUN /libretroshare/misc/Android/prepare-toolchain-clang.sh install_android_sdk + +WORKDIR /libretroshare/ +ARG ANDROID_MIN_API_LEVEL=16 +ARG LIBRETROSHARE_SOURCE_VERSION="Dockerfile_AAR_unset" +ENV NATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/" +RUN ./gradlew build -Dorg.gradle.project.buildDir=/libretroshare-build/ \ + -PANDROID_MIN_API_LEVEL=$ANDROID_MIN_API_LEVEL \ + -PNATIVE_TOOLCHAINS_DIR=$NATIVE_TOOLCHAINS_DIR \ + -PLIBRETROSHARE_SOURCE_VERSION="$LIBRETROSHARE_SOURCE_VERSION" + +WORKDIR / + +## Save generated AAR to make life easier to newcomers that might want to use +## this just to build the libretroshare AAR +RUN mv /libretroshare-build/outputs/aar/ /libretroshare-aar/ + +## Cleanup all the rest now unneded stuff so squashing is more effective +RUN rm -rf /libretroshare-build/ + +## Clean reamining cruft inside native_toolchains +RUN rm -rf $NATIVE_TOOLCHAINS_DIR/*-build + +## Clean apt cache +RUN apt-get clean && rm -rf /var/lib/apt/lists/* + +## No need to keep sources inside the image +RUN rm -rf /libretroshare/