Unverified Commit b43c8fbb authored by Alexey Tsvetkov's avatar Alexey Tsvetkov Committed by GitHub

Prepare Android CI (#473)

* Update Gradle to 7.3.3

* Use Provider API for Android configuration

* Define docker image for Android build

* Try fixing CI

* Handle empty ANDROID_NDK_HOME
parent 7ced4361
......@@ -71,6 +71,7 @@ jobs:
distribution: 'adopt'
java-version: '11'
- uses: nttld/setup-ndk@v1
id: setup-ndk
with:
ndk-version: r21e
- uses: android-actions/setup-android@v2
......
......@@ -685,17 +685,22 @@ fun createObjcCompileTask(
)
}
fun androidHome(): File {
val envPath = System.getenv("ANDROID_SDK_ROOT")
return when {
envPath != null -> File(envPath)
hostOs == OS.MacOS -> File("${System.getProperty("user.home")}/Library/Android/sdk")
hostOs == OS.Linux -> File("${System.getProperty("user.home")}/.android")
else -> throw GradleException("unsupported $hostOs. Alternative is to define Android SDK in ANDROID_SDK_ROOT environment variable")
}
fun Project.androidHomePath(): Provider<String> {
val androidHomeFromSdkRoot: Provider<String> =
project.providers.environmentVariable("ANDROID_SDK_ROOT")
val androidHomeFromUserHome: Provider<String> =
project.providers.systemProperty("user.home")
.map { userHome ->
listOf("Library/Android/sdk", ".android/sdk", "Android/sdk")
.map { "$userHome/$it" }
.firstOrNull { File(it).exists() }
?: error("Define Android SDK via ANDROID_SDK_ROOT")
}
return androidHomeFromSdkRoot
.orElse(androidHomeFromUserHome)
}
fun androidClangFor(targetArch: Arch, version: String = "30"): String {
fun Project.androidClangFor(targetArch: Arch, version: String = "30"): Provider<String> {
val androidArch = when (targetArch) {
Arch.Arm64 -> "aarch64"
Arch.X64 -> "x86_64"
......@@ -707,35 +712,52 @@ fun androidClangFor(targetArch: Arch, version: String = "30"): String {
OS.Windows -> "windows-x86_64"
else -> throw GradleException("unsupported $hostOs")
}
val ndkHome = if (System.getenv("ANDROID_NDK_HOME").isNullOrEmpty()) {
val androidHome = androidHome()
val ndkPath = project.providers
.environmentVariable("ANDROID_NDK_HOME")
.orEmpty()
.map { ndkHomeEnv ->
ndkHomeEnv.ifEmpty {
androidHomePath().map { androidHome ->
val ndkDir1 = file("$androidHome/ndk")
val candidates1 = if (ndkDir1.exists()) ndkDir1.list() else emptyArray()
val ndkVersion =
arrayOf(*(candidates1.map { "ndk/$it" }.sortedDescending()).toTypedArray(), "ndk-bundle").find {
androidHome.resolve(it).exists()
File(androidHome).resolve(it).exists()
} ?: throw GradleException("Cannot find NDK, is it installed (Tools/SDK Manager)?")
"$androidHome/$ndkVersion"
} else {
System.getenv("ANDROID_NDK_HOME")
}
val ndkDir = File(ndkHome, "/toolchains/llvm/prebuilt/$hostOsArch")
var clang = ndkDir.resolve("bin/$androidArch-linux-android$version-clang++").absolutePath
}
}
return ndkPath.map { ndkPath ->
var clangBinaryName = "$androidArch-linux-android$version-clang++"
if (hostOs.isWindows) {
clang += ".cmd"
clangBinaryName += ".cmd"
}
"$ndkPath/toolchains/llvm/prebuilt/$hostOsArch/bin/$clangBinaryName"
}
return clang
}
fun androidJar(askedVersion: String = ""): String {
val androidHome = androidHome()
fun Provider<String>.orEmpty(): Provider<String> =
orElse("")
fun Project.androidJar(askedVersion: String = ""): Provider<File> =
androidHomePath().map { androidHomePath ->
val androidHome = File(androidHomePath)
val version = if (askedVersion.isEmpty()) {
File(androidHome, "platforms").list().sortedArrayDescending().first()
val platformsDir = androidHome.resolve("platforms")
val versions = platformsDir.list().orEmpty()
versions.maxByOrNull { name ->
name.removePrefix("android-").toInt()
} ?: error(
buildString {
appendLine("'$platformsDir' does not contain any directories matching expected 'android-NUMBER' format: ${versions}")
}
)
} else {
"android-$askedVersion"
}
return androidHome.resolve("platforms/$version/android.jar").absolutePath
}
androidHome.resolve("platforms/$version/android.jar")
}
fun createCompileJvmBindingsTask(
targetOs: OS,
......
FROM ubuntu:focal
SHELL ["/bin/bash", "-c", "-l"]
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update -y && \
apt-get install binutils build-essential software-properties-common -y && \
apt-get install git curl wget unzip -y && \
apt-get install python -y && \
apt-get install openjdk-11-jdk -y && \
rm -rf /var/lib/apt/lists/*
ENV ANDROID_SDK_ROOT=/android/sdk
ARG CMD_TOOLS_VERSION=6858069
ARG CMD_TOOLS_ROOT=$ANDROID_SDK_ROOT/cmdline-tools/$CMD_TOOLS_VERSION
ARG SDK_MANAGER=$CMD_TOOLS_ROOT/bin/sdkmanager
RUN mkdir -p $CMD_TOOLS_ROOT && \
export CMD_TOOLS_URL="https://dl.google.com/android/repository/commandlinetools-linux-${CMD_TOOLS_VERSION}_latest.zip" && \
wget $CMD_TOOLS_URL -O cmd-tools.zip && \
unzip cmd-tools.zip && \
rm cmd-tools.zip && \
mv cmdline-tools/* $CMD_TOOLS_ROOT/
ARG ANDROID_PLATFORM=android-28
RUN yes | $SDK_MANAGER --licenses && \
$SDK_MANAGER "platforms;$ANDROID_PLATFORM" && \
cd $ANDROID_SDK_ROOT/platforms/$ANDROID_PLATFORM && \
ls -1 | grep -v android.jar | xargs rm -rf
ARG NDK_VERSION=21.4.7075529
RUN $SDK_MANAGER "ndk;$NDK_VERSION" && \
cd $ANDROID_SDK_ROOT/ndk/$NDK_VERSION && \
ls -1 | grep -v toolchains | xargs rm -rf
ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
ENV JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF
\ No newline at end of file
CD=$(dirname "$0")
IMAGE_NAME=$(sh $CD/image-name.sh)
docker build -t $IMAGE_NAME $CD
\ No newline at end of file
echo skiko-build-android-ubuntu-2004-amd64:latest
\ No newline at end of file
CD=$(dirname "$0")
IMAGE_NAME=$(sh $CD/image-name.sh)
SKIKO_ROOT_LOCAL=$(cd $CD/../.. && pwd)
docker run \
--cpus 2 \
--memory 4g \
--tty --interactive \
--volume $SKIKO_ROOT_LOCAL:/skiko \
--workdir /skiko \
$IMAGE_NAME \
bash
\ No newline at end of file
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment